@@ -806,10 +806,8 @@ async fn run_websocket_response_stream(
806806 Message :: Binary ( _) => {
807807 return Err ( ApiError :: Stream ( "unexpected binary websocket event" . into ( ) ) ) ;
808808 }
809- Message :: Close ( _) => {
810- return Err ( ApiError :: Stream (
811- "websocket closed by server before response.completed" . into ( ) ,
812- ) ) ;
809+ Message :: Close ( frame) => {
810+ return Err ( responses_websocket_close_error ( frame) ) ;
813811 }
814812 Message :: Frame ( _) => { }
815813 Message :: Ping ( _) | Message :: Pong ( _) => { }
@@ -819,6 +817,17 @@ async fn run_websocket_response_stream(
819817 Ok ( ( ) )
820818}
821819
820+ fn responses_websocket_close_error ( frame : Option < CloseFrame > ) -> ApiError {
821+ let message = match frame {
822+ Some ( frame) => format ! (
823+ "websocket closed by server before response.completed: code={} reason={}" ,
824+ frame. code, frame. reason
825+ ) ,
826+ None => "websocket closed by server before response.completed" . to_string ( ) ,
827+ } ;
828+ ApiError :: Stream ( message)
829+ }
830+
822831fn emit_responses_websocket_timing_event (
823832 kind : & str ,
824833 payload : & str ,
@@ -911,6 +920,36 @@ mod tests {
911920 use serde_json:: value:: to_raw_value;
912921 use std:: collections:: HashMap ;
913922 use std:: sync:: Arc ;
923+ use tungstenite:: protocol:: frame:: coding:: CloseCode ;
924+
925+ #[ test]
926+ fn websocket_close_error_preserves_code_and_reason ( ) {
927+ let error = responses_websocket_close_error ( Some ( CloseFrame {
928+ code : CloseCode :: Size ,
929+ reason : "Message Too Big" . into ( ) ,
930+ } ) ) ;
931+
932+ let ApiError :: Stream ( message) = error else {
933+ panic ! ( "expected stream error" ) ;
934+ } ;
935+ assert_eq ! (
936+ message,
937+ "websocket closed by server before response.completed: code=1009 reason=Message Too Big"
938+ ) ;
939+ }
940+
941+ #[ test]
942+ fn websocket_close_error_without_frame_preserves_generic_message ( ) {
943+ let error = responses_websocket_close_error ( None ) ;
944+
945+ let ApiError :: Stream ( message) = error else {
946+ panic ! ( "expected stream error" ) ;
947+ } ;
948+ assert_eq ! (
949+ message,
950+ "websocket closed by server before response.completed"
951+ ) ;
952+ }
914953
915954 #[ test]
916955 fn direct_serialization_preserves_websocket_request_payload ( ) {
0 commit comments