Merge branch 'master' into tokio0.3

This commit is contained in:
fakeshadow 2020-12-15 16:48:29 +08:00 committed by GitHub
commit 9e6037e565
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 86 additions and 90 deletions

View File

@ -53,7 +53,7 @@ pub async fn test_server<F: ServiceFactory<TcpStream>>(factory: F) -> TestServer
test_server_with_addr(tcp, factory).await
}
/// Start [`test server`](./fn.test_server.html) on a concrete Address
/// Start [`test server`](test_server()) on a concrete Address
pub async fn test_server_with_addr<F: ServiceFactory<TcpStream>>(
tcp: net::TcpListener,
factory: F,

View File

@ -25,7 +25,7 @@ pub use crate::cookie::ParseError as CookieParseError;
use crate::helpers::Writer;
use crate::response::{Response, ResponseBuilder};
/// A specialized [`Result`](https://doc.rust-lang.org/std/result/enum.Result.html)
/// A specialized [`std::result::Result`]
/// for actix web operations
///
/// This typedef is generally used to avoid writing out

View File

@ -182,9 +182,7 @@ impl Inner {
self.len += data.len();
self.items.push_back(data);
self.need_read = self.len < MAX_BUFFER_SIZE;
if let Some(task) = self.task.take() {
task.wake()
}
self.task.wake();
}
#[cfg(test)]

View File

@ -550,8 +550,7 @@ impl fmt::Display for ContentDisposition {
write!(f, "{}", self.disposition)?;
self.parameters
.iter()
.map(|param| write!(f, "; {}", param))
.collect()
.try_for_each(|param| write!(f, "; {}", param))
}
}

View File

@ -3,7 +3,7 @@
//! ## Mime
//!
//! Several header fields use MIME values for their contents. Keeping with the
//! strongly-typed theme, the [mime](https://docs.rs/mime) crate
//! strongly-typed theme, the [mime] crate
//! is used, such as `ContentType(pub Mime)`.
#![cfg_attr(rustfmt, rustfmt_skip)]

View File

@ -8,8 +8,6 @@ use http::header::{HeaderName, HeaderValue};
/// A set of HTTP headers
///
/// `HeaderMap` is an multi-map of [`HeaderName`] to values.
///
/// [`HeaderName`]: struct.HeaderName.html
#[derive(Debug, Clone)]
pub struct HeaderMap {
pub(crate) inner: FxHashMap<HeaderName, Value>,
@ -141,8 +139,6 @@ impl HeaderMap {
/// The returned view does not incur any allocations and allows iterating
/// the values associated with the key. See [`GetAll`] for more details.
/// Returns `None` if there are no values associated with the key.
///
/// [`GetAll`]: struct.GetAll.html
pub fn get_all<N: AsName>(&self, name: N) -> GetAll<'_> {
GetAll {
idx: 0,

View File

@ -7,10 +7,12 @@ use crate::header::{HeaderValue, IntoHeaderValue, InvalidHeaderValue, Writer};
/// 1. `%x21`, or
/// 2. in the range `%x23` to `%x7E`, or
/// 3. above `%x80`
fn entity_validate_char(c: u8) -> bool {
c == 0x21 || (0x23..=0x7e).contains(&c) || (c >= 0x80)
}
fn check_slice_validity(slice: &str) -> bool {
slice
.bytes()
.all(|c| c == b'\x21' || (c >= b'\x23' && c <= b'\x7e') | (c >= b'\x80'))
slice.bytes().all(entity_validate_char)
}
/// An entity tag, defined in [RFC7232](https://tools.ietf.org/html/rfc7232#section-2.3)

View File

@ -725,9 +725,7 @@ impl Drop for Safety {
if Rc::strong_count(&self.payload) != self.level {
self.clean.set(true);
}
if let Some(task) = self.task.take() {
task.wake()
}
self.task.wake();
}
}

View File

@ -3,7 +3,7 @@
> Helper and convenience macros for Actix Web
[![crates.io](https://meritbadge.herokuapp.com/actix-web-codegen)](https://crates.io/crates/actix-web-codegen)
[![Documentation](https://docs.rs/actix-web-codegen/badge.svg)](https://docs.rs/actix-web)
[![Documentation](https://docs.rs/actix-web-codegen/badge.svg)](https://docs.rs/actix-web-codegen/0.4.0/actix_web_codegen/)
[![Version](https://img.shields.io/badge/rustc-1.42+-ab6000.svg)](https://blog.rust-lang.org/2020/03/12/Rust-1.42.html)
[![Build Status](https://travis-ci.org/actix/actix-web.svg?branch=master)](https://travis-ci.org/actix/actix-web)
[![codecov](https://codecov.io/gh/actix/actix-web/branch/master/graph/badge.svg)](https://codecov.io/gh/actix/actix-web)

View File

@ -8,7 +8,7 @@
//! are re-exported.
//!
//! # Runtime Setup
//! Used for setting up the actix async runtime. See [main] macro docs.
//! Used for setting up the actix async runtime. See [macro@main] macro docs.
//!
//! ```rust
//! #[actix_web_codegen::main] // or `#[actix_web::main]` in Actix Web apps
@ -34,7 +34,7 @@
//!
//! # Multiple Method Handlers
//! Similar to the single method handler macro but takes one or more arguments for the HTTP methods
//! it should respond to. See [route] macro docs.
//! it should respond to. See [macro@route] macro docs.
//!
//! ```rust
//! # use actix_web::HttpResponse;
@ -46,17 +46,15 @@
//! ```
//!
//! [actix-web attributes docs]: https://docs.rs/actix-web/*/actix_web/#attributes
//! [main]: attr.main.html
//! [route]: attr.route.html
//! [GET]: attr.get.html
//! [POST]: attr.post.html
//! [PUT]: attr.put.html
//! [DELETE]: attr.delete.html
//! [HEAD]: attr.head.html
//! [CONNECT]: attr.connect.html
//! [OPTIONS]: attr.options.html
//! [TRACE]: attr.trace.html
//! [PATCH]: attr.patch.html
//! [GET]: macro@get
//! [POST]: macro@post
//! [PUT]: macro@put
//! [HEAD]: macro@head
//! [CONNECT]: macro@macro@connect
//! [OPTIONS]: macro@options
//! [TRACE]: macro@trace
//! [PATCH]: macro@patch
//! [DELETE]: macro@delete
#![recursion_limit = "512"]

View File

@ -1,6 +1,6 @@
//! Websockets client
//!
//! Type definitions required to use [`awc::Client`](../struct.Client.html) as a WebSocket client.
//! Type definitions required to use [`awc::Client`](super::Client) as a WebSocket client.
//!
//! # Example
//!
@ -70,9 +70,14 @@ impl WebsocketsRequest {
<Uri as TryFrom<U>>::Error: Into<HttpError>,
{
let mut err = None;
#[allow(clippy::field_reassign_with_default)]
let mut head = {
let mut head = RequestHead::default();
head.method = Method::GET;
head.version = Version::HTTP_11;
head
};
match Uri::try_from(uri) {
Ok(uri) => head.uri = uri,

View File

@ -1,3 +1,12 @@
coverage:
status:
project:
default:
threshold: 10% # make CI green
patch:
default:
threshold: 10% # make CI green
ignore: # ignore code coverage on following paths
- "**/tests"
- "test-server"

View File

@ -141,7 +141,7 @@ impl AppConfig {
/// Server host name.
///
/// Host name is used by application router as a hostname for url generation.
/// Check [ConnectionInfo](./struct.ConnectionInfo.html#method.host)
/// Check [ConnectionInfo](super::dev::ConnectionInfo::host())
/// documentation for more information.
///
/// By default host name is set to a "localhost" value.

View File

@ -174,7 +174,7 @@ impl ConnectionInfo {
/// Do not use this function for security purposes, unless you can ensure the Forwarded and
/// X-Forwarded-For headers cannot be spoofed by the client. If you want the client's socket
/// address explicitly, use
/// [`HttpRequest::peer_addr()`](../web/struct.HttpRequest.html#method.peer_addr) instead.
/// [`HttpRequest::peer_addr()`](super::web::HttpRequest::peer_addr()) instead.
#[inline]
pub fn realip_remote_addr(&self) -> Option<&str> {
if let Some(ref r) = self.realip_remote_addr {

View File

@ -29,16 +29,16 @@
//!
//! To get started navigating the API docs, you may consider looking at the following pages first:
//!
//! * [App](struct.App.html): This struct represents an Actix web application and is used to
//! * [App]: This struct represents an Actix web application and is used to
//! configure routes and other common application settings.
//!
//! * [HttpServer](struct.HttpServer.html): This struct represents an HTTP server instance and is
//! * [HttpServer]: This struct represents an HTTP server instance and is
//! used to instantiate and configure servers.
//!
//! * [web](web/index.html): This module provides essential types for route registration as well as
//! * [web]: This module provides essential types for route registration as well as
//! common utilities for request handlers.
//!
//! * [HttpRequest](struct.HttpRequest.html) and [HttpResponse](struct.HttpResponse.html): These
//! * [HttpRequest] and [HttpResponse]: These
//! structs represent HTTP requests and responses and expose methods for creating, inspecting,
//! and otherwise utilizing them.
//!

View File

@ -192,10 +192,7 @@ impl AcceptEncoding {
};
let quality = match parts.len() {
1 => encoding.quality(),
_ => match f64::from_str(parts[1]) {
Ok(q) => q,
Err(_) => 0.0,
},
_ => f64::from_str(parts[1]).unwrap_or(0.0),
};
Some(AcceptEncoding { encoding, quality })
}

View File

@ -105,6 +105,7 @@ mod tests {
use crate::test::{self, TestRequest};
use crate::HttpResponse;
#[allow(clippy::unnecessary_wraps)]
fn render_500<B>(mut res: ServiceResponse<B>) -> Result<ErrorHandlerResponse<B>> {
res.response_mut()
.headers_mut()

View File

@ -154,6 +154,7 @@ mod tests {
use crate::test::{self, TestRequest};
use crate::HttpResponse;
#[allow(clippy::unnecessary_wraps)]
fn render_500<B>(mut res: ServiceResponse<B>) -> Result<ErrorHandlerResponse<B>> {
res.response_mut()
.headers_mut()

View File

@ -82,11 +82,10 @@ use crate::HttpResponse;
///
/// # Security
/// **\*** It is calculated using
/// [`ConnectionInfo::realip_remote_addr()`](../dev/struct.ConnectionInfo.html#method.realip_remote_addr)
/// [`ConnectionInfo::realip_remote_addr()`](crate::dev::ConnectionInfo::realip_remote_addr())
///
/// If you use this value ensure that all requests come from trusted hosts, since it is trivial
/// for the remote client to simulate being another client.
///
pub struct Logger(Rc<Inner>);
struct Inner {

View File

@ -16,24 +16,24 @@ use crate::responder::Responder;
use crate::service::{ServiceRequest, ServiceResponse};
use crate::HttpResponse;
type BoxedRouteService<Req, Res> = Box<
type BoxedRouteService = Box<
dyn Service<
Request = Req,
Response = Res,
Request = ServiceRequest,
Response = ServiceResponse,
Error = Error,
Future = LocalBoxFuture<'static, Result<Res, Error>>,
Future = LocalBoxFuture<'static, Result<ServiceResponse, Error>>,
>,
>;
type BoxedRouteNewService<Req, Res> = Box<
type BoxedRouteNewService = Box<
dyn ServiceFactory<
Config = (),
Request = Req,
Response = Res,
Request = ServiceRequest,
Response = ServiceResponse,
Error = Error,
InitError = (),
Service = BoxedRouteService<Req, Res>,
Future = LocalBoxFuture<'static, Result<BoxedRouteService<Req, Res>, ()>>,
Service = BoxedRouteService,
Future = LocalBoxFuture<'static, Result<BoxedRouteService, ()>>,
>,
>;
@ -42,7 +42,7 @@ type BoxedRouteNewService<Req, Res> = Box<
/// Route uses builder-like pattern for configuration.
/// If handler is not explicitly set, default *404 Not Found* handler is used.
pub struct Route {
service: BoxedRouteNewService<ServiceRequest, ServiceResponse>,
service: BoxedRouteNewService,
guards: Rc<Vec<Box<dyn Guard>>>,
}
@ -80,15 +80,8 @@ impl ServiceFactory for Route {
}
}
type RouteFuture = LocalBoxFuture<
'static,
Result<BoxedRouteService<ServiceRequest, ServiceResponse>, ()>,
>;
#[pin_project::pin_project]
pub struct CreateRouteService {
#[pin]
fut: RouteFuture,
fut: LocalBoxFuture<'static, Result<BoxedRouteService, ()>>,
guards: Rc<Vec<Box<dyn Guard>>>,
}
@ -96,9 +89,9 @@ impl Future for CreateRouteService {
type Output = Result<RouteService, ()>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let this = self.project();
let this = self.get_mut();
match this.fut.poll(cx)? {
match this.fut.as_mut().poll(cx)? {
Poll::Ready(service) => Poll::Ready(Ok(RouteService {
service,
guards: this.guards.clone(),
@ -109,7 +102,7 @@ impl Future for CreateRouteService {
}
pub struct RouteService {
service: BoxedRouteService<ServiceRequest, ServiceResponse>,
service: BoxedRouteService,
guards: Rc<Vec<Box<dyn Guard>>>,
}
@ -135,7 +128,7 @@ impl Service for RouteService {
}
fn call(&mut self, req: ServiceRequest) -> Self::Future {
self.service.call(req).boxed_local()
self.service.call(req)
}
}
@ -275,12 +268,12 @@ where
T::Service: 'static,
<T::Service as Service>::Future: 'static,
{
type Config = ();
type Request = ServiceRequest;
type Response = ServiceResponse;
type Error = Error;
type Config = ();
type Service = BoxedRouteService;
type InitError = ();
type Service = BoxedRouteService<ServiceRequest, Self::Response>;
type Future = LocalBoxFuture<'static, Result<Self::Service, Self::InitError>>;
fn new_service(&self, _: ()) -> Self::Future {
@ -288,8 +281,7 @@ where
.new_service(())
.map(|result| match result {
Ok(service) => {
let service: BoxedRouteService<_, _> =
Box::new(RouteServiceWrapper { service });
let service = Box::new(RouteServiceWrapper { service }) as _;
Ok(service)
}
Err(_) => Err(()),

View File

@ -213,7 +213,7 @@ where
/// Set server host name.
///
/// Host name is used by application router as a hostname for url generation.
/// Check [ConnectionInfo](./dev/struct.ConnectionInfo.html#method.host)
/// Check [ConnectionInfo](super::dev::ConnectionInfo::host())
/// documentation for more information.
///
/// By default host name is set to a "localhost" value.

View File

@ -195,13 +195,13 @@ impl ServiceRequest {
self.0.match_info()
}
/// Counterpart to [`HttpRequest::match_name`](../struct.HttpRequest.html#method.match_name).
/// Counterpart to [`HttpRequest::match_name`](super::HttpRequest::match_name()).
#[inline]
pub fn match_name(&self) -> Option<&str> {
self.0.match_name()
}
/// Counterpart to [`HttpRequest::match_pattern`](../struct.HttpRequest.html#method.match_pattern).
/// Counterpart to [`HttpRequest::match_pattern`](super::HttpRequest::match_pattern()).
#[inline]
pub fn match_pattern(&self) -> Option<String> {
self.0.match_pattern()
@ -225,7 +225,7 @@ impl ServiceRequest {
self.0.app_config()
}
/// Counterpart to [`HttpRequest::app_data`](../struct.HttpRequest.html#method.app_data).
/// Counterpart to [`HttpRequest::app_data`](super::HttpRequest::app_data()).
pub fn app_data<T: 'static>(&self) -> Option<&T> {
for container in (self.0).0.app_data.iter().rev() {
if let Some(data) = container.get::<T>() {

View File

@ -35,7 +35,7 @@ use crate::{responder::Responder, web};
/// To extract typed information from request's body, the type `T` must
/// implement the `Deserialize` trait from *serde*.
///
/// [**FormConfig**](struct.FormConfig.html) allows to configure extraction
/// [**FormConfig**](FormConfig) allows to configure extraction
/// process.
///
/// ### Example

View File

@ -31,7 +31,7 @@ use crate::{responder::Responder, web};
/// To extract typed information from request's body, the type `T` must
/// implement the `Deserialize` trait from *serde*.
///
/// [**JsonConfig**](struct.JsonConfig.html) allows to configure extraction
/// [**JsonConfig**](JsonConfig) allows to configure extraction
/// process.
///
/// ## Example
@ -142,7 +142,7 @@ impl<T: Serialize> Responder for Json<T> {
/// To extract typed information from request's body, the type `T` must
/// implement the `Deserialize` trait from *serde*.
///
/// [**JsonConfig**](struct.JsonConfig.html) allows to configure extraction
/// [**JsonConfig**](JsonConfig) allows to configure extraction
/// process.
///
/// ## Example
@ -306,7 +306,7 @@ impl Default for JsonConfig {
/// Returns error:
///
/// * content type is not `application/json`
/// (unless specified in [`JsonConfig`](struct.JsonConfig.html))
/// (unless specified in [`JsonConfig`])
/// * content length is greater than 256k
pub struct JsonBody<U> {
limit: usize,

View File

@ -15,7 +15,7 @@ use crate::FromRequest;
#[derive(PartialEq, Eq, PartialOrd, Ord)]
/// Extract typed information from the request's path.
///
/// [**PathConfig**](struct.PathConfig.html) allows to configure extraction process.
/// [**PathConfig**](PathConfig) allows to configure extraction process.
///
/// ## Example
///

View File

@ -111,7 +111,7 @@ impl FromRequest for Payload {
///
/// Loads request's payload and construct Bytes instance.
///
/// [**PayloadConfig**](struct.PayloadConfig.html) allows to configure
/// [**PayloadConfig**](PayloadConfig) allows to configure
/// extraction process.
///
/// ## Example
@ -159,7 +159,7 @@ impl FromRequest for Bytes {
///
/// Text extractor automatically decode body according to the request's charset.
///
/// [**PayloadConfig**](struct.PayloadConfig.html) allows to configure
/// [**PayloadConfig**](PayloadConfig) allows to configure
/// extraction process.
///
/// ## Example
@ -241,9 +241,10 @@ pub struct PayloadConfig {
impl PayloadConfig {
/// Create `PayloadConfig` instance and set max size of payload.
pub fn new(limit: usize) -> Self {
let mut cfg = Self::default();
cfg.limit = limit;
cfg
Self {
limit,
..Default::default()
}
}
/// Change max size of payload. By default max size is 256Kb

View File

@ -18,7 +18,7 @@ use crate::request::HttpRequest;
/// be decoded into any type which depends upon data ordering e.g. tuples or tuple-structs.
/// Attempts to do so will *fail at runtime*.
///
/// [**QueryConfig**](struct.QueryConfig.html) allows to configure extraction process.
/// [**QueryConfig**](QueryConfig) allows to configure extraction process.
///
/// ## Example
///