- Adds `Client::builder().enable_push(false)` to disable push - Client sends a GO_AWAY if receiving a push when it's disabled
		
			
				
	
	
		
			110 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| extern crate h2_test_support;
 | |
| use h2_test_support::prelude::*;
 | |
| 
 | |
| #[test]
 | |
| fn recv_push_works() {
 | |
|     // tests that by default, received push promises work
 | |
|     // TODO: once API exists, read the pushed response
 | |
|     let _ = ::env_logger::init();
 | |
| 
 | |
|     let (io, srv) = mock::new();
 | |
|     let mock = srv.assert_client_handshake()
 | |
|         .unwrap()
 | |
|         .recv_settings()
 | |
|         .recv_frame(
 | |
|             frames::headers(1)
 | |
|                 .request("GET", "https://http2.akamai.com/")
 | |
|                 .eos(),
 | |
|         )
 | |
|         .send_frame(
 | |
|             frames::push_promise(1, 2).request("GET", "https://http2.akamai.com/style.css"),
 | |
|         )
 | |
|         .send_frame(frames::headers(1).response(200).eos())
 | |
|         .send_frame(frames::headers(2).response(200).eos());
 | |
| 
 | |
|     let h2 = Client::handshake(io).unwrap().and_then(|mut h2| {
 | |
|         let request = Request::builder()
 | |
|             .method(Method::GET)
 | |
|             .uri("https://http2.akamai.com/")
 | |
|             .body(())
 | |
|             .unwrap();
 | |
|         let req = h2.request(request, true)
 | |
|             .unwrap()
 | |
|             .unwrap()
 | |
|             .and_then(|resp| {
 | |
|                 assert_eq!(resp.status(), StatusCode::OK);
 | |
|                 Ok(())
 | |
|             });
 | |
| 
 | |
|         h2.drive(req)
 | |
|     });
 | |
| 
 | |
|     h2.join(mock).wait().unwrap();
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| fn recv_push_when_push_disabled_is_conn_error() {
 | |
|     let _ = ::env_logger::init();
 | |
| 
 | |
|     let (io, srv) = mock::new();
 | |
|     let mock = srv.assert_client_handshake()
 | |
|         .unwrap()
 | |
|         .ignore_settings()
 | |
|         .recv_frame(
 | |
|             frames::headers(1)
 | |
|                 .request("GET", "https://http2.akamai.com/")
 | |
|                 .eos(),
 | |
|         )
 | |
|         .send_frame(
 | |
|             frames::push_promise(1, 3).request("GET", "https://http2.akamai.com/style.css"),
 | |
|         )
 | |
|         .send_frame(frames::headers(1).response(200).eos())
 | |
|         .recv_frame(frames::go_away(0).protocol_error());
 | |
| 
 | |
|     let h2 = Client::builder()
 | |
|         .enable_push(false)
 | |
|         .handshake::<_, Bytes>(io)
 | |
|         .unwrap()
 | |
|         .and_then(|mut h2| {
 | |
|             let request = Request::builder()
 | |
|                 .method(Method::GET)
 | |
|                 .uri("https://http2.akamai.com/")
 | |
|                 .body(())
 | |
|                 .unwrap();
 | |
|             let req = h2.request(request, true).unwrap().then(|res| {
 | |
|                 let err = res.unwrap_err();
 | |
|                 assert_eq!(
 | |
|                     err.to_string(),
 | |
|                     "protocol error: unspecific protocol error detected"
 | |
|                 );
 | |
|                 Ok::<(), ()>(())
 | |
|             });
 | |
| 
 | |
|             // client should see a protocol error
 | |
|             let conn = h2.then(|res| {
 | |
|                 let err = res.unwrap_err();
 | |
|                 assert_eq!(
 | |
|                     err.to_string(),
 | |
|                     "protocol error: unspecific protocol error detected"
 | |
|                 );
 | |
|                 Ok::<(), ()>(())
 | |
|             });
 | |
| 
 | |
|             conn.unwrap().join(req)
 | |
|         });
 | |
| 
 | |
|     h2.join(mock).wait().unwrap();
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| #[ignore]
 | |
| fn recv_push_promise_with_unsafe_method_is_stream_error() {
 | |
|     // for instance, when :method = POST
 | |
| }
 | |
| 
 | |
| #[test]
 | |
| #[ignore]
 | |
| fn recv_push_promise_with_wrong_authority_is_stream_error() {
 | |
|     // if server is foo.com, :authority = bar.com is stream error
 | |
| }
 |