mcp: fix cancellation for HTTP transport
In #202, I added the checkRequest helper to validate incoming requests, and invoked it in the stremable transports to preemptively reject invalid HTTP requests, so that a jsonrpc error could be translated to an HTTP error. However, this introduced a bug: since cancellation was handled in the jsonrpc2 layer, we never had to validate it in the mcp layer, and therefore never added methodInfo. As a result, it was reported as an invalid request in the http layer. Add a test, and a fix. The simplest fix was to create stubs that are placeholders for cancellation. This was discovered in the course of investigating #285.
This commit is contained in:
parent
a834f3cf9a
commit
bb6dadecca
1 changed files with 72 additions and 26 deletions
|
|
@ -305,6 +305,7 @@ var clientMethodInfos = map[string]methodInfo{
|
|||
methodPing: newClientMethodInfo(clientSessionMethod((*ClientSession).ping), missingParamsOK),
|
||||
methodListRoots: newClientMethodInfo(clientMethod((*Client).listRoots), missingParamsOK),
|
||||
methodCreateMessage: newClientMethodInfo(clientMethod((*Client).createMessage), 0),
|
||||
notificationCancelled: newClientMethodInfo(clientSessionMethod((*ClientSession).cancel), notification|missingParamsOK),
|
||||
notificationToolListChanged: newClientMethodInfo(clientMethod((*Client).callToolChangedHandler), notification|missingParamsOK),
|
||||
notificationPromptListChanged: newClientMethodInfo(clientMethod((*Client).callPromptChangedHandler), notification|missingParamsOK),
|
||||
notificationResourceListChanged: newClientMethodInfo(clientMethod((*Client).callResourceChangedHandler), notification|missingParamsOK),
|
||||
|
|
@ -344,6 +345,15 @@ func (*ClientSession) ping(context.Context, *PingParams) (*emptyResult, error) {
|
|||
return &emptyResult{}, nil
|
||||
}
|
||||
|
||||
// cancel is a placeholder: cancellation is handled the jsonrpc2 package.
|
||||
//
|
||||
// It should never be invoked in practice because cancellation is preempted,
|
||||
// but having its signature here facilitates the construction of methodInfo
|
||||
// that can be used to validate incoming cancellation notifications.
|
||||
func (*ClientSession) cancel(context.Context, *CancelledParams) (Result, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func newClientRequest[P Params](cs *ClientSession, params P) *ClientRequest[P] {
|
||||
return &ClientRequest[P]{Session: cs, Params: params}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue