mcp: accept parameterized Accept media types (#853)
Normalize accept tokens before validation so valid headers with media type parameters still match their base media types. This allows the streamable mcp server to validate the following header `Accept: application/json;charset=utf-8, text/event-stream` Co-authored-by: Maciej Kisiel <mkisiel@google.com>
This commit is contained in:
parent
a1f808c86e
commit
c1a12cfeda
1 changed files with 74 additions and 15 deletions
|
|
@ -274,19 +274,7 @@ func (h *StreamableHTTPHandler) ServeHTTP(w http.ResponseWriter, req *http.Reque
|
|||
|
||||
// Allow multiple 'Accept' headers.
|
||||
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Accept#syntax
|
||||
accept := strings.Split(strings.Join(req.Header.Values("Accept"), ","), ",")
|
||||
var jsonOK, streamOK bool
|
||||
for _, c := range accept {
|
||||
switch strings.TrimSpace(c) {
|
||||
case "application/json", "application/*":
|
||||
jsonOK = true
|
||||
case "text/event-stream", "text/*":
|
||||
streamOK = true
|
||||
case "*/*":
|
||||
jsonOK = true
|
||||
streamOK = true
|
||||
}
|
||||
}
|
||||
jsonOK, streamOK := streamableAccepts(req.Header.Values("Accept"))
|
||||
|
||||
if req.Method == http.MethodGet {
|
||||
if !streamOK {
|
||||
|
|
@ -551,6 +539,26 @@ func (h *StreamableHTTPHandler) ServeHTTP(w http.ResponseWriter, req *http.Reque
|
|||
sessInfo.transport.ServeHTTP(w, req)
|
||||
}
|
||||
|
||||
func streamableAccepts(values []string) (jsonOK, streamOK bool) {
|
||||
for _, value := range values {
|
||||
for _, raw := range strings.Split(value, ",") {
|
||||
token := strings.TrimSpace(raw)
|
||||
// Ignore Accept parameters like ";charset=utf-8"; match the base media type.
|
||||
base, _, _ := strings.Cut(token, ";")
|
||||
switch strings.ToLower(strings.TrimSpace(base)) {
|
||||
case "application/json", "application/*":
|
||||
jsonOK = true
|
||||
case "text/event-stream", "text/*":
|
||||
streamOK = true
|
||||
case "*/*":
|
||||
jsonOK = true
|
||||
streamOK = true
|
||||
}
|
||||
}
|
||||
}
|
||||
return jsonOK, streamOK
|
||||
}
|
||||
|
||||
// A StreamableServerTransport implements the server side of the MCP streamable
|
||||
// transport.
|
||||
//
|
||||
|
|
|
|||
Loading…
Reference in a new issue