Implement Pluggable Name-resolution (#148)

This defines a new trait `Resolver`, which turns an address into a
Vec<SocketAddr>. It also provides an implementation of Resolver for
`Fn(&str)` so it's easy to define simple resolvers with a closure.


Fixes #82

Co-authored-by: Ulrik <ulrikm@spotify.com>
This commit is contained in:
Ulrik Mikaelsson
2020-09-27 01:35:13 +02:00
committed by GitHub
parent 8bba07a9af
commit 11413726cd
7 changed files with 144 additions and 28 deletions

View File

@@ -101,6 +101,31 @@ fn connection_reuse() {
assert_eq!(resp.status(), 200);
}
#[test]
fn custom_resolver() {
use std::io::Read;
use std::net::TcpListener;
let listener = TcpListener::bind("127.0.0.1:0").unwrap();
let local_addr = listener.local_addr().unwrap();
let server = std::thread::spawn(move || {
let (mut client, _) = listener.accept().unwrap();
let mut buf = vec![0u8; 16];
let read = client.read(&mut buf).unwrap();
buf.truncate(read);
buf
});
crate::agent()
.set_resolver(move |_: &str| Ok(vec![local_addr]))
.get("http://cool.server/")
.call();
assert_eq!(&server.join().unwrap(), b"GET / HTTP/1.1\r\n");
}
#[cfg(feature = "cookie")]
#[cfg(test)]
fn cookie_and_redirect(mut stream: TcpStream) -> io::Result<()> {