diff --git a/nas/listener.go b/nas/listener.go index 15c4c80..dd08acc 100644 --- a/nas/listener.go +++ b/nas/listener.go @@ -29,9 +29,16 @@ func (l *nasListener) Accept() (net.Conn, error) { return nil, err } + pr, pw := io.Pipe() + go func() { + r := bufio.NewReader(conn) + filterDuplicateHost(r, pw) + _, err := io.Copy(pw, r) + _ = pw.CloseWithError(err) + }() return &nasConn{ Conn: conn, - reader: filterDuplicateHost(conn), + reader: pr, }, nil } @@ -41,17 +48,17 @@ func (c *nasConn) Read(b []byte) (int, error) { // filterDuplicateHost wraps a net.Conn and filters out duplicate Host headers from the HTTP request, // making the invalid requests sent by DWC acceptable to the standard library's HTTP server. -func filterDuplicateHost(c net.Conn) io.Reader { - r := bufio.NewReader(c) - +func filterDuplicateHost(r *bufio.Reader, p *io.PipeWriter) { // Read the first line of the HTTP request line, err := r.ReadString('\n') if err != nil { - return io.MultiReader(strings.NewReader(line), r) + _, _ = p.Write([]byte(line)) + return } // Is this an HTTP request? if !strings.HasSuffix(line, "HTTP/1.1\r\n") { - return io.MultiReader(strings.NewReader(line), r) + _, _ = p.Write([]byte(line)) + return } // Iterate through the HTTP headers and remove any duplicate Host headers @@ -72,7 +79,7 @@ func filterDuplicateHost(c net.Conn) io.Reader { headers.WriteString(headerLine) } - return io.MultiReader(strings.NewReader(line+headers.String()), r) + _, _ = p.Write([]byte(line + headers.String())) } func listenAndServe(address string) {