aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTeddy Wing2020-06-28 01:27:42 +0200
committerTeddy Wing2020-06-28 01:31:39 +0200
commit030ba89d5621ba5bb770d519eb68980b9da85b89 (patch)
tree44732a59178b1ecf12b5669fdf3da9272a6e7e93 /src
parent0be4106a600b2e038170d4c49136f50ad54af6b7 (diff)
downloadfastcgi-conduit-030ba89d5621ba5bb770d519eb68980b9da85b89.tar.bz2
FastCgiRequest: Add remote addr
Seemed to make sense to add a new error type to group the parse errors together.
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs38
1 files changed, 37 insertions, 1 deletions
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<T, E = RequestError> = std::result::Result<T, E>;
+#[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<String>,
+ 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<String> {
request.param("QUERY_STRING")
}
+
+ fn remote_addr(request: &'a fastcgi::Request) -> Result<SocketAddr, RemoteAddrError> {
+ 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<u64> { todo!() }
fn headers(&self) -> &conduit::HeaderMap { todo!() }
fn body(&mut self) -> &mut (dyn std::io::Read) { todo!() }