use std::net::SocketAddr;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct RemoteAddr(pub SocketAddr);
#[cfg(test)]
mod tests {
use http::Request;
use topcoat_core::context::{Cx, CxTestBuilder};
use super::*;
use crate::request::remote_addr;
fn cx_with(remote: Option<SocketAddr>) -> Cx {
let mut builder = Request::builder().uri("/x");
if let Some(addr) = remote {
builder = builder.extension(RemoteAddr(addr));
}
let (parts, ()) = builder.body(()).expect("request should build").into_parts();
CxTestBuilder::new().request_context(parts).build()
}
#[test]
fn reads_the_peer_address_off_the_request() {
let addr: SocketAddr = "203.0.113.9:4242".parse().unwrap();
assert_eq!(remote_addr(&cx_with(Some(addr))), Some(addr));
}
#[test]
fn a_request_without_a_peer_address_has_none() {
assert_eq!(remote_addr(&cx_with(None)), None);
}
#[test]
fn a_context_without_a_request_has_none() {
assert_eq!(remote_addr(&CxTestBuilder::new().build()), None);
}
}