(resp *http.Response, sink *responseSink)
| 216 | } |
| 217 | |
| 218 | func streamResponseToSink(resp *http.Response, sink *responseSink) error { |
| 219 | if err := sink.start(resp.StatusCode, statusText(resp), cloneHeader(resp.Header)); err != nil { |
| 220 | return err |
| 221 | } |
| 222 | buf := make([]byte, 32*1024) |
| 223 | for { |
| 224 | n, readErr := resp.Body.Read(buf) |
| 225 | if n > 0 { |
| 226 | // writeText copies eagerly via string(...), so the reused read |
| 227 | // buffer can be passed directly without an extra per-chunk alloc. |
| 228 | if err := sink.writeText(buf[:n]); err != nil { |
| 229 | return err |
| 230 | } |
| 231 | } |
| 232 | if readErr == io.EOF { |
| 233 | break |
| 234 | } |
| 235 | if readErr != nil { |
| 236 | return sink.sinkError(readErr.Error(), "") |
| 237 | } |
| 238 | } |
| 239 | return sink.end() |
| 240 | } |
| 241 | |
| 242 | func statusText(resp *http.Response) string { |
| 243 | return strings.TrimSpace(strings.TrimPrefix(resp.Status, strconv.Itoa(resp.StatusCode))) |
no test coverage detected
searching dependent graphs…