diff --git a/internal/protocols/httpp/content_type.go b/internal/protocols/httpp/content_type.go new file mode 100644 index 00000000..002ce0dc --- /dev/null +++ b/internal/protocols/httpp/content_type.go @@ -0,0 +1,8 @@ +package httpp + +import "strings" + +// ParseContentType parses a Content-Type header and returns the content type. +func ParseContentType(v string) string { + return strings.TrimSpace(strings.Split(v, ";")[0]) +} diff --git a/internal/protocols/webrtc/whip_client.go b/internal/protocols/webrtc/whip_client.go index 9c9e6a64..95f35769 100644 --- a/internal/protocols/webrtc/whip_client.go +++ b/internal/protocols/webrtc/whip_client.go @@ -7,7 +7,6 @@ import ( "io" "net/http" "net/url" - "strings" "time" "github.com/bluenviron/gortsplib/v4/pkg/format" @@ -15,6 +14,7 @@ import ( "github.com/pion/webrtc/v3" "github.com/bluenviron/mediamtx/internal/logger" + "github.com/bluenviron/mediamtx/internal/protocols/httpp" ) // WHIPClient is a WHIP client. @@ -286,8 +286,8 @@ func (c *WHIPClient) postOffer( return nil, fmt.Errorf("bad status code: %v", res.StatusCode) } - contentType := res.Header.Get("Content-Type") - if strings.TrimSpace(strings.Split(contentType, ";")[0]) != "application/sdp" { + contentType := httpp.ParseContentType(req.Header.Get("Content-Type")) + if contentType != "application/sdp" { return nil, fmt.Errorf("bad Content-Type: expected 'application/sdp', got '%s'", contentType) } diff --git a/internal/servers/webrtc/http_server.go b/internal/servers/webrtc/http_server.go index 1824801a..fe9b1462 100644 --- a/internal/servers/webrtc/http_server.go +++ b/internal/servers/webrtc/http_server.go @@ -165,7 +165,8 @@ func (s *httpServer) onWHIPOptions(ctx *gin.Context, pathName string, publish bo } func (s *httpServer) onWHIPPost(ctx *gin.Context, pathName string, publish bool) { - if ctx.Request.Header.Get("Content-Type") != "application/sdp" { + contentType := httpp.ParseContentType(ctx.Request.Header.Get("Content-Type")) + if contentType != "application/sdp" { writeError(ctx, http.StatusBadRequest, fmt.Errorf("invalid Content-Type")) return } @@ -215,7 +216,8 @@ func (s *httpServer) onWHIPPatch(ctx *gin.Context, pathName string, rawSecret st return } - if ctx.Request.Header.Get("Content-Type") != "application/trickle-ice-sdpfrag" { + contentType := httpp.ParseContentType(ctx.Request.Header.Get("Content-Type")) + if contentType != "application/trickle-ice-sdpfrag" { writeError(ctx, http.StatusBadRequest, fmt.Errorf("invalid Content-Type")) return }