diff --git a/tonic-build/src/server.rs b/tonic-build/src/server.rs index d9ab1ad6b..202f09fbe 100644 --- a/tonic-build/src/server.rs +++ b/tonic-build/src/server.rs @@ -171,8 +171,8 @@ pub(crate) fn generate_internal( _ => Box::pin(async move { Ok(http::Response::builder() .status(200) - .header("grpc-status", "12") - .header("content-type", "application/grpc") + .header("grpc-status", tonic::Code::Unimplemented as i32) + .header(http::header::CONTENT_TYPE, tonic::metadata::GRPC_CONTENT_TYPE) .body(empty_body()) .unwrap()) }), diff --git a/tonic-health/src/generated/grpc_health_v1.rs b/tonic-health/src/generated/grpc_health_v1.rs index eade84e74..38bb26627 100644 --- a/tonic-health/src/generated/grpc_health_v1.rs +++ b/tonic-health/src/generated/grpc_health_v1.rs @@ -419,8 +419,11 @@ pub mod health_server { Ok( http::Response::builder() .status(200) - .header("grpc-status", "12") - .header("content-type", "application/grpc") + .header("grpc-status", tonic::Code::Unimplemented as i32) + .header( + http::header::CONTENT_TYPE, + tonic::metadata::GRPC_CONTENT_TYPE, + ) .body(empty_body()) .unwrap(), ) diff --git a/tonic-reflection/src/generated/grpc_reflection_v1.rs b/tonic-reflection/src/generated/grpc_reflection_v1.rs index 42154f16d..11cfed496 100644 --- a/tonic-reflection/src/generated/grpc_reflection_v1.rs +++ b/tonic-reflection/src/generated/grpc_reflection_v1.rs @@ -427,8 +427,11 @@ pub mod server_reflection_server { Ok( http::Response::builder() .status(200) - .header("grpc-status", "12") - .header("content-type", "application/grpc") + .header("grpc-status", tonic::Code::Unimplemented as i32) + .header( + http::header::CONTENT_TYPE, + tonic::metadata::GRPC_CONTENT_TYPE, + ) .body(empty_body()) .unwrap(), ) diff --git a/tonic-reflection/src/generated/grpc_reflection_v1alpha.rs b/tonic-reflection/src/generated/grpc_reflection_v1alpha.rs index 85e59c00a..5391b047e 100644 --- a/tonic-reflection/src/generated/grpc_reflection_v1alpha.rs +++ b/tonic-reflection/src/generated/grpc_reflection_v1alpha.rs @@ -427,8 +427,11 @@ pub mod server_reflection_server { Ok( http::Response::builder() .status(200) - .header("grpc-status", "12") - .header("content-type", "application/grpc") + .header("grpc-status", tonic::Code::Unimplemented as i32) + .header( + http::header::CONTENT_TYPE, + tonic::metadata::GRPC_CONTENT_TYPE, + ) .body(empty_body()) .unwrap(), ) diff --git a/tonic-web/src/service.rs b/tonic-web/src/service.rs index da65ba832..e135dae35 100644 --- a/tonic-web/src/service.rs +++ b/tonic-web/src/service.rs @@ -5,6 +5,7 @@ use std::task::{ready, Context, Poll}; use http::{header, HeaderMap, HeaderValue, Method, Request, Response, StatusCode, Version}; use http_body_util::BodyExt; use pin_project::pin_project; +use tonic::metadata::GRPC_CONTENT_TYPE; use tonic::{ body::{empty_body, BoxBody}, server::NamedService, @@ -16,8 +17,6 @@ use crate::call::content_types::is_grpc_web; use crate::call::{Encoding, GrpcWebCall}; use crate::BoxError; -const GRPC: &str = "application/grpc"; - /// Service implementing the grpc-web protocol. #[derive(Debug, Clone)] pub struct GrpcWebService { @@ -206,7 +205,7 @@ fn coerce_request(mut req: Request, encoding: Encoding) -> Request Request { Request::builder() .version(Version::HTTP_2) - .header(CONTENT_TYPE, GRPC) + .header(CONTENT_TYPE, GRPC_CONTENT_TYPE) .body(empty_body()) .unwrap() } @@ -393,7 +392,7 @@ mod tests { let mut svc = crate::enable(Svc); let req = Request::builder() - .header(CONTENT_TYPE, GRPC) + .header(CONTENT_TYPE, GRPC_CONTENT_TYPE) .body(empty_body()) .unwrap(); diff --git a/tonic/src/client/grpc.rs b/tonic/src/client/grpc.rs index 94a21e691..85f5b7609 100644 --- a/tonic/src/client/grpc.rs +++ b/tonic/src/client/grpc.rs @@ -1,4 +1,5 @@ use crate::codec::compression::{CompressionEncoding, EnabledCompressionEncodings}; +use crate::metadata::GRPC_CONTENT_TYPE; use crate::{ body::BoxBody, client::GrpcService, @@ -404,7 +405,7 @@ impl GrpcConfig { // Set the content type request .headers_mut() - .insert(CONTENT_TYPE, HeaderValue::from_static("application/grpc")); + .insert(CONTENT_TYPE, GRPC_CONTENT_TYPE); #[cfg(any(feature = "gzip", feature = "zstd"))] if let Some(encoding) = self.send_compression_encodings { diff --git a/tonic/src/metadata/mod.rs b/tonic/src/metadata/mod.rs index dff62fa2d..878d0df79 100644 --- a/tonic/src/metadata/mod.rs +++ b/tonic/src/metadata/mod.rs @@ -30,9 +30,13 @@ pub use self::map::ValuesMut; pub use self::value::AsciiMetadataValue; pub use self::value::BinaryMetadataValue; pub use self::value::MetadataValue; +use http::HeaderValue; pub(crate) use self::map::GRPC_TIMEOUT_HEADER; +/// HTTP Header `content-type` value for gRPC calls. +pub const GRPC_CONTENT_TYPE: HeaderValue = HeaderValue::from_static("application/grpc"); + /// The metadata::errors module contains types for errors that can occur /// while handling gRPC custom metadata. pub mod errors { diff --git a/tonic/src/server/grpc.rs b/tonic/src/server/grpc.rs index 4c2fa4817..18d2d4edb 100644 --- a/tonic/src/server/grpc.rs +++ b/tonic/src/server/grpc.rs @@ -1,6 +1,7 @@ use crate::codec::compression::{ CompressionEncoding, EnabledCompressionEncodings, SingleMessageCompressionOverride, }; +use crate::metadata::GRPC_CONTENT_TYPE; use crate::{ body::BoxBody, codec::{encode_server, Codec, Streaming}, @@ -433,10 +434,9 @@ where let (mut parts, body) = response.into_http().into_parts(); // Set the content type - parts.headers.insert( - http::header::CONTENT_TYPE, - http::header::HeaderValue::from_static("application/grpc"), - ); + parts + .headers + .insert(http::header::CONTENT_TYPE, GRPC_CONTENT_TYPE); #[cfg(any(feature = "gzip", feature = "zstd"))] if let Some(encoding) = accept_encoding { diff --git a/tonic/src/service/router.rs b/tonic/src/service/router.rs index bc4f78553..c0dea4df8 100644 --- a/tonic/src/service/router.rs +++ b/tonic/src/service/router.rs @@ -1,8 +1,9 @@ use crate::{ body::{boxed, BoxBody}, + metadata::GRPC_CONTENT_TYPE, server::NamedService, }; -use http::{Request, Response}; +use http::{HeaderName, HeaderValue, Request, Response}; use pin_project::pin_project; use std::{ convert::Infallible, @@ -98,7 +99,13 @@ impl Routes { async fn unimplemented() -> impl axum::response::IntoResponse { let status = http::StatusCode::OK; - let headers = [("grpc-status", "12"), ("content-type", "application/grpc")]; + let headers = [ + ( + HeaderName::from_static("grpc-status"), + HeaderValue::from_static("12"), + ), + (http::header::CONTENT_TYPE, GRPC_CONTENT_TYPE), + ]; (status, headers) } diff --git a/tonic/src/status.rs b/tonic/src/status.rs index 1b97d22d4..d5cbe113c 100644 --- a/tonic/src/status.rs +++ b/tonic/src/status.rs @@ -1,5 +1,5 @@ -use crate::body::BoxBody; use crate::metadata::MetadataMap; +use crate::{body::BoxBody, metadata::GRPC_CONTENT_TYPE}; use base64::Engine as _; use bytes::Bytes; use http::header::{HeaderMap, HeaderValue}; @@ -583,10 +583,9 @@ impl Status { /// Build an `http::Response` from the given `Status`. pub fn into_http(self) -> http::Response { let mut response = http::Response::new(crate::body::empty_body()); - response.headers_mut().insert( - http::header::CONTENT_TYPE, - http::header::HeaderValue::from_static("application/grpc"), - ); + response + .headers_mut() + .insert(http::header::CONTENT_TYPE, GRPC_CONTENT_TYPE); self.add_header(response.headers_mut()).unwrap(); response }