Read local_addr from socket
This commit is contained in:
@@ -48,6 +48,7 @@ impl<T: AsRef<[u8]> + Send + Sync + 'static> From<http::Response<T>> for Respons
|
|||||||
.collect::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
reader: Box::new(Cursor::new(value.into_body())),
|
reader: Box::new(Cursor::new(value.into_body())),
|
||||||
remote_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 80),
|
remote_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 80),
|
||||||
|
local_addr: None,
|
||||||
history: vec![],
|
history: vec![],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,6 +78,9 @@ pub struct Response {
|
|||||||
pub(crate) reader: Box<dyn Read + Send + Sync + 'static>,
|
pub(crate) reader: Box<dyn Read + Send + Sync + 'static>,
|
||||||
/// The socket address of the server that sent the response.
|
/// The socket address of the server that sent the response.
|
||||||
pub(crate) remote_addr: SocketAddr,
|
pub(crate) remote_addr: SocketAddr,
|
||||||
|
/// Local address request was sent from. Only set if necessary since
|
||||||
|
/// it is an extra system call.
|
||||||
|
pub(crate) local_addr: Option<SocketAddr>,
|
||||||
/// The redirect history of this response, if any. The history starts with
|
/// The redirect history of this response, if any. The history starts with
|
||||||
/// the first response received and ends with the response immediately
|
/// the first response received and ends with the response immediately
|
||||||
/// previous to this one.
|
/// previous to this one.
|
||||||
@@ -232,6 +235,13 @@ impl Response {
|
|||||||
self.remote_addr
|
self.remote_addr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The local address the request was made from.
|
||||||
|
///
|
||||||
|
/// This is only available if [`AgentBuilder::get_local_addr()`][crate::AgentBuilder] is set to true.
|
||||||
|
pub fn local_addr(&self) -> Option<SocketAddr> {
|
||||||
|
self.local_addr
|
||||||
|
}
|
||||||
|
|
||||||
/// Turn this response into a `impl Read` of the body.
|
/// Turn this response into a `impl Read` of the body.
|
||||||
///
|
///
|
||||||
/// 1. If `Transfer-Encoding: chunked`, the returned reader will unchunk it
|
/// 1. If `Transfer-Encoding: chunked`, the returned reader will unchunk it
|
||||||
@@ -533,6 +543,15 @@ impl Response {
|
|||||||
/// assert_eq!(resp.status(), 401);
|
/// assert_eq!(resp.status(), 401);
|
||||||
pub(crate) fn do_from_stream(stream: Stream, unit: Unit) -> Result<Response, Error> {
|
pub(crate) fn do_from_stream(stream: Stream, unit: Unit) -> Result<Response, Error> {
|
||||||
let remote_addr = stream.remote_addr;
|
let remote_addr = stream.remote_addr;
|
||||||
|
|
||||||
|
// Only read local_addr if configured to do so, since it's another syscall.
|
||||||
|
let mut local_addr = None;
|
||||||
|
if unit.agent.config.get_local_addr {
|
||||||
|
if let Some(socket) = stream.socket() {
|
||||||
|
local_addr = Some(socket.local_addr()?);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// HTTP/1.1 200 OK\r\n
|
// HTTP/1.1 200 OK\r\n
|
||||||
let mut stream = stream::DeadlineStream::new(stream, unit.deadline);
|
let mut stream = stream::DeadlineStream::new(stream, unit.deadline);
|
||||||
@@ -581,6 +600,7 @@ impl Response {
|
|||||||
headers,
|
headers,
|
||||||
reader,
|
reader,
|
||||||
remote_addr,
|
remote_addr,
|
||||||
|
local_addr,
|
||||||
history: vec![],
|
history: vec![],
|
||||||
};
|
};
|
||||||
Ok(response)
|
Ok(response)
|
||||||
|
|||||||
Reference in New Issue
Block a user