3

I'm trying to use resp, err := http.Get(url) command to write the response to file as well as use the same response to extract links.

After I write the content to a file using resp.Write(f), I cannot use resp.Body for another purpose (for the response from the above url) without making another http.Get request.

I tried resp2 := bytes.NewBuffer(resp). It gives eror as type does not match. I've tried copy as well.

L.fole
  • 687
  • 3
  • 12
  • 19
  • Can you share the code? – Endre Simo Jan 26 '16 at 13:52
  • You can't read the response body once you've already drained it. Have you tried using [ReadResponse](https://golang.org/pkg/net/http/#ReadResponse) on the buffered response? – JimB Jan 26 '16 at 13:55
  • [code here](https://play.golang.org/p/Aj8KKfQGfD) This produces new file with header info and no body on `resp.write(f)`. BTW, thanks @JimB on earlier question. Can you provide example on ReadResponse. – L.fole Jan 26 '16 at 14:11

2 Answers2

5

Assuming the response fits in memory, just create a buffer and use resp.Write, like (untested, basically correct):

var b bytes.Buffer
if err := resp.Write(b); err != nil {
   // handle error
} else {
    // Do something with buffer
}

for code that works with any reader, use: ioutil.ReadAll, which returns a new []byte containing the data that you can then wrap in a bytes.Buffer

David Budworth
  • 11,248
  • 1
  • 36
  • 45
  • 1
    You might want to pass a reference to the buffer, like `resp.Write(&b)`, to avoid a `Cannot use 'b' (type bytes.Buffer) as type io.Writer` error. – amiabl Jun 16 '20 at 12:44
3

httputil has a response dump. https://golang.org/pkg/net/http/httputil/#DumpRequest It will replace the body with an in-memory copy so you can reuse it.

slcjordan
  • 96
  • 3