Skip to content

Commit 4559336

Browse files
authored
Merge pull request #616 from koic/ignore_empty_members_of_the_accept_header
Ignore empty members of the Accept header
2 parents 06d5372 + 6b08edd commit 4559336

2 files changed

Lines changed: 44 additions & 3 deletions

File tree

‎lib/mcp/server/transports/streamable_http_transport.rb‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1881,10 +1881,10 @@ def validate_accept_header(request, required_types)
18811881
nil
18821882
end
18831883

1884+
# Empty list members (`application/json,,text/event-stream`), which RFC 9110 section 5.6.1.2 has
1885+
# a recipient parse and ignore, are skipped.
18841886
def parse_accept_header(header)
1885-
header.split(",").map do |part|
1886-
part.split(";").first.strip.downcase
1887-
end
1887+
header.split(",").map { |part| part.split(";").first.to_s.strip.downcase }.reject(&:empty?)
18881888
end
18891889

18901890
def validate_content_type(request)

‎test/mcp/server/transports/streamable_http_transport_test.rb‎

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1848,6 +1848,23 @@ def string
18481848
assert_equal 200, response[0]
18491849
end
18501850

1851+
test "POST request with empty members in the Accept header succeeds" do
1852+
["application/json,,text/event-stream", ", application/json, text/event-stream"].each do |accept|
1853+
request = create_rack_request_without_accept(
1854+
"POST",
1855+
"/",
1856+
{
1857+
"CONTENT_TYPE" => "application/json",
1858+
"HTTP_ACCEPT" => accept,
1859+
},
1860+
{ jsonrpc: "2.0", method: "initialize", id: "123", params: initialize_params }.to_json,
1861+
)
1862+
1863+
response = @transport.handle_request(request)
1864+
assert_equal 200, response[0], accept.inspect
1865+
end
1866+
end
1867+
18511868
test "POST request with Accept: */* succeeds" do
18521869
request = create_rack_request_without_accept(
18531870
"POST",
@@ -1978,6 +1995,30 @@ def string
19781995
assert_equal "text/event-stream", response[1]["content-type"]
19791996
end
19801997

1998+
test "GET request with an empty member in the Accept header succeeds" do
1999+
init_request = create_rack_request(
2000+
"POST",
2001+
"/",
2002+
{ "CONTENT_TYPE" => "application/json" },
2003+
{ jsonrpc: "2.0", method: "initialize", id: "123", params: initialize_params }.to_json,
2004+
)
2005+
init_response = @transport.handle_request(init_request)
2006+
session_id = init_response[1]["mcp-session-id"]
2007+
2008+
request = create_rack_request(
2009+
"GET",
2010+
"/",
2011+
{
2012+
"HTTP_MCP_SESSION_ID" => session_id,
2013+
"HTTP_ACCEPT" => ",text/event-stream",
2014+
},
2015+
)
2016+
2017+
response = @transport.handle_request(request)
2018+
assert_equal 200, response[0]
2019+
assert_equal "text/event-stream", response[1]["content-type"]
2020+
end
2021+
19812022
test "GET request with Accept: */* succeeds" do
19822023
init_request = create_rack_request(
19832024
"POST",

0 commit comments

Comments
 (0)