Skip to content

Commit b1a2aaf

Browse files
committed
surface responses websocket close details
1 parent 79479cd commit b1a2aaf

1 file changed

Lines changed: 43 additions & 4 deletions

File tree

‎codex-rs/codex-api/src/endpoint/responses_websocket.rs‎

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
822831
fn 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

Comments
 (0)