@@ -339,3 +339,60 @@ func TestDecodeSSERPCMessageSkipsNotifications(t *testing.T) {
339339 t .Fatalf ("expected a result payload, got %#v" , msg )
340340 }
341341}
342+
343+ func TestDecodeSSERPCMessageSkipsEmptyAndNullMethod (t * testing.T ) {
344+ stream := "event: message\n " +
345+ `data: {"jsonrpc":"2.0","id":7,"method":""}` + "\n \n " +
346+ "event: message\n " +
347+ `data: {"jsonrpc":"2.0","id":7,"method":null}` + "\n \n " +
348+ "event: message\n " +
349+ `data: {"jsonrpc":"2.0","id":7,"result":{"ok":true}}` + "\n \n "
350+
351+ msg , err := decodeSSERPCMessage (strings .NewReader (stream ))
352+ if err != nil {
353+ t .Fatalf ("decodeSSERPCMessage: %v" , err )
354+ }
355+ if msg .isRequestOrNotification () {
356+ t .Fatalf ("empty/null method must not be treated as the response, got method %q present=%v" , msg .Method , msg .methodPresent )
357+ }
358+ if ! rpcIDMatches (msg .ID , 7 ) {
359+ t .Fatalf ("expected response id 7, got %#v" , msg .ID )
360+ }
361+ }
362+
363+ func TestDeliverEventMessageSkipsMethodPresence (t * testing.T ) {
364+ client := & remoteSSEClient {pending : map [string ]chan ssePendingResponse {}}
365+ key := rpcResponseKey (1 )
366+ pending := make (chan ssePendingResponse , 1 )
367+ client .pending [key ] = pending
368+
369+ if err := client .deliverEventMessage (`{"jsonrpc":"2.0","id":1,"method":""}` ); err != nil {
370+ t .Fatalf ("deliverEventMessage empty method: %v" , err )
371+ }
372+ if err := client .deliverEventMessage (`{"jsonrpc":"2.0","id":1,"method":null}` ); err != nil {
373+ t .Fatalf ("deliverEventMessage null method: %v" , err )
374+ }
375+ select {
376+ case got := <- pending :
377+ t .Fatalf ("method presence must not complete pending, got %#v" , got )
378+ default :
379+ }
380+ if _ , ok := client .pending [key ]; ! ok {
381+ t .Fatal ("deliverEventMessage must not delete pending for a request/notification" )
382+ }
383+
384+ if err := client .deliverEventMessage (`{"jsonrpc":"2.0","id":1,"result":{"ok":true}}` ); err != nil {
385+ t .Fatalf ("deliverEventMessage response: %v" , err )
386+ }
387+ select {
388+ case got := <- pending :
389+ if got .err != nil {
390+ t .Fatalf ("true response: %v" , got .err )
391+ }
392+ if got .message .isRequestOrNotification () {
393+ t .Fatal ("true response must not carry a method" )
394+ }
395+ default :
396+ t .Fatal ("true response must complete pending" )
397+ }
398+ }
0 commit comments