Handled chunked responses when content-length is given.
(ctx context.Context, finalResp *[]byte, clientConn, destConn net.Conn, contentLength int)
| 385 | |
| 386 | // Handled chunked responses when content-length is given. |
| 387 | func (h *HTTP) contentLengthResponse(ctx context.Context, finalResp *[]byte, clientConn, destConn net.Conn, contentLength int) error { |
| 388 | isEOF := false |
| 389 | for contentLength > 0 { |
| 390 | resp, err := pUtil.ReadBytes(ctx, h.Logger, destConn) |
| 391 | if err != nil { |
| 392 | if err == io.EOF { |
| 393 | isEOF = true |
| 394 | h.Logger.Debug("received EOF, conn closed by the destination server") |
| 395 | if len(resp) == 0 { |
| 396 | break |
| 397 | } |
| 398 | } else if netErr, ok := err.(net.Error); ok && netErr.Timeout() { |
| 399 | h.Logger.Info("Stopped getting data from the conn", zap.Error(err)) |
| 400 | break |
| 401 | } else { |
| 402 | utils.LogError(h.Logger, nil, "failed to read the response message from the destination server") |
| 403 | return err |
| 404 | } |
| 405 | } |
| 406 | |
| 407 | h.Logger.Debug("This is a chunk of response[content-length]: " + string(resp)) |
| 408 | *finalResp = append(*finalResp, resp...) |
| 409 | contentLength -= len(resp) |
| 410 | |
| 411 | // write the response message to the user client |
| 412 | _, err = clientConn.Write(resp) |
| 413 | if err != nil { |
| 414 | if ctx.Err() != nil { |
| 415 | return ctx.Err() |
| 416 | } |
| 417 | utils.LogError(h.Logger, nil, "failed to write response message to the user client") |
| 418 | return err |
| 419 | } |
| 420 | |
| 421 | if isEOF { |
| 422 | break |
| 423 | } |
| 424 | } |
| 425 | return nil |
| 426 | } |