This patch renames a number of types and functions making the API more consistent. * `Server` -> `Connection` * `Client` -> `SendRequest` * `Respond` -> `SendResponse`. It also moves the handshake fns off of `Connection` and make them free fns in the module. And `Connection::builder` is removed in favor of `Builder::new`.
		
			
				
	
	
		
			99 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| extern crate env_logger;
 | |
| extern crate futures;
 | |
| extern crate h2;
 | |
| extern crate http;
 | |
| extern crate io_dump;
 | |
| extern crate tokio_core;
 | |
| 
 | |
| use h2::client;
 | |
| use h2::RecvStream;
 | |
| 
 | |
| use futures::*;
 | |
| use http::*;
 | |
| 
 | |
| use tokio_core::net::TcpStream;
 | |
| use tokio_core::reactor;
 | |
| 
 | |
| struct Process {
 | |
|     body: RecvStream,
 | |
|     trailers: bool,
 | |
| }
 | |
| 
 | |
| impl Future for Process {
 | |
|     type Item = ();
 | |
|     type Error = h2::Error;
 | |
| 
 | |
|     fn poll(&mut self) -> Poll<(), h2::Error> {
 | |
|         loop {
 | |
|             if self.trailers {
 | |
|                 let trailers = try_ready!(self.body.poll_trailers());
 | |
| 
 | |
|                 println!("GOT TRAILERS: {:?}", trailers);
 | |
| 
 | |
|                 return Ok(().into());
 | |
|             } else {
 | |
|                 match try_ready!(self.body.poll()) {
 | |
|                     Some(chunk) => {
 | |
|                         println!("GOT CHUNK = {:?}", chunk);
 | |
|                     },
 | |
|                     None => {
 | |
|                         self.trailers = true;
 | |
|                     },
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| pub fn main() {
 | |
|     let _ = env_logger::init();
 | |
| 
 | |
|     let mut core = reactor::Core::new().unwrap();
 | |
|     let handle = core.handle();
 | |
| 
 | |
|     let tcp = TcpStream::connect(&"127.0.0.1:5928".parse().unwrap(), &handle);
 | |
| 
 | |
|     let tcp = tcp.then(|res| {
 | |
|         let tcp = io_dump::Dump::to_stdout(res.unwrap());
 | |
|         client::handshake(tcp)
 | |
|     }).then(|res| {
 | |
|             let (mut client, h2) = res.unwrap();
 | |
| 
 | |
|             println!("sending request");
 | |
| 
 | |
|             let request = Request::builder()
 | |
|                 .uri("https://http2.akamai.com/")
 | |
|                 .body(())
 | |
|                 .unwrap();
 | |
| 
 | |
|             let mut trailers = HeaderMap::new();
 | |
|             trailers.insert("zomg", "hello".parse().unwrap());
 | |
| 
 | |
|             let (response, mut stream) = client.send_request(request, false).unwrap();
 | |
| 
 | |
|             // send trailers
 | |
|             stream.send_trailers(trailers).unwrap();
 | |
| 
 | |
|             // Spawn a task to run the conn...
 | |
|             handle.spawn(h2.map_err(|e| println!("GOT ERR={:?}", e)));
 | |
| 
 | |
|             response
 | |
|                 .and_then(|response| {
 | |
|                     println!("GOT RESPONSE: {:?}", response);
 | |
| 
 | |
|                     // Get the body
 | |
|                     let (_, body) = response.into_parts();
 | |
| 
 | |
|                     Process {
 | |
|                         body,
 | |
|                         trailers: false,
 | |
|                     }
 | |
|                 })
 | |
|                 .map_err(|e| {
 | |
|                     println!("GOT ERR={:?}", e);
 | |
|                 })
 | |
|         });
 | |
| 
 | |
|     core.run(tcp).unwrap();
 | |
| }
 |