| @@ -49,3 +49,52 @@ fn test_multipart() { | ||||
|     assert_eq!(res.url().as_str(), &url); | ||||
|     assert_eq!(res.status(), reqwest::StatusCode::OK); | ||||
| } | ||||
|  | ||||
| #[test] | ||||
| fn file() { | ||||
|     let _ = env_logger::try_init(); | ||||
|  | ||||
|     let form = reqwest::multipart::Form::new() | ||||
|         .file("foo", "Cargo.lock").unwrap(); | ||||
|  | ||||
|     let fcontents = ::std::fs::read_to_string("Cargo.lock").unwrap(); | ||||
|  | ||||
|     let expected_body = format!("\ | ||||
|         --{0}\r\n\ | ||||
|         Content-Disposition: form-data; name=\"foo\"; filename=\"Cargo.lock\"\r\n\ | ||||
|         Content-Type: application/octet-stream\r\n\r\n\ | ||||
|         {1}\r\n\ | ||||
|         --{0}--\r\n\ | ||||
|     ", form.boundary(), fcontents); | ||||
|  | ||||
|     let server = server! { | ||||
|         request: format!("\ | ||||
|             POST /multipart/2 HTTP/1.1\r\n\ | ||||
|             user-agent: $USERAGENT\r\n\ | ||||
|             accept: */*\r\n\ | ||||
|             content-type: multipart/form-data; boundary={}\r\n\ | ||||
|             content-length: {}\r\n\ | ||||
|             accept-encoding: gzip\r\n\ | ||||
|             host: $HOST\r\n\ | ||||
|             \r\n\ | ||||
|             {}\ | ||||
|             ", form.boundary(), expected_body.len(), expected_body), | ||||
|         response: b"\ | ||||
|             HTTP/1.1 200 OK\r\n\ | ||||
|             Server: multipart\r\n\ | ||||
|             Content-Length: 0\r\n\ | ||||
|             \r\n\ | ||||
|             " | ||||
|     }; | ||||
|  | ||||
|     let url = format!("http://{}/multipart/2", server.addr()); | ||||
|  | ||||
|     let res = reqwest::Client::new() | ||||
|         .post(&url) | ||||
|         .multipart(form) | ||||
|         .send() | ||||
|         .unwrap(); | ||||
|  | ||||
|     assert_eq!(res.url().as_str(), &url); | ||||
|     assert_eq!(res.status(), reqwest::StatusCode::OK); | ||||
| } | ||||
|   | ||||
| @@ -32,7 +32,8 @@ static DEFAULT_USER_AGENT: &'static str = | ||||
| pub fn spawn(txns: Vec<Txn>) -> Server { | ||||
|     let listener = net::TcpListener::bind("127.0.0.1:0").unwrap(); | ||||
|     let addr = listener.local_addr().unwrap(); | ||||
|     thread::spawn( | ||||
|     let tname = format!("test({})-support-server", thread::current().name().unwrap_or("<unknown>")); | ||||
|     thread::Builder::new().name(tname).spawn( | ||||
|         move || for txn in txns { | ||||
|             let mut expected = txn.request; | ||||
|             let reply = txn.response; | ||||
| @@ -46,20 +47,41 @@ pub fn spawn(txns: Vec<Txn>) -> Server { | ||||
|                 thread::park_timeout(dur); | ||||
|             } | ||||
|  | ||||
|             let mut buf = [0; 4096]; | ||||
|             assert!(buf.len() >= expected.len()); | ||||
|             let mut buf = vec![0; expected.len() + 256]; | ||||
|  | ||||
|             let mut n = 0; | ||||
|             while n < expected.len() { | ||||
|                 match socket.read(&mut buf[n..]) { | ||||
|                     Ok(0) | Err(_) => break, | ||||
|                     Ok(0) => break, | ||||
|                     Ok(nread) => n += nread, | ||||
|                     Err(err) => { | ||||
|                         println!("server read error: {}", err); | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             match (::std::str::from_utf8(&expected), ::std::str::from_utf8(&buf[..n])) { | ||||
|                 (Ok(expected), Ok(received)) => assert_eq!(expected, received), | ||||
|                 _ => assert_eq!(expected, &buf[..n]), | ||||
|                 (Ok(expected), Ok(received)) => { | ||||
|                     assert_eq!( | ||||
|                         expected.len(), | ||||
|                         received.len(), | ||||
|                         "expected len = {}, received len = {}", | ||||
|                         expected.len(), | ||||
|                         received.len(), | ||||
|                     ); | ||||
|                     assert_eq!(expected, received) | ||||
|                 }, | ||||
|                 _ => { | ||||
|                     assert_eq!( | ||||
|                         expected.len(), | ||||
|                         n, | ||||
|                         "expected len = {}, received len = {}", | ||||
|                         expected.len(), | ||||
|                         n, | ||||
|                     ); | ||||
|                     assert_eq!(expected, &buf[..n]) | ||||
|                 }, | ||||
|             } | ||||
|  | ||||
|             if let Some(dur) = txn.response_timeout { | ||||
| @@ -86,7 +108,7 @@ pub fn spawn(txns: Vec<Txn>) -> Server { | ||||
|                 socket.write_all(&reply).unwrap(); | ||||
|             } | ||||
|         } | ||||
|     ); | ||||
|     ).expect("server thread spawn"); | ||||
|  | ||||
|     Server { | ||||
|         addr: addr, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user