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 9662361f0..0088d349b 100644 --- a/tonic-health/src/generated/grpc_health_v1.rs +++ b/tonic-health/src/generated/grpc_health_v1.rs @@ -418,8 +418,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_v1alpha.rs b/tonic-reflection/src/generated/grpc_reflection_v1alpha.rs index 7efa6d51a..1a736f700 100644 --- a/tonic-reflection/src/generated/grpc_reflection_v1alpha.rs +++ b/tonic-reflection/src/generated/grpc_reflection_v1alpha.rs @@ -426,8 +426,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 af4c5276f..f5a88a3eb 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 hyper::Body; 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 { @@ -205,8 +204,10 @@ impl<'a> RequestKind<'a> { fn coerce_request(mut req: Request, encoding: Encoding) -> Request { req.headers_mut().remove(header::CONTENT_LENGTH); - req.headers_mut() - .insert(header::CONTENT_TYPE, HeaderValue::from_static(GRPC)); + req.headers_mut().insert( + header::CONTENT_TYPE, + HeaderValue::from_static(GRPC_CONTENT_TYPE), + ); req.headers_mut() .insert(header::TE, HeaderValue::from_static("trailers")); @@ -376,7 +377,7 @@ mod tests { fn request() -> Request { Request::builder() .version(Version::HTTP_2) - .header(CONTENT_TYPE, GRPC) + .header(CONTENT_TYPE, GRPC_CONTENT_TYPE) .body(Body::empty()) .unwrap() } @@ -396,7 +397,7 @@ mod tests { let mut svc = crate::enable(Svc); let req = Request::builder() - .header(CONTENT_TYPE, GRPC) + .header(CONTENT_TYPE, GRPC_CONTENT_TYPE) .body(Body::empty()) .unwrap(); diff --git a/tonic/src/client/grpc.rs b/tonic/src/client/grpc.rs index b02ebb949..c66cc8191 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, HeaderValue::from_static(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..c46d345e3 100644 --- a/tonic/src/metadata/mod.rs +++ b/tonic/src/metadata/mod.rs @@ -33,6 +33,9 @@ pub use self::value::MetadataValue; pub(crate) use self::map::GRPC_TIMEOUT_HEADER; +/// HTTP Header `content-type` value for gRPC calls. +pub const GRPC_CONTENT_TYPE: &str = "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 5330b30ed..4ff73fa96 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}, @@ -438,7 +439,7 @@ where // Set the content type parts.headers.insert( http::header::CONTENT_TYPE, - http::header::HeaderValue::from_static("application/grpc"), + http::header::HeaderValue::from_static(GRPC_CONTENT_TYPE), ); #[cfg(any(feature = "gzip", feature = "zstd"))] diff --git a/tonic/src/status.rs b/tonic/src/status.rs index da8b792e5..8be91b1c5 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}; @@ -582,14 +582,13 @@ impl Status { self } - #[allow(clippy::wrong_self_convention)] /// Build an `http::Response` from the given `Status`. pub fn to_http(self) -> http::Response { let (mut parts, _body) = http::Response::new(()).into_parts(); parts.headers.insert( http::header::CONTENT_TYPE, - http::header::HeaderValue::from_static("application/grpc"), + http::header::HeaderValue::from_static(GRPC_CONTENT_TYPE), ); self.add_header(&mut parts.headers).unwrap(); diff --git a/tonic/src/transport/service/router.rs b/tonic/src/transport/service/router.rs index 85636c4d4..87305945b 100644 --- a/tonic/src/transport/service/router.rs +++ b/tonic/src/transport/service/router.rs @@ -1,5 +1,6 @@ use crate::{ body::{boxed, BoxBody}, + metadata::GRPC_CONTENT_TYPE, server::NamedService, }; use http::{Request, Response}; @@ -99,7 +100,10 @@ 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 = [ + ("grpc-status", "12"), + (http::header::CONTENT_TYPE.as_str(), GRPC_CONTENT_TYPE), + ]; (status, headers) }