Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Move Request server util method to RequestExt #1772

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion examples/src/autoreload/server.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
use tonic::{transport::Server, Request, Response, Status};
use tonic::{
transport::{RequestExt, Server},
Request, Response, Status,
};

use hello_world::greeter_server::{Greeter, GreeterServer};
use hello_world::{HelloReply, HelloRequest};
Expand Down
5 changes: 4 additions & 1 deletion examples/src/cancellation/server.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
use std::future::Future;

use tokio_util::sync::CancellationToken;
use tonic::{transport::Server, Request, Response, Status};
use tonic::{
transport::{RequestExt, Server},
Request, Response, Status,
};

use hello_world::greeter_server::{Greeter, GreeterServer};
use hello_world::{HelloReply, HelloRequest};
Expand Down
5 changes: 4 additions & 1 deletion examples/src/codec_buffers/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@
//! The generated code assumes that a module `crate::common` exists which defines
//! `SmallBufferCodec`, and `SmallBufferCodec` must have a Default implementation.

use tonic::{transport::Server, Request, Response, Status};
use tonic::{
transport::{RequestExt, Server},
Request, Response, Status,
};

pub mod common;

Expand Down
5 changes: 4 additions & 1 deletion examples/src/compression/server.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
use tonic::{transport::Server, Request, Response, Status};
use tonic::{
transport::{RequestExt, Server},
Request, Response, Status,
};

use hello_world::greeter_server::{Greeter, GreeterServer};
use hello_world::{HelloReply, HelloRequest};
Expand Down
6 changes: 5 additions & 1 deletion examples/src/dynamic/server.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
use std::env;
use tonic::{service::RoutesBuilder, transport::Server, Request, Response, Status};
use tonic::{
service::RoutesBuilder,
transport::{RequestExt, Server},
Request, Response, Status,
};

use hello_world::greeter_server::{Greeter, GreeterServer};
use hello_world::{HelloReply, HelloRequest};
Expand Down
5 changes: 4 additions & 1 deletion examples/src/grpc-web/server.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
use tonic::{transport::Server, Request, Response, Status};
use tonic::{
transport::{RequestExt, Server},
Request, Response, Status,
};

use hello_world::greeter_server::{Greeter, GreeterServer};
use hello_world::{HelloReply, HelloRequest};
Expand Down
2 changes: 1 addition & 1 deletion examples/src/h2c/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use hyper_util::rt::{TokioExecutor, TokioIo};
use hyper_util::server::conn::auto::Builder;
use hyper_util::service::TowerToHyperService;
use tokio::net::TcpListener;
use tonic::{service::Routes, Request, Response, Status};
use tonic::{service::Routes, transport::RequestExt, Request, Response, Status};

use hello_world::greeter_server::{Greeter, GreeterServer};
use hello_world::{HelloReply, HelloRequest};
Expand Down
5 changes: 4 additions & 1 deletion examples/src/health/server.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
use tonic::{transport::Server, Request, Response, Status};
use tonic::{
transport::{RequestExt, Server},
Request, Response, Status,
};

use hello_world::greeter_server::{Greeter, GreeterServer};
use hello_world::{HelloReply, HelloRequest};
Expand Down
5 changes: 4 additions & 1 deletion examples/src/helloworld/server.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
use tonic::{transport::Server, Request, Response, Status};
use tonic::{
transport::{RequestExt, Server},
Request, Response, Status,
};

use hello_world::greeter_server::{Greeter, GreeterServer};
use hello_world::{HelloReply, HelloRequest};
Expand Down
5 changes: 4 additions & 1 deletion examples/src/json-codec/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
//! in the `examples/build.rs` file. As defined there, the generated code assumes that a module
//! `crate::common` exists which defines `HelloRequest`, `HelloResponse`, and `JsonCodec`.

use tonic::{transport::Server, Request, Response, Status};
use tonic::{
transport::{RequestExt, Server},
Request, Response, Status,
};

pub mod common;
use common::{HelloRequest, HelloResponse};
Expand Down
2 changes: 1 addition & 1 deletion examples/src/reflection/server.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use tonic::transport::Server;
use tonic::transport::{RequestExt, Server};
use tonic::{Request, Response, Status};

mod proto {
Expand Down
5 changes: 4 additions & 1 deletion examples/src/richer-error/server.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
use tonic::{transport::Server, Code, Request, Response, Status};
use tonic::{
transport::{server::RequestExt, Server},
Code, Request, Response, Status,
};
use tonic_types::{ErrorDetails, StatusExt};

use hello_world::greeter_server::{Greeter, GreeterServer};
Expand Down
5 changes: 4 additions & 1 deletion examples/src/richer-error/server_vec.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
use tonic::{transport::Server, Code, Request, Response, Status};
use tonic::{
transport::{RequestExt, Server},
Code, Request, Response, Status,
};
use tonic_types::{BadRequest, Help, LocalizedMessage, StatusExt};

use hello_world::greeter_server::{Greeter, GreeterServer};
Expand Down
5 changes: 4 additions & 1 deletion examples/src/streaming/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ pub mod pb {
use std::{error::Error, io::ErrorKind, net::ToSocketAddrs, pin::Pin, time::Duration};
use tokio::sync::mpsc;
use tokio_stream::{wrappers::ReceiverStream, Stream, StreamExt};
use tonic::{transport::Server, Request, Response, Status, Streaming};
use tonic::{
transport::{RequestExt, Server},
Request, Response, Status, Streaming,
};

use pb::{EchoRequest, EchoResponse};

Expand Down
5 changes: 4 additions & 1 deletion examples/src/timeout/server.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
use std::time::Duration;
use tokio::time::sleep;
use tonic::{transport::Server, Request, Response, Status};
use tonic::{
transport::{RequestExt, Server},
Request, Response, Status,
};

use hello_world::greeter_server::{Greeter, GreeterServer};
use hello_world::{HelloReply, HelloRequest};
Expand Down
2 changes: 1 addition & 1 deletion examples/src/tls/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use pb::{EchoRequest, EchoResponse};
use tonic::{
transport::{
server::{TcpConnectInfo, TlsConnectInfo},
Identity, Server, ServerTlsConfig,
Identity, RequestExt, Server, ServerTlsConfig,
},
Request, Response, Status,
};
Expand Down
2 changes: 1 addition & 1 deletion examples/src/tls_client_auth/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ pub mod pb {
}

use pb::{EchoRequest, EchoResponse};
use tonic::transport::{Certificate, Identity, Server, ServerTlsConfig};
use tonic::transport::{Certificate, Identity, RequestExt, Server, ServerTlsConfig};
use tonic::{Request, Response, Status};

type EchoResult<T> = Result<Response<T>, Status>;
Expand Down
6 changes: 5 additions & 1 deletion examples/src/tower/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ use std::{
task::{Context, Poll},
time::Duration,
};
use tonic::{body::BoxBody, transport::Server, Request, Response, Status};
use tonic::{
body::BoxBody,
transport::{RequestExt, Server},
Request, Response, Status,
};
use tower::{Layer, Service};

use hello_world::greeter_server::{Greeter, GreeterServer};
Expand Down
4 changes: 2 additions & 2 deletions tests/integration_tests/tests/connect_info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use integration_tests::pb::{test_client, test_server, Input, Output};
use std::time::Duration;
use tokio::sync::oneshot;
use tonic::{
transport::{server::TcpConnectInfo, Endpoint, Server},
transport::{server::TcpConnectInfo, Endpoint, RequestExt, Server},
Request, Response, Status,
};

Expand Down Expand Up @@ -60,7 +60,7 @@ pub mod unix {
};
use tokio_stream::wrappers::UnixListenerStream;
use tonic::{
transport::{server::UdsConnectInfo, Endpoint, Server, Uri},
transport::{server::UdsConnectInfo, Endpoint, RequestExt, Server, Uri},
Request, Response, Status,
};
use tower::service_fn;
Expand Down
73 changes: 4 additions & 69 deletions tonic/src/request.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,10 @@
use crate::metadata::{MetadataMap, MetadataValue};
#[cfg(feature = "server")]
use crate::transport::server::TcpConnectInfo;
#[cfg(all(feature = "server", feature = "tls"))]
use crate::transport::server::TlsConnectInfo;
use http::Extensions;
#[cfg(feature = "server")]
use std::net::SocketAddr;
#[cfg(all(feature = "server", feature = "tls"))]
use std::sync::Arc;
use std::time::Duration;
#[cfg(all(feature = "server", feature = "tls"))]
use tokio_rustls::rustls::pki_types::CertificateDer;

use http::Extensions;
use tokio_stream::Stream;

use crate::metadata::{MetadataMap, MetadataValue};

/// A gRPC request and metadata from an RPC call.
#[derive(Debug)]
pub struct Request<T> {
Expand Down Expand Up @@ -206,63 +198,6 @@ impl<T> Request<T> {
}
}

/// Get the local address of this connection.
///
/// This will return `None` if the `IO` type used
/// does not implement `Connected` or when using a unix domain socket.
/// This currently only works on the server side.
#[cfg(feature = "server")]
pub fn local_addr(&self) -> Option<SocketAddr> {
let addr = self
.extensions()
.get::<TcpConnectInfo>()
.and_then(|i| i.local_addr());

#[cfg(feature = "tls")]
let addr = addr.or_else(|| {
self.extensions()
.get::<TlsConnectInfo<TcpConnectInfo>>()
.and_then(|i| i.get_ref().local_addr())
});

addr
}

/// Get the remote address of this connection.
///
/// This will return `None` if the `IO` type used
/// does not implement `Connected` or when using a unix domain socket.
/// This currently only works on the server side.
#[cfg(feature = "server")]
pub fn remote_addr(&self) -> Option<SocketAddr> {
let addr = self
.extensions()
.get::<TcpConnectInfo>()
.and_then(|i| i.remote_addr());

#[cfg(feature = "tls")]
let addr = addr.or_else(|| {
self.extensions()
.get::<TlsConnectInfo<TcpConnectInfo>>()
.and_then(|i| i.get_ref().remote_addr())
});

addr
}

/// Get the peer certificates of the connected client.
///
/// This is used to fetch the certificates from the TLS session
/// and is mostly used for mTLS. This currently only returns
/// `Some` on the server side of the `transport` server with
/// TLS enabled connections.
#[cfg(all(feature = "server", feature = "tls"))]
pub fn peer_certs(&self) -> Option<Arc<Vec<CertificateDer<'static>>>> {
self.extensions()
.get::<TlsConnectInfo<TcpConnectInfo>>()
.and_then(|i| i.peer_certs())
}

/// Set the max duration the request is allowed to take.
///
/// Requires the server to support the `grpc-timeout` metadata, which Tonic does.
Expand Down
2 changes: 1 addition & 1 deletion tonic/src/transport/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ pub use self::channel::{Channel, Endpoint};
pub use self::error::Error;
#[doc(inline)]
#[cfg(feature = "server")]
pub use self::server::Server;
pub use self::server::{RequestExt, Server};
/// Deprecated. Please use [`crate::status::TimeoutExpired`] instead.
pub use crate::status::TimeoutExpired;

Expand Down
3 changes: 3 additions & 0 deletions tonic/src/transport/server/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

mod conn;
mod incoming;
mod request_ext;
mod service;
#[cfg(feature = "tls")]
mod tls;
Expand All @@ -25,6 +26,8 @@ pub use tls::ServerTlsConfig;
#[cfg(feature = "tls")]
pub use conn::TlsConnectInfo;

pub use self::request_ext::RequestExt;

#[cfg(feature = "tls")]
use self::service::TlsAcceptor;

Expand Down
84 changes: 84 additions & 0 deletions tonic/src/transport/server/request_ext.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
use std::net::SocketAddr;
#[cfg(feature = "tls")]
use std::sync::Arc;

#[cfg(feature = "tls")]
use tokio_rustls::rustls::pki_types::CertificateDer;

use super::TcpConnectInfo;
#[cfg(feature = "tls")]
use super::TlsConnectInfo;
use crate::Request;

mod sealed {
pub trait Sealed {}
}

impl<T> sealed::Sealed for Request<T> {}

/// An extension trait adding utility methods to [`Request`].
pub trait RequestExt: sealed::Sealed {
/// Get the local address of this connection.
///
/// This will return `None` if the `IO` type used
/// does not implement `Connected` or when using a unix domain socket.
/// This currently only works on the server side.
fn local_addr(&self) -> Option<SocketAddr>;

/// Get the remote address of this connection.
///
/// This will return `None` if the `IO` type used
/// does not implement `Connected` or when using a unix domain socket.
/// This currently only works on the server side.
fn remote_addr(&self) -> Option<SocketAddr>;

/// Get the peer certificates of the connected client.
///
/// This is used to fetch the certificates from the TLS session
/// and is mostly used for mTLS. This currently only returns
/// `Some` on the server side of the `transport` server with
/// TLS enabled connections.
#[cfg(feature = "tls")]
fn peer_certs(&self) -> Option<Arc<Vec<CertificateDer<'static>>>>;
}

impl<T> RequestExt for Request<T> {
fn local_addr(&self) -> Option<SocketAddr> {
let addr = self
.extensions()
.get::<TcpConnectInfo>()
.and_then(|i| i.local_addr());

#[cfg(feature = "tls")]
let addr = addr.or_else(|| {
self.extensions()
.get::<TlsConnectInfo<TcpConnectInfo>>()
.and_then(|i| i.get_ref().local_addr())
});

addr
}

fn remote_addr(&self) -> Option<SocketAddr> {
let addr = self
.extensions()
.get::<TcpConnectInfo>()
.and_then(|i| i.remote_addr());

#[cfg(feature = "tls")]
let addr = addr.or_else(|| {
self.extensions()
.get::<TlsConnectInfo<TcpConnectInfo>>()
.and_then(|i| i.get_ref().remote_addr())
});

addr
}

#[cfg(feature = "tls")]
fn peer_certs(&self) -> Option<Arc<Vec<CertificateDer<'static>>>> {
self.extensions()
.get::<TlsConnectInfo<TcpConnectInfo>>()
.and_then(|i| i.peer_certs())
}
}