@@ -709,6 +709,41 @@ def test_send_request_raises_error_on_invalid_json
709709 stdout_write . close
710710 end
711711
712+ def test_send_request_raises_its_parse_error_on_a_frame_starting_with_an_invalid_byte
713+ server = lambda do |requests , frames |
714+ answer_handshake ( requests , frames )
715+ request = JSON . parse ( requests . gets )
716+ frames . write ( "\xFF " . b + JSON . generate ( { jsonrpc : "2.0" , id : request [ "id" ] , result : { } } ) + "\n " )
717+ frames . flush
718+ end
719+
720+ with_scripted_server ( server ) do |transport |
721+ transport . connect
722+ error = assert_raises ( RequestHandlerError ) do
723+ transport . send_request ( request : { jsonrpc : "2.0" , id : "test-id" , method : "tools/list" } )
724+ end
725+
726+ assert_equal ( "Failed to parse server response" , error . message )
727+ assert_instance_of ( JSON ::ParserError , error . original_error )
728+ end
729+ end
730+
731+ def test_send_request_returns_a_response_holding_an_invalid_byte_in_a_value
732+ server = lambda do |requests , frames |
733+ answer_handshake ( requests , frames )
734+ request = JSON . parse ( requests . gets )
735+ frames . write ( "{\" jsonrpc\" :\" 2.0\" ,\" id\" :#{ JSON . generate ( request [ "id" ] ) } ,\" result\" :{\" x\" :\" a\xFF b\" }}\n " . b )
736+ frames . flush
737+ end
738+
739+ with_scripted_server ( server ) do |transport |
740+ transport . connect
741+ response = transport . send_request ( request : { jsonrpc : "2.0" , id : "test-id" , method : "tools/list" } )
742+
743+ assert_equal ( "a\xFF b" . b , response . dig ( "result" , "x" ) . b )
744+ end
745+ end
746+
712747 def test_send_request_raises_error_on_a_response_that_is_not_json_rpc_2_0
713748 answers = [
714749 { result : { tools : [ ] } } ,
0 commit comments