1
0
mirror of https://github.com/fafhrd91/actix-web synced 2025-07-22 00:56:15 +02:00

Compare commits

...

5 Commits

Author SHA1 Message Date
Nikolay Kim
29c3e8f7ea update test 2018-03-12 10:19:09 -07:00
Nikolay Kim
6657446433 Allow to set read buffer capacity for server request 2018-03-12 10:01:56 -07:00
Nikolay Kim
46b9a9c887 update readme 2018-03-12 09:13:04 -07:00
Nikolay Kim
b3cdb472d0 remove reserved state for h2 write if buffer is empty 2018-03-12 09:04:54 -07:00
Nikolay Kim
31e1aab9a4 do not log WouldBlock error from socket accept 2018-03-12 09:02:15 -07:00
10 changed files with 45 additions and 9 deletions

View File

@@ -1,5 +1,12 @@
# Changes # Changes
## 0.4.8 (2018-03-12)
* Allow to set read buffer capacity for server request
* Handle WouldBlock error for socket accept call
## 0.4.7 (2018-03-11) ## 0.4.7 (2018-03-11)
* Fix panic on unknown content encoding * Fix panic on unknown content encoding

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "actix-web" name = "actix-web"
version = "0.4.7" version = "0.4.8"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"] authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "Actix web is a simple, pragmatic, extremely fast, web framework for Rust." description = "Actix web is a simple, pragmatic, extremely fast, web framework for Rust."
readme = "README.md" readme = "README.md"

View File

@@ -31,7 +31,7 @@ Actix web is a simple, pragmatic, extremely fast, web framework for Rust.
## Example ## Example
```rust,ignore ```rust
extern crate actix_web; extern crate actix_web;
use actix_web::*; use actix_web::*;

View File

@@ -12,7 +12,7 @@ fn main() {
let _ = fs::remove_file(f); let _ = fs::remove_file(f);
// generates doc tests for `README.md`. // generates doc tests for `README.md`.
skeptic::generate_doc_tests( skeptic::generate_doc_tests(
&["README.md", &[// "README.md",
"guide/src/qs_1.md", "guide/src/qs_1.md",
"guide/src/qs_2.md", "guide/src/qs_2.md",
"guide/src/qs_3.md", "guide/src/qs_3.md",

View File

@@ -389,6 +389,15 @@ impl<S> HttpRequest<S> {
self.as_ref().method == Method::CONNECT self.as_ref().method == Method::CONNECT
} }
/// Set read buffer capacity
///
/// Default buffer capacity is 32Kb.
pub fn set_read_buffer_capacity(&mut self, cap: usize) {
if let Some(ref mut payload) = self.as_mut().payload {
payload.set_read_buffer_capacity(cap)
}
}
#[cfg(test)] #[cfg(test)]
pub(crate) fn payload(&self) -> &Payload { pub(crate) fn payload(&self) -> &Payload {
let msg = self.as_mut(); let msg = self.as_mut();

View File

@@ -8,6 +8,10 @@ use futures::{Async, Poll, Stream};
use error::PayloadError; use error::PayloadError;
/// max buffer size 32k
pub(crate) const MAX_BUFFER_SIZE: usize = 32_768;
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub(crate) enum PayloadStatus { pub(crate) enum PayloadStatus {
Read, Read,
@@ -76,6 +80,14 @@ impl Payload {
pub(crate) fn readall(&self) -> Option<Bytes> { pub(crate) fn readall(&self) -> Option<Bytes> {
self.inner.borrow_mut().readall() self.inner.borrow_mut().readall()
} }
#[inline]
/// Set read buffer capacity
///
/// Default buffer capacity is 32Kb.
pub fn set_read_buffer_capacity(&mut self, cap: usize) {
self.inner.borrow_mut().capacity = cap;
}
} }
impl Stream for Payload { impl Stream for Payload {
@@ -161,6 +173,7 @@ struct Inner {
err: Option<PayloadError>, err: Option<PayloadError>,
need_read: bool, need_read: bool,
items: VecDeque<Bytes>, items: VecDeque<Bytes>,
capacity: usize,
} }
impl Inner { impl Inner {
@@ -172,6 +185,7 @@ impl Inner {
err: None, err: None,
items: VecDeque::new(), items: VecDeque::new(),
need_read: true, need_read: true,
capacity: MAX_BUFFER_SIZE,
} }
} }
@@ -188,8 +202,8 @@ impl Inner {
#[inline] #[inline]
fn feed_data(&mut self, data: Bytes) { fn feed_data(&mut self, data: Bytes) {
self.len += data.len(); self.len += data.len();
self.need_read = false;
self.items.push_back(data); self.items.push_back(data);
self.need_read = self.len < self.capacity;
} }
#[inline] #[inline]
@@ -222,6 +236,7 @@ impl Inner {
fn readany(&mut self) -> Poll<Option<Bytes>, PayloadError> { fn readany(&mut self) -> Poll<Option<Bytes>, PayloadError> {
if let Some(data) = self.items.pop_front() { if let Some(data) = self.items.pop_front() {
self.len -= data.len(); self.len -= data.len();
self.need_read = self.len < self.capacity;
Ok(Async::Ready(Some(data))) Ok(Async::Ready(Some(data)))
} else if let Some(err) = self.err.take() { } else if let Some(err) = self.err.take() {
Err(err) Err(err)

View File

@@ -1396,6 +1396,7 @@ mod tests {
let mut reader = Reader::new(); let mut reader = Reader::new();
let mut req = reader_parse_ready!(reader.parse(&mut buf, &mut readbuf, &settings)); let mut req = reader_parse_ready!(reader.parse(&mut buf, &mut readbuf, &settings));
let _ = req.payload_mut().set_read_buffer_capacity(0);
assert!(req.chunked().unwrap()); assert!(req.chunked().unwrap());
assert!(!req.payload().eof()); assert!(!req.payload().eof());

View File

@@ -229,7 +229,7 @@ impl<T: AsyncWrite> Writer for H1Writer<T> {
} }
} }
if self.buffer.len() > MAX_WRITE_BUFFER_SIZE { if self.buffer.len() > self.buffer_capacity {
Ok(WriterState::Pause) Ok(WriterState::Pause)
} else { } else {
Ok(WriterState::Done) Ok(WriterState::Done)

View File

@@ -197,6 +197,7 @@ impl Writer for H2Writer {
let cap = cmp::min(self.buffer.len(), CHUNK_SIZE); let cap = cmp::min(self.buffer.len(), CHUNK_SIZE);
stream.reserve_capacity(cap); stream.reserve_capacity(cap);
} else { } else {
self.flags.remove(Flags::RESERVED);
return Ok(Async::NotReady) return Ok(Async::NotReady)
} }
} }
@@ -204,6 +205,6 @@ impl Writer for H2Writer {
} }
} }
} }
return Ok(Async::NotReady) Ok(Async::NotReady)
} }
} }

View File

@@ -172,7 +172,7 @@ impl<H> HttpServer<H> where H: IntoHttpHandler + 'static
/// Get addresses of bound sockets. /// Get addresses of bound sockets.
pub fn addrs(&self) -> Vec<net::SocketAddr> { pub fn addrs(&self) -> Vec<net::SocketAddr> {
self.sockets.iter().map(|s| s.0.clone()).collect() self.sockets.iter().map(|s| s.0).collect()
} }
/// Use listener for accepting incoming connection requests /// Use listener for accepting incoming connection requests
@@ -741,9 +741,12 @@ fn start_accept_thread(
break break
} }
}, },
Err(ref e) if connection_error(e) => continue, Err(ref e) if e.kind() == io::ErrorKind::WouldBlock =>
break,
Err(ref e) if connection_error(e) =>
continue,
Err(e) => { Err(e) => {
error!("Error accepting connection: {:?}", e); error!("Error accepting connection: {}", e);
// sleep after error // sleep after error
thread::sleep(sleep); thread::sleep(sleep);
break break