2017-12-22 23 views
0

golangのnet/httpパッケージは、チャンク転送コードでリクエストをサポートしていますか?これまでのところ、私はHijackerインターフェイス(https://golang.org/src/net/http/server.go?s=6173:6875#L156)を使用して、少なくとも接続を閉じずに完全なチャンクリクエストを受け取ることができましたが、まだチャンクを解析していないので、間違ったパスをこの場所で使用している可能性があります。チャンク転送コード付きの処理要求

https://golang.org/src/net/http/httputil/httputil.go?s=688:732#L10から、私はチャンクリーダーがあることを知っていますが、内部で使用されているようです。

本質的に、私は「チャンク」転送エンコーディングでHTTP PUTを受け取り、それをバックエンドサーバーにオンザフライで送信しようとしています(つまり、golangで完全な要求をバッファしないで)。私は上流の要求を制御できません。そのような要求を処理するための推奨された方法はありますか、それともHijackerのやり方ですか?

答えて

3

net/httpクライアントとサーバーは、チャンクボディを透過的に読み書きします。

チャンクされた要求を受け入れて別のHTTPサーバーに送信するには、サーバー要求本体をクライアント要求本体として渡します。ここでPUTなどの別のサーバーに体を転送するために、今だ:

func handler(w http.ResponseWriter, r *http.Request) { 
    creq, err := http.NewRequest("PUT", url, r.Body) 
    if err != nil { 
     // handle error 
    } 
    if ct := r.Header.Get("Content-Type"); ct != "" { 
     creq.Header.Set("Content-Type", ct) 
    } 
    cresp, err := http.DefaultClient.Do(creq) 
    if err != nil { 
     // handle error 
    } 
    ... do something with cresp. 
} 

ファイルにコピーしたい場合は、io.Copyファイルへのリクエストボディ。

func handler(w http.ResponseWriter, r *http.Request) { 
    f, err := os.Create("fname") 
    if err != nil { 
     // handle error 
    } 
    _, err := io.Copy(f, r.Body) 
    if err != nil { 
      // handle error 
    } 
    ... 
    } 

これらのスニペットは、オンザフライでボディをコピーします。

+0

ああ、これははるかに簡単です - ありがとう!最初はファイルに書きたいだけでしたか? –

関連する問題