diff --git a/proxy/http/server.go b/proxy/http/server.go index 9f2b6839d..50e7fdd8d 100755 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -104,7 +104,9 @@ func (s *Server) Process(ctx context.Context, network net.Network, conn internet reader := bufio.NewReaderSize(readerOnly{conn}, buf.Size) Start: - conn.SetReadDeadline(time.Now().Add(s.policy().Timeouts.Handshake)) + if err := conn.SetReadDeadline(time.Now().Add(s.policy().Timeouts.Handshake)); err != nil { + newError("failed to set read deadline").Base(err).WithContext(ctx).WriteToLog() + } request, err := http.ReadRequest(reader) if err != nil { @@ -123,7 +125,9 @@ Start: } newError("request to Method [", request.Method, "] Host [", request.Host, "] with URL [", request.URL, "]").WithContext(ctx).WriteToLog() - conn.SetReadDeadline(time.Time{}) + if err := conn.SetReadDeadline(time.Time{}); err != nil { + newError("failed to clear read deadline").Base(err).WithContext(ctx).WriteToLog() + } defaultPort := net.Port(80) if strings.ToLower(request.URL.Scheme) == "https" { @@ -248,10 +252,11 @@ func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, wri return err } + // Plain HTTP request is not a stream. The request always finishes before response. Hense request has to be closed later. + defer common.Close(link.Writer) var result error = errWaitAnother requestDone := func() error { - defer common.Close(link.Writer) request.Header.Set("Connection", "close") requestWriter := buf.NewBufferedWriter(link.Writer)