From 4096089a3f49d4454013fbc11718c12aea241d48 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Fri, 16 Mar 2018 08:48:44 -0700 Subject: [PATCH] allow to disable http/2 support --- CHANGES.md | 4 +++- src/server/srv.rs | 28 +++++++++++++++++++--------- src/server/worker.rs | 3 ++- src/test.rs | 7 +++++-- tests/test_server.rs | 4 ++-- 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index cfd234642..c5d8edc95 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,8 @@ # Changes -## 0.4.9 (2018-03-xx) +## 0.4.9 (2018-03-16) + +* Allow to disable http/2 support * Wake payload reading task when data is available diff --git a/src/server/srv.rs b/src/server/srv.rs index 5d181c51e..836c6395e 100644 --- a/src/server/srv.rs +++ b/src/server/srv.rs @@ -41,6 +41,7 @@ pub struct HttpServer where H: IntoHttpHandler + 'static exit: bool, shutdown_timeout: u16, signals: Option>, + no_http2: bool, no_signals: bool, } @@ -89,6 +90,7 @@ impl HttpServer where H: IntoHttpHandler + 'static exit: false, shutdown_timeout: 30, signals: None, + no_http2: false, no_signals: false, } } @@ -170,6 +172,12 @@ impl HttpServer where H: IntoHttpHandler + 'static self } + /// Disable `HTTP/2` support + pub fn no_http2(mut self) -> Self { + self.no_http2 = true; + self + } + /// Get addresses of bound sockets. pub fn addrs(&self) -> Vec { self.sockets.iter().map(|s| s.0).collect() @@ -396,15 +404,17 @@ impl HttpServer Err(io::Error::new(io::ErrorKind::Other, "No socket addresses are bound")) } else { // alpn support - builder.set_alpn_protos(b"\x02h2\x08http/1.1")?; - builder.set_alpn_select_callback(|_, protos| { - const H2: &[u8] = b"\x02h2"; - if protos.windows(3).any(|window| window == H2) { - Ok(b"h2") - } else { - Err(AlpnError::NOACK) - } - }); + if !self.no_http2 { + builder.set_alpn_protos(b"\x02h2\x08http/1.1")?; + builder.set_alpn_select_callback(|_, protos| { + const H2: &[u8] = b"\x02h2"; + if protos.windows(3).any(|window| window == H2) { + Ok(b"h2") + } else { + Err(AlpnError::NOACK) + } + }); + } let (tx, rx) = mpsc::unbounded(); let acceptor = builder.build(); diff --git a/src/server/worker.rs b/src/server/worker.rs index 02fa7453c..a8ca3b2ac 100644 --- a/src/server/worker.rs +++ b/src/server/worker.rs @@ -204,7 +204,8 @@ impl StreamHandlerType { } else { false }; - Arbiter::handle().spawn(HttpChannel::new(h, io, peer, http2)); + Arbiter::handle().spawn( + HttpChannel::new(h, io, peer, http2)); }, Err(err) => trace!("Error during handling tls connection: {}", err), diff --git a/src/test.rs b/src/test.rs index 7173f9c32..041ceaab8 100644 --- a/src/test.rs +++ b/src/test.rs @@ -87,9 +87,12 @@ impl TestServer { let sys = System::new("actix-test-server"); let tcp = net::TcpListener::bind("127.0.0.1:0").unwrap(); let local_addr = tcp.local_addr().unwrap(); - let tcp = TcpListener::from_listener(tcp, &local_addr, Arbiter::handle()).unwrap(); + let tcp = TcpListener::from_listener( + tcp, &local_addr, Arbiter::handle()).unwrap(); - HttpServer::new(factory).disable_signals().start_incoming(tcp.incoming(), false); + HttpServer::new(factory) + .disable_signals() + .start_incoming(tcp.incoming(), false); tx.send((Arbiter::system(), local_addr)).unwrap(); let _ = sys.run(); diff --git a/tests/test_server.rs b/tests/test_server.rs index cf682468a..10f71ab2f 100644 --- a/tests/test_server.rs +++ b/tests/test_server.rs @@ -742,8 +742,8 @@ fn test_h2() { }) }) }); - let _res = core.run(tcp); - // assert_eq!(_res.unwrap(), Bytes::from_static(STR.as_ref())); + let res = core.run(tcp); + assert_eq!(res.unwrap(), Bytes::from_static(STR.as_ref())); } #[test]