Merge branch 'master' into separate-read-write-disconnect

This commit is contained in:
sapir 2018-09-23 12:43:22 +03:00 committed by GitHub
commit be937f3858
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 39 additions and 18 deletions

View File

@ -1,5 +1,12 @@
# Changes # Changes
## [0.7.9] - 2018-09-x
### Fixed
* HTTP1 decoding errors are reported to the client. #512
* Correctly compose multiple allowed origins in CORS. #517
## [0.7.8] - 2018-09-17 ## [0.7.8] - 2018-09-17
### Added ### Added

View File

@ -826,8 +826,8 @@ impl<S: 'static> CorsBuilder<S> {
if let AllOrSome::Some(ref origins) = cors.origins { if let AllOrSome::Some(ref origins) = cors.origins {
let s = origins let s = origins
.iter() .iter()
.fold(String::new(), |s, v| s + &v.to_string()); .fold(String::new(), |s, v| format!("{}, {}", s, v));
cors.origins_str = Some(HeaderValue::try_from(s.as_str()).unwrap()); cors.origins_str = Some(HeaderValue::try_from(&s[2..]).unwrap());
} }
if !self.expose_hdrs.is_empty() { if !self.expose_hdrs.is_empty() {
@ -1122,16 +1122,18 @@ mod tests {
let cors = Cors::build() let cors = Cors::build()
.disable_vary_header() .disable_vary_header()
.allowed_origin("https://www.example.com") .allowed_origin("https://www.example.com")
.allowed_origin("https://www.google.com")
.finish(); .finish();
let resp: HttpResponse = HttpResponse::Ok().into(); let resp: HttpResponse = HttpResponse::Ok().into();
let resp = cors.response(&req, resp).unwrap().response(); let resp = cors.response(&req, resp).unwrap().response();
assert_eq!(
&b"https://www.example.com"[..], let origins_str = resp.headers().get(header::ACCESS_CONTROL_ALLOW_ORIGIN).unwrap().to_str().unwrap();
resp.headers()
.get(header::ACCESS_CONTROL_ALLOW_ORIGIN) if origins_str.starts_with("https://www.example.com") {
.unwrap() assert_eq!("https://www.example.com, https://www.google.com", origins_str);
.as_bytes() } else {
); assert_eq!("https://www.google.com, https://www.example.com", origins_str);
}
} }
#[test] #[test]

View File

@ -1,6 +1,8 @@
//! Payload stream //! Payload stream
use bytes::{Bytes, BytesMut}; use bytes::{Bytes, BytesMut};
use futures::task::{current as current_task, Task}; use futures::task::Task;
#[cfg(not(test))]
use futures::task::current as current_task;
use futures::{Async, Poll, Stream}; use futures::{Async, Poll, Stream};
use std::cell::RefCell; use std::cell::RefCell;
use std::cmp; use std::cmp;

View File

@ -378,6 +378,16 @@ where
Ok(Async::NotReady) Ok(Async::NotReady)
} }
fn push_response_entry(&mut self, status: StatusCode) {
self.tasks.push_back(Entry {
pipe: EntryPipe::Error(ServerError::err(
Version::HTTP_11,
status,
)),
flags: EntryFlags::empty(),
});
}
pub fn parse(&mut self) { pub fn parse(&mut self) {
'outer: loop { 'outer: loop {
match self.decoder.decode(&mut self.buf, &self.settings) { match self.decoder.decode(&mut self.buf, &self.settings) {
@ -444,13 +454,7 @@ where
} }
// handler is not found // handler is not found
self.tasks.push_back(Entry { self.push_response_entry(StatusCode::NOT_FOUND);
pipe: EntryPipe::Error(ServerError::err(
Version::HTTP_11,
StatusCode::NOT_FOUND,
)),
flags: EntryFlags::empty(),
});
} }
Ok(Some(Message::Chunk(chunk))) => { Ok(Some(Message::Chunk(chunk))) => {
if let Some(ref mut payload) = self.payload { if let Some(ref mut payload) = self.payload {
@ -458,6 +462,7 @@ where
} else { } else {
error!("Internal server error: unexpected payload chunk"); error!("Internal server error: unexpected payload chunk");
self.flags.insert(Flags::ERROR); self.flags.insert(Flags::ERROR);
self.push_response_entry(StatusCode::INTERNAL_SERVER_ERROR);
break; break;
} }
} }
@ -467,6 +472,7 @@ where
} else { } else {
error!("Internal server error: unexpected eof"); error!("Internal server error: unexpected eof");
self.flags.insert(Flags::ERROR); self.flags.insert(Flags::ERROR);
self.push_response_entry(StatusCode::INTERNAL_SERVER_ERROR);
break; break;
} }
} }
@ -488,6 +494,9 @@ where
}; };
payload.set_error(e); payload.set_error(e);
} }
//Malformed requests should be responded with 400
self.push_response_entry(StatusCode::BAD_REQUEST);
break; break;
} }
} }
@ -666,6 +675,7 @@ mod tests {
h1.poll_io(); h1.poll_io();
h1.poll_io(); h1.poll_io();
assert!(h1.flags.contains(Flags::ERROR)); assert!(h1.flags.contains(Flags::ERROR));
assert_eq!(h1.tasks.len(), 1);
} }
#[test] #[test]

View File

@ -11,6 +11,7 @@ extern crate rand;
extern crate tokio; extern crate tokio;
extern crate tokio_reactor; extern crate tokio_reactor;
extern crate tokio_tcp; extern crate tokio_tcp;
extern crate tokio_current_thread as current_thread;
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::sync::Arc; use std::sync::Arc;
@ -28,7 +29,6 @@ use h2::client as h2client;
use modhttp::Request; use modhttp::Request;
use rand::distributions::Alphanumeric; use rand::distributions::Alphanumeric;
use rand::Rng; use rand::Rng;
use tokio::executor::current_thread;
use tokio::runtime::current_thread::Runtime; use tokio::runtime::current_thread::Runtime;
use tokio_tcp::TcpStream; use tokio_tcp::TcpStream;