47909


GoでHTTP Requestを投げてResponseを受け取る時、
ResponseBodyが巨大(1GB以上等)である場合を考えてstreamingしながらレスポンスを受け取りたいです。

[code]

    req, err := http.Client.Do(res)
    
[/code]

このままだとbodyが巨大な場合、Headerも読めずResponseの状態がわかりません。  
何か解決法はあるでしょうか


CC BY-SA 4.0
2018-08-29T02:29:12.783
47900
2018-08-30T05:43:49.110
2018-08-29T02:53:36.340
29903
29903
question
go http
Golangで"net/http"を使って、HTTP Responseをstreamingで受け取る方法


> このままだとbodyが巨大な場合、Headerも読めずResponseの状態がわかりません。

レスポンス全てをストリーミングしなくても、レスポンスの中身が読めるようになれば問題解決につながると考えて回答します。

単純にレスポンスを出力するだけであれば `httputil.DumpResponse` が利用できます。

<https://golang.org/pkg/net/http/httputil/#DumpResponse>

[code]

    // 注意: エラー処理は簡略化してます
    req, _ := http.NewRequest("GET", "https://example.com/", nil)
    resp, _ := (&http.Client{}).Do(req)
    defer resp.Body.Close()
    
    dump, _ := httputil.DumpResponse(resp, false)
    
    fmt.Printf("%q\n", dump)
    
[/code]

* * *

一応 `io.TeeReader(resp.Body, os.Stderr)` みたいな方法で中身を別途 stderr 等に吐き出して [pipe
viewer](http://www.ivarch.com/programs/pv.shtml)
コマンドで進行状況を見るなどすれば、ストリーミングに似たやり方はできます。ただ、コレを Go
だけで実装しようとすると結構大変な作業になりそうなので割愛します。


CC BY-SA 4.0
2018-08-29T08:52:17.753
47909
2018-08-29T08:52:17.753
2391
47900
answer


レスポンスが `Transfer-Encoding: chunked`
である場合の話になってしまいますが、[このサイト](http://baubaubau.hatenablog.com/entry/2017/11/19/133212)
のようにチャンクごとに自力で読み込めば、そこでなにかしら必要な処理を入れることができるかと思います。


CC BY-SA 4.0
2018-08-30T05:43:49.110
47932
2018-08-30T05:43:49.110
19759
47900
answer