Skip to content

Commit 4fa87de

Browse files
sevicosuzp1984
authored andcommitted
Proxy: Fix HLS proxy response header loss and m3u8 URL query parameter corruption
1. Move WriteHeader() after setting response headers. In Go's http.ResponseWriter, headers set after WriteHeader() are silently ignored, which caused all backend response headers (Content-Type, Cache-Control, etc.) to be lost during HLS proxying. 2. Fix double ampersand (&&) in m3u8 ts URL rewriting. When the original ts URL already contains query parameters, the proxy generated malformed URLs like ".ts?spbhid=xxx&&token=abc" instead of ".ts?spbhid=xxx&token=abc".
1 parent 913b773 commit 4fa87de

1 file changed

Lines changed: 7 additions & 5 deletions

File tree

internal/proxy/http.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -347,13 +347,14 @@ func (v *httpFlvTsConnection) serveByBackend(ctx context.Context, w http.Respons
347347
return errors.Errorf("proxy stream to %v failed, status=%v", backendURL, resp.Status)
348348
}
349349

350-
// Copy all headers from backend to client.
351-
w.WriteHeader(resp.StatusCode)
350+
// Copy all headers from backend to client before WriteHeader,
351+
// because headers set after WriteHeader are silently ignored.
352352
for k, v := range resp.Header {
353353
for _, vv := range v {
354354
w.Header().Add(k, vv)
355355
}
356356
}
357+
w.WriteHeader(resp.StatusCode)
357358

358359
logger.Debug(ctx, "HTTP start streaming")
359360

@@ -476,13 +477,14 @@ func (v *hlsPlayStream) serveByBackend(ctx context.Context, w http.ResponseWrite
476477
return errors.Errorf("proxy stream to %v failed, status=%v", backendURL, resp.Status)
477478
}
478479

479-
// Copy all headers from backend to client.
480-
w.WriteHeader(resp.StatusCode)
480+
// Copy all headers from backend to client before WriteHeader,
481+
// because headers set after WriteHeader are silently ignored.
481482
for k, v := range resp.Header {
482483
for _, vv := range v {
483484
w.Header().Add(k, vv)
484485
}
485486
}
487+
w.WriteHeader(resp.StatusCode)
486488

487489
// For TS file, directly copy it.
488490
if !strings.HasSuffix(r.URL.Path, ".m3u8") {
@@ -502,7 +504,7 @@ func (v *hlsPlayStream) serveByBackend(ctx context.Context, w http.ResponseWrite
502504

503505
m3u8 := string(b)
504506
if strings.Contains(m3u8, ".ts?") {
505-
m3u8 = strings.ReplaceAll(m3u8, ".ts?", fmt.Sprintf(".ts?spbhid=%v&&", v.SRSProxyBackendHLSID))
507+
m3u8 = strings.ReplaceAll(m3u8, ".ts?", fmt.Sprintf(".ts?spbhid=%v&", v.SRSProxyBackendHLSID))
506508
} else {
507509
m3u8 = strings.ReplaceAll(m3u8, ".ts", fmt.Sprintf(".ts?spbhid=%v", v.SRSProxyBackendHLSID))
508510
}

0 commit comments

Comments
 (0)