Darien Raymond 8 роки тому
батько
коміт
aefa53f827
1 змінених файлів з 29 додано та 30 видалено
  1. 29 30
      transport/internet/headers/http/http.go

+ 29 - 30
transport/internet/headers/http/http.go

@@ -109,15 +109,15 @@ type HttpConn struct {
 	readBuffer    *buf.Buffer
 	oneTimeReader Reader
 	oneTimeWriter Writer
-	isServer      bool
+	errorWriter   Writer
 }
 
-func NewHttpConn(conn net.Conn, reader Reader, writer Writer, isServer bool) *HttpConn {
+func NewHttpConn(conn net.Conn, reader Reader, writer Writer, errorWriter Writer) *HttpConn {
 	return &HttpConn{
 		Conn:          conn,
 		oneTimeReader: reader,
 		oneTimeWriter: writer,
-		isServer:      isServer,
+		errorWriter:   errorWriter,
 	}
 }
 
@@ -157,33 +157,10 @@ func (v *HttpConn) Write(b []byte) (int, error) {
 
 // Close implements net.Conn.Close().
 func (v *HttpConn) Close() error {
-	if v.isServer && v.oneTimeWriter != nil {
+	if v.oneTimeWriter != nil && v.errorWriter != nil {
 		// Connection is being closed but header wasn't sent. This means the client request
 		// is probably not valid. Sending back a server error header in this case.
-		writer := formResponseHeader(&ResponseConfig{
-			Version: &Version{
-				Value: "1.1",
-			},
-			Status: &Status{
-				Code:   "500",
-				Reason: "Internal Server Error",
-			},
-			Header: []*Header{
-				{
-					Name:  "Connection",
-					Value: []string{"close"},
-				},
-				{
-					Name:  "Cache-Control",
-					Value: []string{"private"},
-				},
-				{
-					Name:  "Content-Length",
-					Value: []string{"0"},
-				},
-			},
-		})
-		writer.Write(v.Conn)
+		v.errorWriter.Write(v.Conn)
 	}
 
 	return v.Conn.Close()
@@ -248,14 +225,36 @@ func (v HttpAuthenticator) Client(conn net.Conn) net.Conn {
 	if v.config.Response != nil {
 		writer = v.GetClientWriter()
 	}
-	return NewHttpConn(conn, reader, writer, false)
+	return NewHttpConn(conn, reader, writer, new(NoOpWriter))
 }
 
 func (v HttpAuthenticator) Server(conn net.Conn) net.Conn {
 	if v.config.Request == nil && v.config.Response == nil {
 		return conn
 	}
-	return NewHttpConn(conn, new(HeaderReader), v.GetServerWriter(), true)
+	return NewHttpConn(conn, new(HeaderReader), v.GetServerWriter(), formResponseHeader(&ResponseConfig{
+		Version: &Version{
+			Value: "1.1",
+		},
+		Status: &Status{
+			Code:   "500",
+			Reason: "Internal Server Error",
+		},
+		Header: []*Header{
+			{
+				Name:  "Connection",
+				Value: []string{"close"},
+			},
+			{
+				Name:  "Cache-Control",
+				Value: []string{"private"},
+			},
+			{
+				Name:  "Content-Length",
+				Value: []string{"0"},
+			},
+		},
+	}))
 }
 
 type HttpAuthenticatorFactory struct{}