NAS: Run HTTP header filters in a detached goroutine

This commit is contained in:
Palapeli
2026-04-07 08:12:28 -04:00
parent c002bb81a6
commit 63204868eb

View File

@@ -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) {