Merge pull request #323 from atesgoral/ag/client-202-accepted
Handle 202 Accepted response in HTTP client
This commit is contained in:
commit
cbe81453fd
3 changed files with 20 additions and 1 deletions
|
|
@ -171,7 +171,7 @@ puts <<~MESSAGE
|
||||||
curl -i http://localhost:9393 -H "Mcp-Session-Id: YOUR_SESSION_ID" \\
|
curl -i http://localhost:9393 -H "Mcp-Session-Id: YOUR_SESSION_ID" \\
|
||||||
--json '{"jsonrpc":"2.0","method":"tools/call","id":3,"params":{"name":"notification_tool","arguments":{"message":"Hello SSE!", "delay": 2}}}'
|
--json '{"jsonrpc":"2.0","method":"tools/call","id":3,"params":{"name":"notification_tool","arguments":{"message":"Hello SSE!", "delay": 2}}}'
|
||||||
|
|
||||||
Note: When an SSE stream is active, tool responses will appear in the SSE stream and the POST request will return {"accepted": true}
|
Note: When an SSE stream is active, tool responses will appear in the SSE stream and the POST request will return 202 Accepted with no body.
|
||||||
|
|
||||||
Press Ctrl+C to stop the server
|
Press Ctrl+C to stop the server
|
||||||
MESSAGE
|
MESSAGE
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,10 @@ module MCP
|
||||||
end
|
end
|
||||||
|
|
||||||
def parse_response_body(response, method, params)
|
def parse_response_body(response, method, params)
|
||||||
|
# 202 Accepted is the server's ACK for a JSON-RPC notification or response; no body is expected.
|
||||||
|
# https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#sending-messages-to-the-server
|
||||||
|
return if response.status == 202
|
||||||
|
|
||||||
content_type = response.headers["Content-Type"]
|
content_type = response.headers["Content-Type"]
|
||||||
|
|
||||||
if content_type&.include?("text/event-stream")
|
if content_type&.include?("text/event-stream")
|
||||||
|
|
|
||||||
|
|
@ -369,6 +369,21 @@ module MCP
|
||||||
assert_equal("Invalid request", response.dig("error", "message"))
|
assert_equal("Invalid request", response.dig("error", "message"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_send_request_returns_nil_for_202_accepted_response
|
||||||
|
request = {
|
||||||
|
jsonrpc: "2.0",
|
||||||
|
method: "notifications/initialized",
|
||||||
|
}
|
||||||
|
|
||||||
|
stub_request(:post, url)
|
||||||
|
.with(body: request.to_json)
|
||||||
|
.to_return(status: 202, body: "")
|
||||||
|
|
||||||
|
response = client.send_request(request: request)
|
||||||
|
|
||||||
|
assert_nil(response)
|
||||||
|
end
|
||||||
|
|
||||||
def test_send_request_raises_error_for_sse_without_response
|
def test_send_request_raises_error_for_sse_without_response
|
||||||
request = {
|
request = {
|
||||||
jsonrpc: "2.0",
|
jsonrpc: "2.0",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue