mirror of
https://github.com/openai/codex.git
synced 2026-09-05 15:18:41 +00:00
### Why Remote streamable HTTP MCP needs the executor to perform ordinary HTTP requests on the executor side. This keeps network placement aligned with `experimental_environment = "remote"` without adding MCP-specific executor APIs. ### What - Add an executor-side `http/request` runner backed by `reqwest`. - Validate request method and URL scheme, preserving the transport boundary at plain HTTP. - Return buffered responses for ordinary calls and emit ordered `http/request/bodyDelta` notifications for streaming responses. - Register the request handler in the exec-server router. - Document the runner entrypoint, conversion helpers, body-stream bridge, notification sender, timeout behavior, and new integration-test helpers. - Add exec-server integration tests with the existing websocket harness and a local TCP HTTP peer for buffered and streamed responses, with comments spelling out what each test proves and its setup/exercise/assert phases. ### Stack 1. #18581 protocol 2. #18582 runner 3. #18583 RMCP client 4. #18584 manager wiring and local/remote coverage ### Verification - `just fmt` - `cargo check -p codex-exec-server -p codex-rmcp-client --tests` - `cargo check -p codex-core --test all` compile-only - `git diff --check` - Online full CI is running from the `full-ci` branch, including the remote Rust test job. Co-authored-by: Codex <noreply@openai.com> --------- Co-authored-by: Codex <noreply@openai.com>
119 lines
3.9 KiB
Rust
119 lines
3.9 KiB
Rust
use std::sync::Arc;
|
|
|
|
use crate::protocol::EXEC_METHOD;
|
|
use crate::protocol::EXEC_READ_METHOD;
|
|
use crate::protocol::EXEC_TERMINATE_METHOD;
|
|
use crate::protocol::EXEC_WRITE_METHOD;
|
|
use crate::protocol::ExecParams;
|
|
use crate::protocol::FS_COPY_METHOD;
|
|
use crate::protocol::FS_CREATE_DIRECTORY_METHOD;
|
|
use crate::protocol::FS_GET_METADATA_METHOD;
|
|
use crate::protocol::FS_READ_DIRECTORY_METHOD;
|
|
use crate::protocol::FS_READ_FILE_METHOD;
|
|
use crate::protocol::FS_REMOVE_METHOD;
|
|
use crate::protocol::FS_WRITE_FILE_METHOD;
|
|
use crate::protocol::FsCopyParams;
|
|
use crate::protocol::FsCreateDirectoryParams;
|
|
use crate::protocol::FsGetMetadataParams;
|
|
use crate::protocol::FsReadDirectoryParams;
|
|
use crate::protocol::FsReadFileParams;
|
|
use crate::protocol::FsRemoveParams;
|
|
use crate::protocol::FsWriteFileParams;
|
|
use crate::protocol::HTTP_REQUEST_METHOD;
|
|
use crate::protocol::HttpRequestParams;
|
|
use crate::protocol::INITIALIZE_METHOD;
|
|
use crate::protocol::INITIALIZED_METHOD;
|
|
use crate::protocol::InitializeParams;
|
|
use crate::protocol::ReadParams;
|
|
use crate::protocol::TerminateParams;
|
|
use crate::protocol::WriteParams;
|
|
use crate::rpc::RpcRouter;
|
|
use crate::server::ExecServerHandler;
|
|
|
|
pub(crate) fn build_router() -> RpcRouter<ExecServerHandler> {
|
|
let mut router = RpcRouter::new();
|
|
router.notification(
|
|
INITIALIZED_METHOD,
|
|
|handler: Arc<ExecServerHandler>, _params: serde_json::Value| async move {
|
|
handler.initialized()
|
|
},
|
|
);
|
|
router.request(
|
|
INITIALIZE_METHOD,
|
|
|handler: Arc<ExecServerHandler>, params: InitializeParams| async move {
|
|
handler.initialize(params).await
|
|
},
|
|
);
|
|
router.request_with_id(
|
|
HTTP_REQUEST_METHOD,
|
|
|handler: Arc<ExecServerHandler>, request_id, params: HttpRequestParams| async move {
|
|
handler.http_request(request_id, params).await
|
|
},
|
|
);
|
|
router.request(
|
|
EXEC_METHOD,
|
|
|handler: Arc<ExecServerHandler>, params: ExecParams| async move { handler.exec(params).await },
|
|
);
|
|
router.request(
|
|
EXEC_READ_METHOD,
|
|
|handler: Arc<ExecServerHandler>, params: ReadParams| async move {
|
|
handler.exec_read(params).await
|
|
},
|
|
);
|
|
router.request(
|
|
EXEC_WRITE_METHOD,
|
|
|handler: Arc<ExecServerHandler>, params: WriteParams| async move {
|
|
handler.exec_write(params).await
|
|
},
|
|
);
|
|
router.request(
|
|
EXEC_TERMINATE_METHOD,
|
|
|handler: Arc<ExecServerHandler>, params: TerminateParams| async move {
|
|
handler.terminate(params).await
|
|
},
|
|
);
|
|
router.request(
|
|
FS_READ_FILE_METHOD,
|
|
|handler: Arc<ExecServerHandler>, params: FsReadFileParams| async move {
|
|
handler.fs_read_file(params).await
|
|
},
|
|
);
|
|
router.request(
|
|
FS_WRITE_FILE_METHOD,
|
|
|handler: Arc<ExecServerHandler>, params: FsWriteFileParams| async move {
|
|
handler.fs_write_file(params).await
|
|
},
|
|
);
|
|
router.request(
|
|
FS_CREATE_DIRECTORY_METHOD,
|
|
|handler: Arc<ExecServerHandler>, params: FsCreateDirectoryParams| async move {
|
|
handler.fs_create_directory(params).await
|
|
},
|
|
);
|
|
router.request(
|
|
FS_GET_METADATA_METHOD,
|
|
|handler: Arc<ExecServerHandler>, params: FsGetMetadataParams| async move {
|
|
handler.fs_get_metadata(params).await
|
|
},
|
|
);
|
|
router.request(
|
|
FS_READ_DIRECTORY_METHOD,
|
|
|handler: Arc<ExecServerHandler>, params: FsReadDirectoryParams| async move {
|
|
handler.fs_read_directory(params).await
|
|
},
|
|
);
|
|
router.request(
|
|
FS_REMOVE_METHOD,
|
|
|handler: Arc<ExecServerHandler>, params: FsRemoveParams| async move {
|
|
handler.fs_remove(params).await
|
|
},
|
|
);
|
|
router.request(
|
|
FS_COPY_METHOD,
|
|
|handler: Arc<ExecServerHandler>, params: FsCopyParams| async move {
|
|
handler.fs_copy(params).await
|
|
},
|
|
);
|
|
router
|
|
}
|