mirror of
https://github.com/openai/codex.git
synced 2026-09-20 12:47:38 +00:00
## What changed - Serve `GET /healthz` with a `200 OK` response over HTTP/1.1 and HTTP/2. - Continue requiring HTTP/2 for all other requests so gRPC methods are not exposed over HTTP/1.1. ## Testing - Add TCP listener integration coverage for HTTP/1.1 and HTTP/2 health checks and rejection of HTTP/1.1 gRPC requests. GitOrigin-RevId: ae7bbf56323fbc76769375a6d8e90653e8adc860
68 lines
2.2 KiB
Rust
68 lines
2.2 KiB
Rust
use std::io;
|
|
use std::io::Write as _;
|
|
use std::net::SocketAddr;
|
|
|
|
use anyhow::Context;
|
|
use anyhow::Result;
|
|
use axum::extract::Request;
|
|
use axum::http::Method;
|
|
use axum::http::StatusCode;
|
|
use axum::http::Version;
|
|
use axum::middleware;
|
|
use axum::middleware::Next;
|
|
use axum::routing::get;
|
|
use codex_code_mode_protocol::grpc::code_mode_host_server::CodeModeHostServer;
|
|
use codex_code_mode_protocol::host::MAX_FRAME_BYTES;
|
|
use tokio::net::TcpListener;
|
|
use tonic::service::Routes;
|
|
use tonic::transport::Server;
|
|
use tonic::transport::server::TcpIncoming;
|
|
use tracing::info;
|
|
|
|
use crate::GrpcCodeModeHost;
|
|
|
|
pub(super) async fn run_tcp_listener(bind_address: SocketAddr) -> Result<()> {
|
|
let listener = bind_tcp_listener(bind_address).await?;
|
|
let local_address = listener
|
|
.local_addr()
|
|
.context("failed to read code-mode gRPC listen address")?;
|
|
info!("codex-code-mode-host listening on http://{local_address}");
|
|
println!("http://{local_address}");
|
|
io::stdout()
|
|
.flush()
|
|
.context("failed to publish code-mode gRPC listen address")?;
|
|
|
|
let routes = Routes::new(
|
|
CodeModeHostServer::new(GrpcCodeModeHost::new())
|
|
.max_decoding_message_size(MAX_FRAME_BYTES)
|
|
.max_encoding_message_size(MAX_FRAME_BYTES),
|
|
)
|
|
.into_axum_router()
|
|
.route("/healthz", get(|| async { StatusCode::OK }))
|
|
.layer(middleware::from_fn(
|
|
|request: Request, next: Next| async move {
|
|
if request.version() != Version::HTTP_2
|
|
&& (request.method() != Method::GET || request.uri().path() != "/healthz")
|
|
{
|
|
return Err(StatusCode::HTTP_VERSION_NOT_SUPPORTED);
|
|
}
|
|
|
|
Ok(next.run(request).await)
|
|
},
|
|
));
|
|
|
|
Server::builder()
|
|
.accept_http1(/*accept_http1*/ true)
|
|
.add_routes(routes.into())
|
|
.serve_with_incoming(listener)
|
|
.await
|
|
.context("code-mode gRPC TCP listener failed")
|
|
}
|
|
|
|
pub(super) async fn bind_tcp_listener(bind_address: SocketAddr) -> Result<TcpIncoming> {
|
|
let listener = TcpListener::bind(bind_address)
|
|
.await
|
|
.with_context(|| format!("failed to bind code-mode gRPC host to {bind_address}"))?;
|
|
Ok(TcpIncoming::from(listener).with_nodelay(Some(true)))
|
|
}
|