1
0

[Go]httpサーバーを起動して、リクエストがキャンセルされる様子を確認する

Posted at

サーバーの準備

main.go
package main

import (
	"log"
	"net/http"
	"time"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		ctx := r.Context()

		// 擬似的な長い処理を実行
		log.Println("processing request")
		select {
		case <-time.After(5 * time.Second): // 5秒後に処理が完了するとする
			// リクエストが成功したらレスポンスを返す
			w.Write([]byte("Request processed"))
		case <-ctx.Done():
			// contextがキャンセルされたらエラーをログに出力
			err := ctx.Err()
			log.Println("request cancelled:", err)
			http.Error(w, err.Error(), http.StatusInternalServerError)
		}
	})

	// サーバーを8080ポートで起動
	log.Println("server started")
	http.ListenAndServe(":8080", nil)
}

httpサーバーを起動させます。

Server side
$ go run main.go 
2023/11/05 22:49:46 server started

リクエストを送信する

キャンセルされるリクエストの送信
curlでサーバーで指定されているポート番号8080に対してリクエストを送り、1秒後にキャンセルするコマンドを打ちます。

Client side
$ curl http://localhost:8080 & PID=$!; sleep 1; kill $PID
[1] 91299
[1]  + terminated  curl http://localhost:8080 

そうすると、以下のようにキャンセルされることがわかりました。

Server side
2023/11/05 22:53:37 processing request
2023/11/05 22:53:38 request cancelled: context canceled

キャンセルされないリクエストの送信
ちなみに、クライアントサイドで5秒より多く待つことで、サーバー側でキャンセルされないことも確認できます。

Client side
$ curl http://localhost:8080 & PID=$!; sleep 6           
[1] 91373
Request processed[1]  + done       curl http://localhost:8080

おまけ curlの解説

curl http://localhost:8080 & PID=$!; sleep 1; kill $PID

このコマンドは、curlを用いてhttp://localhost:8080にHTTPリクエストを送信し、1秒後にそのプロセスを終了(kill)させます。

  1. curl http://localhost:8080 &:

    • curlで、指定されたURL(この場合はhttp://localhost:8080)に対してHTTPリクエストを送信します。
    • &はこのコマンドをバックグラウンドで実行するためのものです。つまり、curlコマンドは新しいバックグラウンドプロセスとして開始されます。
  2. PID=$!:

    • $!は最後にバックグラウンドで実行されたプロセスのプロセスID(PID)を表します。
    • PID=$!はこのPIDを変数PIDに代入しています。これにより、後でこのプロセスを特定し終了させることができます。
  3. sleep 1:

    • sleep 1は、コマンドが1秒間待機するようにします。これはcurlコマンドに少し時間を与えてサーバーにリクエストを送信するためのものです。
  4. kill $PID:

    • killコマンドは指定されたPIDのプロセスを終了します。
    • kill $PIDは、先ほどcurlコマンドによって生成されたバックグラウンドプロセスを終了させます。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0