1

Go http サーバーでは、POST リクエストの本文を取得できます。Go net/http パッケージは GET リクエストの本文を削除しているようです。リクエスト本文でhttp GETを使用しない方がよいことはわかっていますが、リクエスト本文で http GET を処理する必要があります。標準ライブラリを変更せずに可能ですか?libevent で C に戻りたくないので、助けてください!

クライアントがリクエスト本文を含む POST を送信すると、以下のコードは本文の内容を表示します。しかし、クライアントがリクエスト本文を含む GET を送信すると、本文には何もありません。

func handler(w http.ResponseWriter, r *http.Request) {
    defer r.Body.Close()
    body, _ := ioutil.ReadAll(r.Body)

    log.Printf("body: %v", string(body))
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}
4

1 に答える 1

3

魔法のほとんどは で発生しtransfer.goます。fixLengthfuncに関連しているように見えることがわかったのは次のとおりです。

if !isResponse && requestMethod == "GET" {
    // RFC 2616 doesn't explicitly permit nor forbid an
    // entity-body on a GET request so we permit one if
    // declared, but we default to 0 here (not -1 below)
    // if there's no mention of a body.
    return 0, nil
}

Content-Lengthクライアントがヘッダーを終了している限り、問題ないようです。そうでない場合、ライブラリはリクエストに本文がないと想定しGETます。

クライアントがかなり変わった/壊れたことをしているので、あなたは地図の端から少し外れています. クライアントを修正できる場合は、それが最善の策です。

とはいえ、これを間違ってサポートする必要があるクライアントがいる場合は、自分でいくつかのことをロールバックする必要があります。C や libevent にまで至る必要はありません。net/http パッケージを標準ライブラリからプロジェクトにコピーして変更するだけです。次に、ライブラリのバージョンを指すように import ステートメントを変更します。

または、クライアントがキープアライブを使用していないことがわかっている場合はHijack、接続して、ソケットに残っているものをすべて読み取ることができます。

于 2013-07-16T21:27:19.143 に答える