既存のWebサーバーをGoで実装し直すためにやってること
とあるWebサーバーが機能不足でちょっと使いづらいため、Goで実装し直そうとしている。
とりあえず、エントリーポイントが分かってるのでそこにどんなリクエストが飛んでいるかをダンプするところから始めている。
それで書いたコードがこれ。
httputilパッケージにDumpXXXってメソッドが生えているのでそれを使ってリクエストのダンプするサーバーの簡単なサンプルがこちら。
httputil - The Go Programming Language
package main import ( "fmt" "net/http" "net/http/httputil" ) func debugFunc(w http.ResponseWriter, r *http.Request, ) { dump, _ := httputil.DumpRequest(r, true) fmt.Fprintln(w, string(dump)) return } func main(){ mux := http.NewServeMux() mux.HandleFunc("/info", debugFunc) http.ListenAndServe(":8080", mux) }
内部処理はIDE使ったデバッグで動作確認しようと思うがとりあえずの入り口としてはこんな感じかなと思います。
正規表現とgorilla/muxを使ってHandlerを定義すればすべてのリクエストにマッチさせることも出来る。
package main import ( "fmt" "net/http" "net/http/httputil" "github.com/gorilla/mux" ) func debugFunc(w http.ResponseWriter, r *http.Request, ) { dump, _ := httputil.DumpRequest(r, true) fmt.Fprintln(w, string(dump)) return } func main(){ m := mux.NewRouter() m.HandleFunc("/{ep:[a-z/0-9]+}", debugFunc) http.ListenAndServe(":8080", m) }
ちなみに、curlでリクエストを投げた時のレスポンスがこんな感じ。
$ curl -X GET -d foo=bar localhost:8080/v1/debug GET /v1/debug HTTP/1.1 Host: localhost:8080 Accept: */* Content-Length: 7 Content-Type: application/x-www-form-urlencoded User-Agent: curl/7.51.0 foo=bar