(writeHeader func(key string, values ...string) error)
| 247 | } |
| 248 | |
| 249 | func (t *transferWriter) writeHeader(writeHeader func(key string, values ...string) error) error { |
| 250 | if t.Close && !hasToken(headerGet(t.Header, "Connection"), "close") { |
| 251 | err := writeHeader("Connection", "close") |
| 252 | if err != nil { |
| 253 | return err |
| 254 | } |
| 255 | } |
| 256 | |
| 257 | // Write Content-Length and/or Transfer-Encoding whose values are a |
| 258 | // function of the sanitized field triple (Body, ContentLength, |
| 259 | // TransferEncoding) |
| 260 | if t.shouldSendContentLength() { |
| 261 | err := writeHeader("Content-Length", strconv.FormatInt(t.ContentLength, 10)) |
| 262 | if err != nil { |
| 263 | return err |
| 264 | } |
| 265 | } else if chunked(t.TransferEncoding) { |
| 266 | err := writeHeader("Transfer-Encoding", "chunked") |
| 267 | if err != nil { |
| 268 | return err |
| 269 | } |
| 270 | } |
| 271 | |
| 272 | // Write Trailer header |
| 273 | if t.Trailer != nil { |
| 274 | keys := make([]string, 0, len(t.Trailer)) |
| 275 | for k := range t.Trailer { |
| 276 | k = http.CanonicalHeaderKey(k) |
| 277 | switch k { |
| 278 | case "Transfer-Encoding", "Trailer", "Content-Length": |
| 279 | return badStringError("invalid Trailer key", k) |
| 280 | } |
| 281 | keys = append(keys, k) |
| 282 | } |
| 283 | if len(keys) > 0 { |
| 284 | slices.Sort(keys) |
| 285 | // TODO: could do better allocation-wise here, but trailers are rare, |
| 286 | // so being lazy for now. |
| 287 | err := writeHeader("Trailer", strings.Join(keys, ",")) |
| 288 | if err != nil { |
| 289 | return err |
| 290 | } |
| 291 | } |
| 292 | } |
| 293 | |
| 294 | return nil |
| 295 | } |
| 296 | |
| 297 | // always closes t.BodyCloser |
| 298 | func (t *transferWriter) writeBody(w io.Writer, dumps []*dump.Dumper) (err error) { |
no test coverage detected