There are many changes involved with this, but let's just talk about
user-facing changes.
- Creating a `Client` and `Server` now needs a Tokio `Core` event loop
to attach to.
- `Request` and `Response` both no longer implement the
`std::io::{Read,Write}` traits, but instead represent their bodies as a
`futures::Stream` of items, where each item is a `Chunk`.
- The `Client.request` method now takes a `Request`, instead of being
used as a builder, and returns a `Future` that resolves to `Response`.
- The `Handler` trait for servers is no more, and instead the Tokio
`Service` trait is used. This allows interoperability with generic
middleware.
BREAKING CHANGE: A big sweeping set of breaking changes.
		
	
		
			
				
	
	
		
			54 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use std::io;
 | |
| use std::net::{SocketAddr, ToSocketAddrs};
 | |
| use std::vec;
 | |
| 
 | |
| use ::futures::{Future, Poll};
 | |
| use ::futures_cpupool::{CpuPool, CpuFuture};
 | |
| 
 | |
| #[derive(Clone)]
 | |
| pub struct Dns {
 | |
|     pool: CpuPool,
 | |
| }
 | |
| 
 | |
| impl Dns {
 | |
|     pub fn new(threads: usize) -> Dns {
 | |
|         Dns {
 | |
|             pool: CpuPool::new(threads)
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     pub fn resolve(&self, host: String, port: u16) -> Query {
 | |
|         Query(self.pool.spawn_fn(move || work(host, port)))
 | |
|     }
 | |
| }
 | |
| 
 | |
| pub struct Query(CpuFuture<IpAddrs, io::Error>);
 | |
| 
 | |
| impl Future for Query {
 | |
|     type Item = IpAddrs;
 | |
|     type Error = io::Error;
 | |
| 
 | |
|     fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
 | |
|         self.0.poll()
 | |
|     }
 | |
| }
 | |
| 
 | |
| pub struct IpAddrs {
 | |
|     iter: vec::IntoIter<SocketAddr>,
 | |
| }
 | |
| 
 | |
| impl Iterator for IpAddrs {
 | |
|     type Item = SocketAddr;
 | |
|     #[inline]
 | |
|     fn next(&mut self) -> Option<SocketAddr> {
 | |
|         self.iter.next()
 | |
|     }
 | |
| }
 | |
| 
 | |
| pub type Answer = io::Result<IpAddrs>;
 | |
| 
 | |
| fn work(hostname: String, port: u16) -> Answer {
 | |
|     debug!("resolve {:?}:{:?}", hostname, port);
 | |
|     (&*hostname, port).to_socket_addrs().map(|i| IpAddrs { iter: i })
 | |
| }
 |