From 030ba89d5621ba5bb770d519eb68980b9da85b89 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Sun, 28 Jun 2020 01:27:42 +0200 Subject: FastCgiRequest: Add remote addr Seemed to make sense to add a new error type to group the parse errors together. --- src/lib.rs | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 5571525..fcfec03 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,7 @@ extern crate http; use std::io; use std::io::{BufReader, Write}; +use std::net::SocketAddr; use conduit::Handler; @@ -22,10 +23,28 @@ pub enum RequestError { #[snafu(display("{}", source))] InvalidHeaderValue { source: conduit::header::InvalidHeaderValue }, + + #[snafu(display("{}", source))] + InvalidRemoteAddr { source: RemoteAddrError }, } pub type RequestResult = std::result::Result; +#[derive(Debug, Snafu)] +pub enum RemoteAddrError { + #[snafu(display("Could not parse address {}: {}", address, source))] + AddrParseError { + address: String, + source: std::net::AddrParseError, + }, + + #[snafu(display("Could not parse port {}: {}", port, source))] + PortParseError { + port: String, + source: std::num::ParseIntError + }, +} + struct FastCgiRequest<'a> { request: &'a fastcgi::Request, @@ -35,6 +54,7 @@ struct FastCgiRequest<'a> { headers: conduit::HeaderMap, path: String, query: Option, + remote_addr: SocketAddr, } impl<'a> FastCgiRequest<'a> { @@ -52,6 +72,7 @@ impl<'a> FastCgiRequest<'a> { headers: headers, path: Self::path(&request), query: Self::query(&request), + remote_addr: Self::remote_addr(&request).context(InvalidRemoteAddr)?, }; Ok(r) @@ -134,6 +155,18 @@ impl<'a> FastCgiRequest<'a> { fn query(request: &'a fastcgi::Request) -> Option { request.param("QUERY_STRING") } + + fn remote_addr(request: &'a fastcgi::Request) -> Result { + let addr = request.param("REMOTE_ADDR").unwrap_or_default(); + let port = request.param("REMOTE_PORT").unwrap_or_default(); + + Ok( + SocketAddr::new( + addr.parse().context(AddrParseError { address: addr })?, + port.parse().context(PortParseError { port })?, + ) + ) + } } impl<'a> conduit::RequestExt for FastCgiRequest<'a> { @@ -166,7 +199,10 @@ impl<'a> conduit::RequestExt for FastCgiRequest<'a> { .map(|p| p.as_str()) } - fn remote_addr(&self) -> std::net::SocketAddr { todo!() } + fn remote_addr(&self) -> std::net::SocketAddr { + self.remote_addr + } + fn content_length(&self) -> std::option::Option { todo!() } fn headers(&self) -> &conduit::HeaderMap { todo!() } fn body(&mut self) -> &mut (dyn std::io::Read) { todo!() } -- cgit v1.2.3