163 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| extern crate reqwest;
 | |
| 
 | |
| #[macro_use] mod server;
 | |
| 
 | |
| use std::io::Read;
 | |
| 
 | |
| #[test]
 | |
| fn test_get() {
 | |
|     let server = server! {
 | |
|         request: b"\
 | |
|             GET /1 HTTP/1.1\r\n\
 | |
|             Host: $HOST\r\n\
 | |
|             User-Agent: $USERAGENT\r\n\
 | |
|             \r\n\
 | |
|             ",
 | |
|         response: b"\
 | |
|             HTTP/1.1 200 OK\r\n\
 | |
|             Server: test\r\n\
 | |
|             Content-Length: 0\r\n\
 | |
|             \r\n\
 | |
|             "
 | |
|     };
 | |
| 
 | |
|     let mut res = reqwest::get(&format!("http://{}/1", server.addr())).unwrap();
 | |
|     assert_eq!(res.status(), &reqwest::StatusCode::Ok);
 | |
|     assert_eq!(res.version(), &reqwest::HttpVersion::Http11);
 | |
|     assert_eq!(res.headers().get(), Some(&reqwest::header::Server("test".to_string())));
 | |
|     assert_eq!(res.headers().get(), Some(&reqwest::header::ContentLength(0)));
 | |
| 
 | |
|     let mut buf = [0; 1024];
 | |
|     let n = res.read(&mut buf).unwrap();
 | |
|     assert_eq!(n, 0)
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_redirect_301_and_302_and_303_changes_post_to_get() {
 | |
|     let client = reqwest::Client::new().unwrap();
 | |
|     let codes = [301, 302, 303];
 | |
| 
 | |
|     for code in codes.iter() {
 | |
|         let redirect = server! {
 | |
|             request: format!("\
 | |
|                 POST /{} HTTP/1.1\r\n\
 | |
|                 Host: $HOST\r\n\
 | |
|                 User-Agent: $USERAGENT\r\n\
 | |
|                 Content-Length: 0\r\n\
 | |
|                 \r\n\
 | |
|                 ", code),
 | |
|             response: format!("\
 | |
|                 HTTP/1.1 {} reason\r\n\
 | |
|                 Server: test-redirect\r\n\
 | |
|                 Content-Length: 0\r\n\
 | |
|                 Location: /dst\r\n\
 | |
|                 Connection: close\r\n\
 | |
|                 \r\n\
 | |
|                 ", code),
 | |
| 
 | |
|             request: format!("\
 | |
|                 GET /dst HTTP/1.1\r\n\
 | |
|                 Host: $HOST\r\n\
 | |
|                 User-Agent: $USERAGENT\r\n\
 | |
|                 Referer: http://$HOST/{}\r\n\
 | |
|                 \r\n\
 | |
|                 ", code),
 | |
|             response: b"\
 | |
|                 HTTP/1.1 200 OK\r\n\
 | |
|                 Server: test-dst\r\n\
 | |
|                 Content-Length: 0\r\n\
 | |
|                 \r\n\
 | |
|                 "
 | |
|         };
 | |
| 
 | |
|         let res = client.post(&format!("http://{}/{}", redirect.addr(), code))
 | |
|             .send()
 | |
|             .unwrap();
 | |
|         assert_eq!(res.status(), &reqwest::StatusCode::Ok);
 | |
|         assert_eq!(res.headers().get(), Some(&reqwest::header::Server("test-dst".to_string())));
 | |
|     }
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_redirect_307_and_308_tries_to_post_again() {
 | |
|     let client = reqwest::Client::new().unwrap();
 | |
|     let codes = [307, 308];
 | |
|     for code in codes.iter() {
 | |
|         let redirect = server! {
 | |
|             request: format!("\
 | |
|                 POST /{} HTTP/1.1\r\n\
 | |
|                 Host: $HOST\r\n\
 | |
|                 User-Agent: $USERAGENT\r\n\
 | |
|                 Content-Length: 5\r\n\
 | |
|                 \r\n\
 | |
|                 Hello\
 | |
|                 ", code),
 | |
|             response: format!("\
 | |
|                 HTTP/1.1 {} reason\r\n\
 | |
|                 Server: test-redirect\r\n\
 | |
|                 Content-Length: 0\r\n\
 | |
|                 Location: /dst\r\n\
 | |
|                 Connection: close\r\n\
 | |
|                 \r\n\
 | |
|                 ", code),
 | |
| 
 | |
|             request: format!("\
 | |
|                 POST /dst HTTP/1.1\r\n\
 | |
|                 Host: $HOST\r\n\
 | |
|                 User-Agent: $USERAGENT\r\n\
 | |
|                 Referer: http://$HOST/{}\r\n\
 | |
|                 Content-Length: 5\r\n\
 | |
|                 \r\n\
 | |
|                 Hello\
 | |
|                 ", code),
 | |
|             response: b"\
 | |
|                 HTTP/1.1 200 OK\r\n\
 | |
|                 Server: test-dst\r\n\
 | |
|                 Content-Length: 0\r\n\
 | |
|                 \r\n\
 | |
|                 "
 | |
|         };
 | |
| 
 | |
|         let res = client.post(&format!("http://{}/{}", redirect.addr(), code))
 | |
|             .body("Hello")
 | |
|             .send()
 | |
|             .unwrap();
 | |
|         assert_eq!(res.status(), &reqwest::StatusCode::Ok);
 | |
|         assert_eq!(res.headers().get(), Some(&reqwest::header::Server("test-dst".to_string())));
 | |
|     }
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn test_redirect_307_does_not_try_if_reader_cannot_reset() {
 | |
|     let client = reqwest::Client::new().unwrap();
 | |
|     let codes = [307, 308];
 | |
|     for &code in codes.iter() {
 | |
|         let redirect = server! {
 | |
|             request: format!("\
 | |
|                 POST /{} HTTP/1.1\r\n\
 | |
|                 Host: $HOST\r\n\
 | |
|                 User-Agent: $USERAGENT\r\n\
 | |
|                 Transfer-Encoding: chunked\r\n\
 | |
|                 \r\n\
 | |
|                 5\r\n\
 | |
|                 Hello\r\n\
 | |
|                 0\r\n\r\n\
 | |
|                 ", code),
 | |
|             response: format!("\
 | |
|                 HTTP/1.1 {} reason\r\n\
 | |
|                 Server: test-redirect\r\n\
 | |
|                 Content-Length: 0\r\n\
 | |
|                 Location: /dst\r\n\
 | |
|                 Connection: close\r\n\
 | |
|                 \r\n\
 | |
|                 ", code)
 | |
|         };
 | |
| 
 | |
|         let res = client.post(&format!("http://{}/{}", redirect.addr(), code))
 | |
|             .body(reqwest::Body::new(&b"Hello"[..]))
 | |
|             .send()
 | |
|             .unwrap();
 | |
|         assert_eq!(res.status(), &reqwest::StatusCode::from_u16(code));
 | |
|     }
 | |
| }
 |