This introduces a new Trait, NetworkStream, which abstracts over the functionality provided by TcpStream so that it can be easily mocked and extended in testing and hyper can be used for other connection sources.
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| #![feature(macro_rules)]
 | |
| 
 | |
| extern crate hyper;
 | |
| extern crate debug;
 | |
| 
 | |
| use std::io::util::copy;
 | |
| use std::io::net::ip::Ipv4Addr;
 | |
| 
 | |
| use hyper::{Get, Post};
 | |
| use hyper::header::common::ContentLength;
 | |
| use hyper::server::{Server, Incoming};
 | |
| 
 | |
| macro_rules! try_continue(
 | |
|     ($e:expr) => {{
 | |
|         match $e {
 | |
|             Ok(v) => v,
 | |
|             Err(e) => { println!("Error: {}", e); continue; }
 | |
|         }
 | |
|     }}
 | |
| )
 | |
| 
 | |
| fn echo(mut incoming: Incoming) {
 | |
|     for (mut req, mut res) in incoming {
 | |
|         match req.uri {
 | |
|             hyper::uri::AbsolutePath(ref path) => match (&req.method, path.as_slice()) {
 | |
|                 (&Get, "/") | (&Get, "/echo") => {
 | |
|                     let out = b"Try POST /echo";
 | |
| 
 | |
|                     res.headers_mut().set(ContentLength(out.len()));
 | |
|                     let mut res = try_continue!(res.start());
 | |
|                     try_continue!(res.write(out));
 | |
|                     try_continue!(res.end());
 | |
|                     continue;
 | |
|                 },
 | |
|                 (&Post, "/echo") => (), // fall through, fighting mutable borrows
 | |
|                 _ => {
 | |
|                     *res.status_mut() = hyper::status::NotFound;
 | |
|                     try_continue!(res.start().and_then(|res| res.end()));
 | |
|                     continue;
 | |
|                 }
 | |
|             },
 | |
|             _ => {
 | |
|                 try_continue!(res.start().and_then(|res| res.end()));
 | |
|                 continue;
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         let mut res = try_continue!(res.start());
 | |
|         try_continue!(copy(&mut req, &mut res));
 | |
|         try_continue!(res.end());
 | |
|     }
 | |
| }
 | |
| 
 | |
| fn main() {
 | |
|     let server = Server::http(Ipv4Addr(127, 0, 0, 1), 1337);
 | |
|     server.listen(echo).unwrap();
 | |
| }
 |