読者です 読者をやめる 読者になる 読者になる

uokadaの見逃し三振は嫌いです

ここで述べられていることは私の個人的な意見に基づくものであり、私が所属する組織には一切の関係はありません。

既存の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使ったデバッグで動作確認しようと思うがとりあえずの入り口としてはこんな感じかなと思います。

github.com

正規表現と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

これにiptablesと合わせてやればまぁこんな感じでデバッグを出来るというところです。