mirror of https://github.com/fafhrd91/actix-web
Merge branch 'master' into separate-read-write-disconnect
This commit is contained in:
commit
be937f3858
|
@ -1,5 +1,12 @@
|
|||
# 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
|
||||
|
||||
### Added
|
||||
|
|
|
@ -826,8 +826,8 @@ impl<S: 'static> CorsBuilder<S> {
|
|||
if let AllOrSome::Some(ref origins) = cors.origins {
|
||||
let s = origins
|
||||
.iter()
|
||||
.fold(String::new(), |s, v| s + &v.to_string());
|
||||
cors.origins_str = Some(HeaderValue::try_from(s.as_str()).unwrap());
|
||||
.fold(String::new(), |s, v| format!("{}, {}", s, v));
|
||||
cors.origins_str = Some(HeaderValue::try_from(&s[2..]).unwrap());
|
||||
}
|
||||
|
||||
if !self.expose_hdrs.is_empty() {
|
||||
|
@ -1122,16 +1122,18 @@ mod tests {
|
|||
let cors = Cors::build()
|
||||
.disable_vary_header()
|
||||
.allowed_origin("https://www.example.com")
|
||||
.allowed_origin("https://www.google.com")
|
||||
.finish();
|
||||
let resp: HttpResponse = HttpResponse::Ok().into();
|
||||
let resp = cors.response(&req, resp).unwrap().response();
|
||||
assert_eq!(
|
||||
&b"https://www.example.com"[..],
|
||||
resp.headers()
|
||||
.get(header::ACCESS_CONTROL_ALLOW_ORIGIN)
|
||||
.unwrap()
|
||||
.as_bytes()
|
||||
);
|
||||
|
||||
let origins_str = resp.headers().get(header::ACCESS_CONTROL_ALLOW_ORIGIN).unwrap().to_str().unwrap();
|
||||
|
||||
if origins_str.starts_with("https://www.example.com") {
|
||||
assert_eq!("https://www.example.com, https://www.google.com", origins_str);
|
||||
} else {
|
||||
assert_eq!("https://www.google.com, https://www.example.com", origins_str);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
//! Payload stream
|
||||
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 std::cell::RefCell;
|
||||
use std::cmp;
|
||||
|
|
|
@ -378,6 +378,16 @@ where
|
|||
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) {
|
||||
'outer: loop {
|
||||
match self.decoder.decode(&mut self.buf, &self.settings) {
|
||||
|
@ -444,13 +454,7 @@ where
|
|||
}
|
||||
|
||||
// handler is not found
|
||||
self.tasks.push_back(Entry {
|
||||
pipe: EntryPipe::Error(ServerError::err(
|
||||
Version::HTTP_11,
|
||||
StatusCode::NOT_FOUND,
|
||||
)),
|
||||
flags: EntryFlags::empty(),
|
||||
});
|
||||
self.push_response_entry(StatusCode::NOT_FOUND);
|
||||
}
|
||||
Ok(Some(Message::Chunk(chunk))) => {
|
||||
if let Some(ref mut payload) = self.payload {
|
||||
|
@ -458,6 +462,7 @@ where
|
|||
} else {
|
||||
error!("Internal server error: unexpected payload chunk");
|
||||
self.flags.insert(Flags::ERROR);
|
||||
self.push_response_entry(StatusCode::INTERNAL_SERVER_ERROR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -467,6 +472,7 @@ where
|
|||
} else {
|
||||
error!("Internal server error: unexpected eof");
|
||||
self.flags.insert(Flags::ERROR);
|
||||
self.push_response_entry(StatusCode::INTERNAL_SERVER_ERROR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -488,6 +494,9 @@ where
|
|||
};
|
||||
payload.set_error(e);
|
||||
}
|
||||
|
||||
//Malformed requests should be responded with 400
|
||||
self.push_response_entry(StatusCode::BAD_REQUEST);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -666,6 +675,7 @@ mod tests {
|
|||
h1.poll_io();
|
||||
h1.poll_io();
|
||||
assert!(h1.flags.contains(Flags::ERROR));
|
||||
assert_eq!(h1.tasks.len(), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
@ -11,6 +11,7 @@ extern crate rand;
|
|||
extern crate tokio;
|
||||
extern crate tokio_reactor;
|
||||
extern crate tokio_tcp;
|
||||
extern crate tokio_current_thread as current_thread;
|
||||
|
||||
use std::io::{Read, Write};
|
||||
use std::sync::Arc;
|
||||
|
@ -28,7 +29,6 @@ use h2::client as h2client;
|
|||
use modhttp::Request;
|
||||
use rand::distributions::Alphanumeric;
|
||||
use rand::Rng;
|
||||
use tokio::executor::current_thread;
|
||||
use tokio::runtime::current_thread::Runtime;
|
||||
use tokio_tcp::TcpStream;
|
||||
|
||||
|
|
Loading…
Reference in New Issue