BREAKING CHANGE: This breaks a lot of the Client and Server APIs. Check the documentation for how Handlers can be used for asynchronous events.
		
			
				
	
	
		
			191 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! Client Requests
 | |
| 
 | |
| use header::Headers;
 | |
| use http::RequestHead;
 | |
| use method::Method;
 | |
| use uri::RequestUri;
 | |
| use version::HttpVersion;
 | |
| 
 | |
| 
 | |
| 
 | |
| /// A client request to a remote server.
 | |
| #[derive(Debug)]
 | |
| pub struct Request<'a> {
 | |
|     head: &'a mut RequestHead
 | |
| }
 | |
| 
 | |
| impl<'a> Request<'a> {
 | |
|     /// Read the Request Url.
 | |
|     #[inline]
 | |
|     pub fn uri(&self) -> &RequestUri { &self.head.subject.1 }
 | |
| 
 | |
|     /// Readthe Request Version.
 | |
|     #[inline]
 | |
|     pub fn version(&self) -> &HttpVersion { &self.head.version }
 | |
| 
 | |
|     /// Read the Request headers.
 | |
|     #[inline]
 | |
|     pub fn headers(&self) -> &Headers { &self.head.headers }
 | |
| 
 | |
|     /// Read the Request method.
 | |
|     #[inline]
 | |
|     pub fn method(&self) -> &Method { &self.head.subject.0 }
 | |
| 
 | |
|     /// Set the Method of this request.
 | |
|     #[inline]
 | |
|     pub fn set_method(&mut self, method: Method) { self.head.subject.0 = method; }
 | |
| 
 | |
|     /// Get a mutable reference to the Request headers.
 | |
|     #[inline]
 | |
|     pub fn headers_mut(&mut self) -> &mut Headers { &mut self.head.headers }
 | |
| }
 | |
| 
 | |
| pub fn new(head: &mut RequestHead) -> Request {
 | |
|     Request { head: head }
 | |
| }
 | |
| 
 | |
| #[cfg(test)]
 | |
| mod tests {
 | |
|     /*
 | |
|     use std::io::Write;
 | |
|     use std::str::from_utf8;
 | |
|     use url::Url;
 | |
|     use method::Method::{Get, Head, Post};
 | |
|     use mock::{MockStream, MockConnector};
 | |
|     use net::Fresh;
 | |
|     use header::{ContentLength,TransferEncoding,Encoding};
 | |
|     use url::form_urlencoded;
 | |
|     use super::Request;
 | |
|     use http::h1::Http11Message;
 | |
| 
 | |
|     fn run_request(req: Request<Fresh>) -> Vec<u8> {
 | |
|         let req = req.start().unwrap();
 | |
|         let message = req.message;
 | |
|         let mut message = message.downcast::<Http11Message>().ok().unwrap();
 | |
|         message.flush_outgoing().unwrap();
 | |
|         let stream = *message
 | |
|             .into_inner().downcast::<MockStream>().ok().unwrap();
 | |
|         stream.write
 | |
|     }
 | |
| 
 | |
|     fn assert_no_body(s: &str) {
 | |
|         assert!(!s.contains("Content-Length:"));
 | |
|         assert!(!s.contains("Transfer-Encoding:"));
 | |
|     }
 | |
| 
 | |
|     #[test]
 | |
|     fn test_get_empty_body() {
 | |
|         let req = Request::with_connector(
 | |
|             Get, Url::parse("http://example.dom").unwrap(), &mut MockConnector
 | |
|         ).unwrap();
 | |
|         let bytes = run_request(req);
 | |
|         let s = from_utf8(&bytes[..]).unwrap();
 | |
|         assert_no_body(s);
 | |
|     }
 | |
| 
 | |
|     #[test]
 | |
|     fn test_head_empty_body() {
 | |
|         let req = Request::with_connector(
 | |
|             Head, Url::parse("http://example.dom").unwrap(), &mut MockConnector
 | |
|         ).unwrap();
 | |
|         let bytes = run_request(req);
 | |
|         let s = from_utf8(&bytes[..]).unwrap();
 | |
|         assert_no_body(s);
 | |
|     }
 | |
| 
 | |
|     #[test]
 | |
|     fn test_url_query() {
 | |
|         let url = Url::parse("http://example.dom?q=value").unwrap();
 | |
|         let req = Request::with_connector(
 | |
|             Get, url, &mut MockConnector
 | |
|         ).unwrap();
 | |
|         let bytes = run_request(req);
 | |
|         let s = from_utf8(&bytes[..]).unwrap();
 | |
|         assert!(s.contains("?q=value"));
 | |
|     }
 | |
| 
 | |
|     #[test]
 | |
|     fn test_post_content_length() {
 | |
|         let url = Url::parse("http://example.dom").unwrap();
 | |
|         let mut req = Request::with_connector(
 | |
|             Post, url, &mut MockConnector
 | |
|         ).unwrap();
 | |
|         let mut body = String::new();
 | |
|         form_urlencoded::Serializer::new(&mut body).append_pair("q", "value");
 | |
|         req.headers_mut().set(ContentLength(body.len() as u64));
 | |
|         let bytes = run_request(req);
 | |
|         let s = from_utf8(&bytes[..]).unwrap();
 | |
|         assert!(s.contains("Content-Length:"));
 | |
|     }
 | |
| 
 | |
|     #[test]
 | |
|     fn test_post_chunked() {
 | |
|         let url = Url::parse("http://example.dom").unwrap();
 | |
|         let req = Request::with_connector(
 | |
|             Post, url, &mut MockConnector
 | |
|         ).unwrap();
 | |
|         let bytes = run_request(req);
 | |
|         let s = from_utf8(&bytes[..]).unwrap();
 | |
|         assert!(!s.contains("Content-Length:"));
 | |
|     }
 | |
| 
 | |
|     #[test]
 | |
|     fn test_host_header() {
 | |
|         let url = Url::parse("http://example.dom").unwrap();
 | |
|         let req = Request::with_connector(
 | |
|             Get, url, &mut MockConnector
 | |
|         ).unwrap();
 | |
|         let bytes = run_request(req);
 | |
|         let s = from_utf8(&bytes[..]).unwrap();
 | |
|         assert!(s.contains("Host: example.dom"));
 | |
|     }
 | |
| 
 | |
|     #[test]
 | |
|     fn test_proxy() {
 | |
|         let url = Url::parse("http://example.dom").unwrap();
 | |
|         let mut req = Request::with_connector(
 | |
|             Get, url, &mut MockConnector
 | |
|         ).unwrap();
 | |
|         req.message.set_proxied(true);
 | |
|         let bytes = run_request(req);
 | |
|         let s = from_utf8(&bytes[..]).unwrap();
 | |
|         let request_line = "GET http://example.dom/ HTTP/1.1";
 | |
|         assert_eq!(&s[..request_line.len()], request_line);
 | |
|         assert!(s.contains("Host: example.dom"));
 | |
|     }
 | |
| 
 | |
|     #[test]
 | |
|     fn test_post_chunked_with_encoding() {
 | |
|         let url = Url::parse("http://example.dom").unwrap();
 | |
|         let mut req = Request::with_connector(
 | |
|             Post, url, &mut MockConnector
 | |
|         ).unwrap();
 | |
|         req.headers_mut().set(TransferEncoding(vec![Encoding::Chunked]));
 | |
|         let bytes = run_request(req);
 | |
|         let s = from_utf8(&bytes[..]).unwrap();
 | |
|         assert!(!s.contains("Content-Length:"));
 | |
|         assert!(s.contains("Transfer-Encoding:"));
 | |
|     }
 | |
| 
 | |
|     #[test]
 | |
|     fn test_write_error_closes() {
 | |
|         let url = Url::parse("http://hyper.rs").unwrap();
 | |
|         let req = Request::with_connector(
 | |
|             Get, url, &mut MockConnector
 | |
|         ).unwrap();
 | |
|         let mut req = req.start().unwrap();
 | |
| 
 | |
|         req.message.downcast_mut::<Http11Message>().unwrap()
 | |
|             .get_mut().downcast_mut::<MockStream>().unwrap()
 | |
|             .error_on_write = true;
 | |
| 
 | |
|         req.write(b"foo").unwrap();
 | |
|         assert!(req.flush().is_err());
 | |
| 
 | |
|         assert!(req.message.downcast_ref::<Http11Message>().unwrap()
 | |
|             .get_ref().downcast_ref::<MockStream>().unwrap()
 | |
|             .is_closed);
 | |
|     }
 | |
|     */
 | |
| }
 |