Skip to content

Commit 0f22067

Browse files
[codex][app-server] improve error response for client requests (#6050)
1 parent d7f8b97 commit 0f22067

File tree

1 file changed

+66
-51
lines changed

1 file changed

+66
-51
lines changed

codex-rs/app-server/src/message_processor.rs

Lines changed: 66 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -64,64 +64,79 @@ impl MessageProcessor {
6464

6565
pub(crate) async fn process_request(&mut self, request: JSONRPCRequest) {
6666
let request_id = request.id.clone();
67-
if let Ok(request_json) = serde_json::to_value(request)
68-
&& let Ok(codex_request) = serde_json::from_value::<ClientRequest>(request_json)
69-
{
70-
match codex_request {
71-
// Handle Initialize internally so CodexMessageProcessor does not have to concern
72-
// itself with the `initialized` bool.
73-
ClientRequest::Initialize { request_id, params } => {
74-
if self.initialized {
75-
let error = JSONRPCErrorError {
76-
code: INVALID_REQUEST_ERROR_CODE,
77-
message: "Already initialized".to_string(),
78-
data: None,
79-
};
80-
self.outgoing.send_error(request_id, error).await;
81-
return;
82-
} else {
83-
let ClientInfo {
84-
name,
85-
title: _title,
86-
version,
87-
} = params.client_info;
88-
let user_agent_suffix = format!("{name}; {version}");
89-
if let Ok(mut suffix) = USER_AGENT_SUFFIX.lock() {
90-
*suffix = Some(user_agent_suffix);
91-
}
67+
let request_json = match serde_json::to_value(&request) {
68+
Ok(request_json) => request_json,
69+
Err(err) => {
70+
let error = JSONRPCErrorError {
71+
code: INVALID_REQUEST_ERROR_CODE,
72+
message: format!("Invalid request: {err}"),
73+
data: None,
74+
};
75+
self.outgoing.send_error(request_id, error).await;
76+
return;
77+
}
78+
};
9279

93-
let user_agent = get_codex_user_agent();
94-
let response = InitializeResponse { user_agent };
95-
self.outgoing.send_response(request_id, response).await;
80+
let codex_request = match serde_json::from_value::<ClientRequest>(request_json) {
81+
Ok(codex_request) => codex_request,
82+
Err(err) => {
83+
let error = JSONRPCErrorError {
84+
code: INVALID_REQUEST_ERROR_CODE,
85+
message: format!("Invalid request: {err}"),
86+
data: None,
87+
};
88+
self.outgoing.send_error(request_id, error).await;
89+
return;
90+
}
91+
};
9692

97-
self.initialized = true;
98-
return;
93+
match codex_request {
94+
// Handle Initialize internally so CodexMessageProcessor does not have to concern
95+
// itself with the `initialized` bool.
96+
ClientRequest::Initialize { request_id, params } => {
97+
if self.initialized {
98+
let error = JSONRPCErrorError {
99+
code: INVALID_REQUEST_ERROR_CODE,
100+
message: "Already initialized".to_string(),
101+
data: None,
102+
};
103+
self.outgoing.send_error(request_id, error).await;
104+
return;
105+
} else {
106+
let ClientInfo {
107+
name,
108+
title: _title,
109+
version,
110+
} = params.client_info;
111+
let user_agent_suffix = format!("{name}; {version}");
112+
if let Ok(mut suffix) = USER_AGENT_SUFFIX.lock() {
113+
*suffix = Some(user_agent_suffix);
99114
}
115+
116+
let user_agent = get_codex_user_agent();
117+
let response = InitializeResponse { user_agent };
118+
self.outgoing.send_response(request_id, response).await;
119+
120+
self.initialized = true;
121+
return;
100122
}
101-
_ => {
102-
if !self.initialized {
103-
let error = JSONRPCErrorError {
104-
code: INVALID_REQUEST_ERROR_CODE,
105-
message: "Not initialized".to_string(),
106-
data: None,
107-
};
108-
self.outgoing.send_error(request_id, error).await;
109-
return;
110-
}
123+
}
124+
_ => {
125+
if !self.initialized {
126+
let error = JSONRPCErrorError {
127+
code: INVALID_REQUEST_ERROR_CODE,
128+
message: "Not initialized".to_string(),
129+
data: None,
130+
};
131+
self.outgoing.send_error(request_id, error).await;
132+
return;
111133
}
112134
}
113-
114-
self.codex_message_processor
115-
.process_request(codex_request)
116-
.await;
117-
} else {
118-
let error = JSONRPCErrorError {
119-
code: INVALID_REQUEST_ERROR_CODE,
120-
message: "Invalid request".to_string(),
121-
data: None,
122-
};
123-
self.outgoing.send_error(request_id, error).await;
124135
}
136+
137+
self.codex_message_processor
138+
.process_request(codex_request)
139+
.await;
125140
}
126141

127142
pub(crate) async fn process_notification(&self, notification: JSONRPCNotification) {

0 commit comments

Comments
 (0)