mirror of
https://github.com/fafhrd91/actix-web
synced 2025-02-17 10:13:30 +01:00
Check format and tweak CI config (#1619)
This commit is contained in:
parent
701bdacfa2
commit
92b5bcd13f
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -15,6 +15,7 @@ Check your PR fulfills the following:
|
|||||||
- [ ] Tests for the changes have been added / updated.
|
- [ ] Tests for the changes have been added / updated.
|
||||||
- [ ] Documentation comments have been added / updated.
|
- [ ] Documentation comments have been added / updated.
|
||||||
- [ ] A changelog entry has been made for the appropriate packages.
|
- [ ] A changelog entry has been made for the appropriate packages.
|
||||||
|
- [ ] Format code with the latest stable rustfmt
|
||||||
|
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
7
.github/workflows/bench.yml
vendored
7
.github/workflows/bench.yml
vendored
@ -1,6 +1,11 @@
|
|||||||
name: Benchmark (Linux)
|
name: Benchmark (Linux)
|
||||||
|
|
||||||
on: [push, pull_request]
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize, reopened]
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check_benchmark:
|
check_benchmark:
|
||||||
|
32
.github/workflows/clippy-fmt.yml
vendored
Normal file
32
.github/workflows/clippy-fmt.yml
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize, reopened]
|
||||||
|
|
||||||
|
name: Clippy and rustfmt Check
|
||||||
|
jobs:
|
||||||
|
clippy_check:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
components: rustfmt
|
||||||
|
override: true
|
||||||
|
- name: Check with rustfmt
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: fmt
|
||||||
|
args: --all -- --check
|
||||||
|
|
||||||
|
- uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: nightly
|
||||||
|
components: clippy
|
||||||
|
override: true
|
||||||
|
- name: Check with Clippy
|
||||||
|
uses: actions-rs/clippy-check@v1
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
args: --all-features --all --tests
|
7
.github/workflows/linux.yml
vendored
7
.github/workflows/linux.yml
vendored
@ -1,6 +1,11 @@
|
|||||||
name: CI (Linux)
|
name: CI (Linux)
|
||||||
|
|
||||||
on: [push, pull_request]
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize, reopened]
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build_and_test:
|
build_and_test:
|
||||||
|
7
.github/workflows/macos.yml
vendored
7
.github/workflows/macos.yml
vendored
@ -1,6 +1,11 @@
|
|||||||
name: CI (macOS)
|
name: CI (macOS)
|
||||||
|
|
||||||
on: [push, pull_request]
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize, reopened]
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build_and_test:
|
build_and_test:
|
||||||
|
7
.github/workflows/windows.yml
vendored
7
.github/workflows/windows.yml
vendored
@ -1,6 +1,11 @@
|
|||||||
name: CI (Windows)
|
name: CI (Windows)
|
||||||
|
|
||||||
on: [push, pull_request]
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize, reopened]
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
env:
|
env:
|
||||||
VCPKGRS_DYNAMIC: 1
|
VCPKGRS_DYNAMIC: 1
|
||||||
|
@ -26,7 +26,6 @@ use actix_web::{web, FromRequest, HttpRequest, HttpResponse};
|
|||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use futures_core::Stream;
|
use futures_core::Stream;
|
||||||
use futures_util::future::{ok, ready, Either, FutureExt, LocalBoxFuture, Ready};
|
use futures_util::future::{ok, ready, Either, FutureExt, LocalBoxFuture, Ready};
|
||||||
use mime;
|
|
||||||
use mime_guess::from_ext;
|
use mime_guess::from_ext;
|
||||||
use percent_encoding::{utf8_percent_encode, CONTROLS};
|
use percent_encoding::{utf8_percent_encode, CONTROLS};
|
||||||
use v_htmlescape::escape as escape_html_entity;
|
use v_htmlescape::escape as escape_html_entity;
|
||||||
@ -250,6 +249,8 @@ pub struct Files {
|
|||||||
renderer: Rc<DirectoryRenderer>,
|
renderer: Rc<DirectoryRenderer>,
|
||||||
mime_override: Option<Rc<MimeOverride>>,
|
mime_override: Option<Rc<MimeOverride>>,
|
||||||
file_flags: named::Flags,
|
file_flags: named::Flags,
|
||||||
|
// FIXME: Should re-visit later.
|
||||||
|
#[allow(clippy::redundant_allocation)]
|
||||||
guards: Option<Rc<Box<dyn Guard>>>,
|
guards: Option<Rc<Box<dyn Guard>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -462,6 +463,8 @@ pub struct FilesService {
|
|||||||
renderer: Rc<DirectoryRenderer>,
|
renderer: Rc<DirectoryRenderer>,
|
||||||
mime_override: Option<Rc<MimeOverride>>,
|
mime_override: Option<Rc<MimeOverride>>,
|
||||||
file_flags: named::Flags,
|
file_flags: named::Flags,
|
||||||
|
// FIXME: Should re-visit later.
|
||||||
|
#[allow(clippy::redundant_allocation)]
|
||||||
guards: Option<Rc<Box<dyn Guard>>>,
|
guards: Option<Rc<Box<dyn Guard>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -501,11 +504,8 @@ impl Service for FilesService {
|
|||||||
// execute user defined guards
|
// execute user defined guards
|
||||||
(**guard).check(req.head())
|
(**guard).check(req.head())
|
||||||
} else {
|
} else {
|
||||||
// default behaviour
|
// default behavior
|
||||||
match *req.method() {
|
matches!(*req.method(), Method::HEAD | Method::GET)
|
||||||
Method::HEAD | Method::GET => true,
|
|
||||||
_ => false,
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if !is_method_valid {
|
if !is_method_valid {
|
||||||
@ -952,9 +952,7 @@ mod tests {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_named_file_content_range_headers() {
|
async fn test_named_file_content_range_headers() {
|
||||||
let srv = test::start(|| {
|
let srv = test::start(|| App::new().service(Files::new("/", ".")));
|
||||||
App::new().service(Files::new("/", "."))
|
|
||||||
});
|
|
||||||
|
|
||||||
// Valid range header
|
// Valid range header
|
||||||
let response = srv
|
let response = srv
|
||||||
@ -979,9 +977,7 @@ mod tests {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_named_file_content_length_headers() {
|
async fn test_named_file_content_length_headers() {
|
||||||
let srv = test::start(|| {
|
let srv = test::start(|| App::new().service(Files::new("/", ".")));
|
||||||
App::new().service(Files::new("/", "."))
|
|
||||||
});
|
|
||||||
|
|
||||||
// Valid range header
|
// Valid range header
|
||||||
let response = srv
|
let response = srv
|
||||||
@ -1020,15 +1016,9 @@ mod tests {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_head_content_length_headers() {
|
async fn test_head_content_length_headers() {
|
||||||
let srv = test::start(|| {
|
let srv = test::start(|| App::new().service(Files::new("/", ".")));
|
||||||
App::new().service(Files::new("/", "."))
|
|
||||||
});
|
|
||||||
|
|
||||||
let response = srv
|
let response = srv.head("/tests/test.binary").send().await.unwrap();
|
||||||
.head("/tests/test.binary")
|
|
||||||
.send()
|
|
||||||
.await
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let content_length = response
|
let content_length = response
|
||||||
.headers()
|
.headers()
|
||||||
@ -1097,12 +1087,10 @@ mod tests {
|
|||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_named_file_content_encoding() {
|
async fn test_named_file_content_encoding() {
|
||||||
let mut srv = test::init_service(App::new().wrap(Compress::default()).service(
|
let mut srv = test::init_service(App::new().wrap(Compress::default()).service(
|
||||||
web::resource("/").to(|| {
|
web::resource("/").to(|| async {
|
||||||
async {
|
NamedFile::open("Cargo.toml")
|
||||||
NamedFile::open("Cargo.toml")
|
.unwrap()
|
||||||
.unwrap()
|
.set_content_encoding(header::ContentEncoding::Identity)
|
||||||
.set_content_encoding(header::ContentEncoding::Identity)
|
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
))
|
))
|
||||||
.await;
|
.await;
|
||||||
@ -1119,12 +1107,10 @@ mod tests {
|
|||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_named_file_content_encoding_gzip() {
|
async fn test_named_file_content_encoding_gzip() {
|
||||||
let mut srv = test::init_service(App::new().wrap(Compress::default()).service(
|
let mut srv = test::init_service(App::new().wrap(Compress::default()).service(
|
||||||
web::resource("/").to(|| {
|
web::resource("/").to(|| async {
|
||||||
async {
|
NamedFile::open("Cargo.toml")
|
||||||
NamedFile::open("Cargo.toml")
|
.unwrap()
|
||||||
.unwrap()
|
.set_content_encoding(header::ContentEncoding::Gzip)
|
||||||
.set_content_encoding(header::ContentEncoding::Gzip)
|
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
))
|
))
|
||||||
.await;
|
.await;
|
||||||
|
@ -8,7 +8,6 @@ use std::time::{SystemTime, UNIX_EPOCH};
|
|||||||
use std::os::unix::fs::MetadataExt;
|
use std::os::unix::fs::MetadataExt;
|
||||||
|
|
||||||
use bitflags::bitflags;
|
use bitflags::bitflags;
|
||||||
use mime;
|
|
||||||
use mime_guess::from_path;
|
use mime_guess::from_path;
|
||||||
|
|
||||||
use actix_http::body::SizedStream;
|
use actix_http::body::SizedStream;
|
||||||
@ -90,7 +89,7 @@ impl NamedFile {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let ct = from_path(&path).first_or_octet_stream();
|
let ct = from_path(&path).first_or_octet_stream();
|
||||||
let disposition_type = match ct.type_() {
|
let disposition = match ct.type_() {
|
||||||
mime::IMAGE | mime::TEXT | mime::VIDEO => DispositionType::Inline,
|
mime::IMAGE | mime::TEXT | mime::VIDEO => DispositionType::Inline,
|
||||||
_ => DispositionType::Attachment,
|
_ => DispositionType::Attachment,
|
||||||
};
|
};
|
||||||
@ -104,8 +103,8 @@ impl NamedFile {
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
let cd = ContentDisposition {
|
let cd = ContentDisposition {
|
||||||
disposition: disposition_type,
|
disposition,
|
||||||
parameters: parameters,
|
parameters,
|
||||||
};
|
};
|
||||||
(ct, cd)
|
(ct, cd)
|
||||||
};
|
};
|
||||||
|
@ -21,12 +21,7 @@ pub enum BodySize {
|
|||||||
|
|
||||||
impl BodySize {
|
impl BodySize {
|
||||||
pub fn is_eof(&self) -> bool {
|
pub fn is_eof(&self) -> bool {
|
||||||
match self {
|
matches!(self, BodySize::None | BodySize::Empty | BodySize::Sized(0))
|
||||||
BodySize::None
|
|
||||||
| BodySize::Empty
|
|
||||||
| BodySize::Sized(0) => true,
|
|
||||||
_ => false,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -470,9 +465,9 @@ where
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use futures_util::stream;
|
|
||||||
use futures_util::future::poll_fn;
|
use futures_util::future::poll_fn;
|
||||||
use futures_util::pin_mut;
|
use futures_util::pin_mut;
|
||||||
|
use futures_util::stream;
|
||||||
|
|
||||||
impl Body {
|
impl Body {
|
||||||
pub(crate) fn get_ref(&self) -> &[u8] {
|
pub(crate) fn get_ref(&self) -> &[u8] {
|
||||||
@ -606,10 +601,6 @@ mod tests {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_body_eq() {
|
async fn test_body_eq() {
|
||||||
assert!(Body::None == Body::None);
|
|
||||||
assert!(Body::None != Body::Empty);
|
|
||||||
assert!(Body::Empty == Body::Empty);
|
|
||||||
assert!(Body::Empty != Body::None);
|
|
||||||
assert!(
|
assert!(
|
||||||
Body::Bytes(Bytes::from_static(b"1"))
|
Body::Bytes(Bytes::from_static(b"1"))
|
||||||
== Body::Bytes(Bytes::from_static(b"1"))
|
== Body::Bytes(Bytes::from_static(b"1"))
|
||||||
@ -621,7 +612,7 @@ mod tests {
|
|||||||
async fn test_body_debug() {
|
async fn test_body_debug() {
|
||||||
assert!(format!("{:?}", Body::None).contains("Body::None"));
|
assert!(format!("{:?}", Body::None).contains("Body::None"));
|
||||||
assert!(format!("{:?}", Body::Empty).contains("Body::Empty"));
|
assert!(format!("{:?}", Body::Empty).contains("Body::Empty"));
|
||||||
assert!(format!("{:?}", Body::Bytes(Bytes::from_static(b"1"))).contains("1"));
|
assert!(format!("{:?}", Body::Bytes(Bytes::from_static(b"1"))).contains('1'));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
|
@ -37,7 +37,10 @@ where
|
|||||||
trace!("Sending client request: {:?} {:?}", head, body.size());
|
trace!("Sending client request: {:?} {:?}", head, body.size());
|
||||||
let head_req = head.as_ref().method == Method::HEAD;
|
let head_req = head.as_ref().method == Method::HEAD;
|
||||||
let length = body.size();
|
let length = body.size();
|
||||||
let eof = matches!(length, BodySize::None | BodySize::Empty | BodySize::Sized(0));
|
let eof = matches!(
|
||||||
|
length,
|
||||||
|
BodySize::None | BodySize::Empty | BodySize::Sized(0)
|
||||||
|
);
|
||||||
|
|
||||||
let mut req = Request::new(());
|
let mut req = Request::new(());
|
||||||
*req.uri_mut() = head.as_ref().uri.clone();
|
*req.uri_mut() = head.as_ref().uri.clone();
|
||||||
|
@ -69,10 +69,7 @@ where
|
|||||||
inner: Rc::downgrade(&inner_rc),
|
inner: Rc::downgrade(&inner_rc),
|
||||||
});
|
});
|
||||||
|
|
||||||
ConnectionPool(
|
ConnectionPool(connector_rc, inner_rc)
|
||||||
connector_rc,
|
|
||||||
inner_rc,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -964,7 +964,6 @@ impl ResponseError for actix::actors::resolver::ResolverError {}
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use http::{Error as HttpError, StatusCode};
|
use http::{Error as HttpError, StatusCode};
|
||||||
use httparse;
|
|
||||||
use std::io;
|
use std::io;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -72,7 +72,7 @@ impl fmt::Debug for Extensions {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_remove() {
|
fn test_remove() {
|
||||||
let mut map = Extensions::new();
|
let mut map = Extensions::new();
|
||||||
|
@ -132,19 +132,11 @@ where
|
|||||||
B: MessageBody,
|
B: MessageBody,
|
||||||
{
|
{
|
||||||
fn is_empty(&self) -> bool {
|
fn is_empty(&self) -> bool {
|
||||||
if let State::None = self {
|
matches!(self, State::None)
|
||||||
true
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_call(&self) -> bool {
|
fn is_call(&self) -> bool {
|
||||||
if let State::ServiceCall(_) = self {
|
matches!(self, State::ServiceCall(_))
|
||||||
true
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
enum PollResponse {
|
enum PollResponse {
|
||||||
|
@ -303,55 +303,59 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
ServiceResponseStateProj::SendPayload(ref mut stream, ref mut body) => loop {
|
ServiceResponseStateProj::SendPayload(ref mut stream, ref mut body) => {
|
||||||
loop {
|
loop {
|
||||||
if let Some(ref mut buffer) = this.buffer {
|
loop {
|
||||||
match stream.poll_capacity(cx) {
|
if let Some(ref mut buffer) = this.buffer {
|
||||||
Poll::Pending => return Poll::Pending,
|
match stream.poll_capacity(cx) {
|
||||||
Poll::Ready(None) => return Poll::Ready(()),
|
Poll::Pending => return Poll::Pending,
|
||||||
Poll::Ready(Some(Ok(cap))) => {
|
Poll::Ready(None) => return Poll::Ready(()),
|
||||||
let len = buffer.len();
|
Poll::Ready(Some(Ok(cap))) => {
|
||||||
let bytes = buffer.split_to(std::cmp::min(cap, len));
|
let len = buffer.len();
|
||||||
|
let bytes = buffer.split_to(std::cmp::min(cap, len));
|
||||||
|
|
||||||
if let Err(e) = stream.send_data(bytes, false) {
|
if let Err(e) = stream.send_data(bytes, false) {
|
||||||
|
warn!("{:?}", e);
|
||||||
|
return Poll::Ready(());
|
||||||
|
} else if !buffer.is_empty() {
|
||||||
|
let cap =
|
||||||
|
std::cmp::min(buffer.len(), CHUNK_SIZE);
|
||||||
|
stream.reserve_capacity(cap);
|
||||||
|
} else {
|
||||||
|
this.buffer.take();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Poll::Ready(Some(Err(e))) => {
|
||||||
warn!("{:?}", e);
|
warn!("{:?}", e);
|
||||||
return Poll::Ready(());
|
return Poll::Ready(());
|
||||||
} else if !buffer.is_empty() {
|
|
||||||
let cap = std::cmp::min(buffer.len(), CHUNK_SIZE);
|
|
||||||
stream.reserve_capacity(cap);
|
|
||||||
} else {
|
|
||||||
this.buffer.take();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Poll::Ready(Some(Err(e))) => {
|
} else {
|
||||||
warn!("{:?}", e);
|
match body.as_mut().poll_next(cx) {
|
||||||
return Poll::Ready(());
|
Poll::Pending => return Poll::Pending,
|
||||||
}
|
Poll::Ready(None) => {
|
||||||
}
|
if let Err(e) = stream.send_data(Bytes::new(), true)
|
||||||
} else {
|
{
|
||||||
match body.as_mut().poll_next(cx) {
|
warn!("{:?}", e);
|
||||||
Poll::Pending => return Poll::Pending,
|
}
|
||||||
Poll::Ready(None) => {
|
return Poll::Ready(());
|
||||||
if let Err(e) = stream.send_data(Bytes::new(), true) {
|
}
|
||||||
warn!("{:?}", e);
|
Poll::Ready(Some(Ok(chunk))) => {
|
||||||
|
stream.reserve_capacity(std::cmp::min(
|
||||||
|
chunk.len(),
|
||||||
|
CHUNK_SIZE,
|
||||||
|
));
|
||||||
|
*this.buffer = Some(chunk);
|
||||||
|
}
|
||||||
|
Poll::Ready(Some(Err(e))) => {
|
||||||
|
error!("Response payload stream error: {:?}", e);
|
||||||
|
return Poll::Ready(());
|
||||||
}
|
}
|
||||||
return Poll::Ready(());
|
|
||||||
}
|
|
||||||
Poll::Ready(Some(Ok(chunk))) => {
|
|
||||||
stream.reserve_capacity(std::cmp::min(
|
|
||||||
chunk.len(),
|
|
||||||
CHUNK_SIZE,
|
|
||||||
));
|
|
||||||
*this.buffer = Some(chunk);
|
|
||||||
}
|
|
||||||
Poll::Ready(Some(Err(e))) => {
|
|
||||||
error!("Response payload stream error: {:?}", e);
|
|
||||||
return Poll::Ready(());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use http::Method;
|
|
||||||
use http::header;
|
use http::header;
|
||||||
|
use http::Method;
|
||||||
|
|
||||||
header! {
|
header! {
|
||||||
/// `Allow` header, defined in [RFC7231](http://tools.ietf.org/html/rfc7231#section-7.4.1)
|
/// `Allow` header, defined in [RFC7231](http://tools.ietf.org/html/rfc7231#section-7.4.1)
|
||||||
|
@ -9,11 +9,13 @@
|
|||||||
|
|
||||||
pub use self::accept_charset::AcceptCharset;
|
pub use self::accept_charset::AcceptCharset;
|
||||||
//pub use self::accept_encoding::AcceptEncoding;
|
//pub use self::accept_encoding::AcceptEncoding;
|
||||||
pub use self::accept_language::AcceptLanguage;
|
|
||||||
pub use self::accept::Accept;
|
pub use self::accept::Accept;
|
||||||
|
pub use self::accept_language::AcceptLanguage;
|
||||||
pub use self::allow::Allow;
|
pub use self::allow::Allow;
|
||||||
pub use self::cache_control::{CacheControl, CacheDirective};
|
pub use self::cache_control::{CacheControl, CacheDirective};
|
||||||
pub use self::content_disposition::{ContentDisposition, DispositionType, DispositionParam};
|
pub use self::content_disposition::{
|
||||||
|
ContentDisposition, DispositionParam, DispositionType,
|
||||||
|
};
|
||||||
pub use self::content_language::ContentLanguage;
|
pub use self::content_language::ContentLanguage;
|
||||||
pub use self::content_range::{ContentRange, ContentRangeSpec};
|
pub use self::content_range::{ContentRange, ContentRangeSpec};
|
||||||
pub use self::content_type::ContentType;
|
pub use self::content_type::ContentType;
|
||||||
@ -47,7 +49,7 @@ macro_rules! __hyper__deref {
|
|||||||
&mut self.0
|
&mut self.0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
@ -74,8 +76,8 @@ macro_rules! test_header {
|
|||||||
($id:ident, $raw:expr) => {
|
($id:ident, $raw:expr) => {
|
||||||
#[test]
|
#[test]
|
||||||
fn $id() {
|
fn $id() {
|
||||||
use $crate::test;
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use $crate::test;
|
||||||
|
|
||||||
let raw = $raw;
|
let raw = $raw;
|
||||||
let a: Vec<Vec<u8>> = raw.iter().map(|x| x.to_vec()).collect();
|
let a: Vec<Vec<u8>> = raw.iter().map(|x| x.to_vec()).collect();
|
||||||
@ -118,7 +120,7 @@ macro_rules! test_header {
|
|||||||
// Test formatting
|
// Test formatting
|
||||||
if typed.is_some() {
|
if typed.is_some() {
|
||||||
let raw = &($raw)[..];
|
let raw = &($raw)[..];
|
||||||
let mut iter = raw.iter().map(|b|str::from_utf8(&b[..]).unwrap());
|
let mut iter = raw.iter().map(|b| str::from_utf8(&b[..]).unwrap());
|
||||||
let mut joined = String::new();
|
let mut joined = String::new();
|
||||||
joined.push_str(iter.next().unwrap());
|
joined.push_str(iter.next().unwrap());
|
||||||
for s in iter {
|
for s in iter {
|
||||||
@ -128,7 +130,7 @@ macro_rules! test_header {
|
|||||||
assert_eq!(format!("{}", typed.unwrap()), joined);
|
assert_eq!(format!("{}", typed.unwrap()), joined);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
@ -330,11 +332,10 @@ macro_rules! header {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
mod accept_charset;
|
mod accept_charset;
|
||||||
//mod accept_encoding;
|
//mod accept_encoding;
|
||||||
mod accept_language;
|
|
||||||
mod accept;
|
mod accept;
|
||||||
|
mod accept_language;
|
||||||
mod allow;
|
mod allow;
|
||||||
mod cache_control;
|
mod cache_control;
|
||||||
mod content_disposition;
|
mod content_disposition;
|
||||||
|
@ -167,7 +167,6 @@ where
|
|||||||
mod tests {
|
mod tests {
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use encoding_rs::ISO_8859_2;
|
use encoding_rs::ISO_8859_2;
|
||||||
use mime;
|
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::test::TestRequest;
|
use crate::test::TestRequest;
|
||||||
|
@ -139,7 +139,7 @@ mod tests {
|
|||||||
let mut masked = unmasked.clone();
|
let mut masked = unmasked.clone();
|
||||||
apply_mask_fallback(&mut masked[1..], &mask);
|
apply_mask_fallback(&mut masked[1..], &mask);
|
||||||
|
|
||||||
let mut masked_fast = unmasked.clone();
|
let mut masked_fast = unmasked;
|
||||||
apply_mask(&mut masked_fast[1..], mask_u32);
|
apply_mask(&mut masked_fast[1..], mask_u32);
|
||||||
|
|
||||||
assert_eq!(masked, masked_fast);
|
assert_eq!(masked, masked_fast);
|
||||||
|
@ -274,9 +274,7 @@ async fn test_h2_head_empty() {
|
|||||||
async fn test_h2_head_binary() {
|
async fn test_h2_head_binary() {
|
||||||
let mut srv = test_server(move || {
|
let mut srv = test_server(move || {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h2(|_| {
|
.h2(|_| ok::<_, ()>(Response::Ok().body(STR)))
|
||||||
ok::<_, ()>(Response::Ok().body(STR))
|
|
||||||
})
|
|
||||||
.openssl(ssl_acceptor())
|
.openssl(ssl_acceptor())
|
||||||
.map_err(|_| ())
|
.map_err(|_| ())
|
||||||
})
|
})
|
||||||
|
@ -280,9 +280,7 @@ async fn test_h2_head_empty() {
|
|||||||
async fn test_h2_head_binary() {
|
async fn test_h2_head_binary() {
|
||||||
let mut srv = test_server(move || {
|
let mut srv = test_server(move || {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h2(|_| {
|
.h2(|_| ok::<_, ()>(Response::Ok().body(STR)))
|
||||||
ok::<_, ()>(Response::Ok().body(STR))
|
|
||||||
})
|
|
||||||
.rustls(ssl_acceptor())
|
.rustls(ssl_acceptor())
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
|
@ -489,9 +489,7 @@ async fn test_h1_head_empty() {
|
|||||||
async fn test_h1_head_binary() {
|
async fn test_h1_head_binary() {
|
||||||
let mut srv = test_server(|| {
|
let mut srv = test_server(|| {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h1(|_| {
|
.h1(|_| ok::<_, ()>(Response::Ok().body(STR)))
|
||||||
ok::<_, ()>(Response::Ok().body(STR))
|
|
||||||
})
|
|
||||||
.tcp()
|
.tcp()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
|
@ -9,8 +9,6 @@ use std::{cmp, fmt};
|
|||||||
|
|
||||||
use bytes::{Bytes, BytesMut};
|
use bytes::{Bytes, BytesMut};
|
||||||
use futures_util::stream::{LocalBoxStream, Stream, StreamExt};
|
use futures_util::stream::{LocalBoxStream, Stream, StreamExt};
|
||||||
use httparse;
|
|
||||||
use mime;
|
|
||||||
|
|
||||||
use actix_utils::task::LocalWaker;
|
use actix_utils::task::LocalWaker;
|
||||||
use actix_web::error::{ParseError, PayloadError};
|
use actix_web::error::{ParseError, PayloadError};
|
||||||
@ -876,11 +874,11 @@ mod tests {
|
|||||||
|
|
||||||
impl SlowStream {
|
impl SlowStream {
|
||||||
fn new(bytes: Bytes) -> SlowStream {
|
fn new(bytes: Bytes) -> SlowStream {
|
||||||
return SlowStream {
|
SlowStream {
|
||||||
bytes: bytes,
|
bytes,
|
||||||
pos: 0,
|
pos: 0,
|
||||||
ready: false,
|
ready: false,
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,8 +30,8 @@ impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for Ws {
|
|||||||
async fn test_simple() {
|
async fn test_simple() {
|
||||||
let mut srv = test::start(|| {
|
let mut srv = test::start(|| {
|
||||||
App::new().service(web::resource("/").to(
|
App::new().service(web::resource("/").to(
|
||||||
|req: HttpRequest, stream: web::Payload| {
|
|req: HttpRequest, stream: web::Payload| async move {
|
||||||
async move { ws::start(Ws, &req, stream) }
|
ws::start(Ws, &req, stream)
|
||||||
},
|
},
|
||||||
))
|
))
|
||||||
});
|
});
|
||||||
@ -51,7 +51,7 @@ async fn test_simple() {
|
|||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let item = framed.next().await.unwrap().unwrap();
|
let item = framed.next().await.unwrap().unwrap();
|
||||||
assert_eq!(item, ws::Frame::Binary(Bytes::from_static(b"text").into()));
|
assert_eq!(item, ws::Frame::Binary(Bytes::from_static(b"text")));
|
||||||
|
|
||||||
framed.send(ws::Message::Ping("text".into())).await.unwrap();
|
framed.send(ws::Message::Ping("text".into())).await.unwrap();
|
||||||
let item = framed.next().await.unwrap().unwrap();
|
let item = framed.next().await.unwrap().unwrap();
|
||||||
|
@ -3,7 +3,7 @@ extern crate proc_macro;
|
|||||||
use proc_macro::TokenStream;
|
use proc_macro::TokenStream;
|
||||||
use proc_macro2::{Span, TokenStream as TokenStream2};
|
use proc_macro2::{Span, TokenStream as TokenStream2};
|
||||||
use quote::{format_ident, quote, ToTokens, TokenStreamExt};
|
use quote::{format_ident, quote, ToTokens, TokenStreamExt};
|
||||||
use syn::{AttributeArgs, Ident, NestedMeta, parse_macro_input};
|
use syn::{parse_macro_input, AttributeArgs, Ident, NestedMeta};
|
||||||
|
|
||||||
enum ResourceType {
|
enum ResourceType {
|
||||||
Async,
|
Async,
|
||||||
@ -196,7 +196,12 @@ impl ToTokens for Route {
|
|||||||
name,
|
name,
|
||||||
guard,
|
guard,
|
||||||
ast,
|
ast,
|
||||||
args: Args { path, guards, wrappers },
|
args:
|
||||||
|
Args {
|
||||||
|
path,
|
||||||
|
guards,
|
||||||
|
wrappers,
|
||||||
|
},
|
||||||
resource_type,
|
resource_type,
|
||||||
} = self;
|
} = self;
|
||||||
let resource_name = name.to_string();
|
let resource_name = name.to_string();
|
||||||
|
@ -2,11 +2,11 @@ use std::future::Future;
|
|||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::task::{Context, Poll};
|
use std::task::{Context, Poll};
|
||||||
|
|
||||||
use actix_web::{http, test, web::Path, App, HttpResponse, Responder, Error};
|
use actix_web::dev::{Service, ServiceRequest, ServiceResponse, Transform};
|
||||||
use actix_web::dev::{Service, Transform, ServiceRequest, ServiceResponse};
|
use actix_web::http::header::{HeaderName, HeaderValue};
|
||||||
|
use actix_web::{http, test, web::Path, App, Error, HttpResponse, Responder};
|
||||||
use actix_web_codegen::{connect, delete, get, head, options, patch, post, put, trace};
|
use actix_web_codegen::{connect, delete, get, head, options, patch, post, put, trace};
|
||||||
use futures_util::future;
|
use futures_util::future;
|
||||||
use actix_web::http::header::{HeaderName, HeaderValue};
|
|
||||||
|
|
||||||
// Make sure that we can name function as 'config'
|
// Make sure that we can name function as 'config'
|
||||||
#[get("/config")]
|
#[get("/config")]
|
||||||
@ -112,6 +112,7 @@ where
|
|||||||
type Request = ServiceRequest;
|
type Request = ServiceRequest;
|
||||||
type Response = ServiceResponse<B>;
|
type Response = ServiceResponse<B>;
|
||||||
type Error = Error;
|
type Error = Error;
|
||||||
|
#[allow(clippy::type_complexity)]
|
||||||
type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>>>>;
|
type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>>>>;
|
||||||
|
|
||||||
fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
|
fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
|
||||||
@ -119,7 +120,6 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn call(&mut self, req: ServiceRequest) -> Self::Future {
|
fn call(&mut self, req: ServiceRequest) -> Self::Future {
|
||||||
|
|
||||||
let fut = self.service.call(req);
|
let fut = self.service.call(req);
|
||||||
|
|
||||||
Box::pin(async move {
|
Box::pin(async move {
|
||||||
@ -223,10 +223,7 @@ async fn test_auto_async() {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_wrap() {
|
async fn test_wrap() {
|
||||||
let srv = test::start(|| {
|
let srv = test::start(|| App::new().service(get_wrap));
|
||||||
App::new()
|
|
||||||
.service(get_wrap)
|
|
||||||
});
|
|
||||||
|
|
||||||
let request = srv.request(http::Method::GET, srv.url("/test/wrap"));
|
let request = srv.request(http::Method::GET, srv.url("/test/wrap"));
|
||||||
let response = request.send().await.unwrap();
|
let response = request.send().await.unwrap();
|
||||||
|
@ -402,9 +402,12 @@ mod tests {
|
|||||||
|
|
||||||
fn json_eq(err: JsonPayloadError, other: JsonPayloadError) -> bool {
|
fn json_eq(err: JsonPayloadError, other: JsonPayloadError) -> bool {
|
||||||
match err {
|
match err {
|
||||||
JsonPayloadError::Payload(PayloadError::Overflow) =>
|
JsonPayloadError::Payload(PayloadError::Overflow) => {
|
||||||
matches!(other, JsonPayloadError::Payload(PayloadError::Overflow)),
|
matches!(other, JsonPayloadError::Payload(PayloadError::Overflow))
|
||||||
JsonPayloadError::ContentType => matches!(other, JsonPayloadError::ContentType),
|
}
|
||||||
|
JsonPayloadError::ContentType => {
|
||||||
|
matches!(other, JsonPayloadError::ContentType)
|
||||||
|
}
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -167,8 +167,7 @@ async fn test_connection_reuse() {
|
|||||||
})
|
})
|
||||||
.and_then(
|
.and_then(
|
||||||
HttpService::new(map_config(
|
HttpService::new(map_config(
|
||||||
App::new()
|
App::new().service(web::resource("/").route(web::to(HttpResponse::Ok))),
|
||||||
.service(web::resource("/").route(web::to(|| HttpResponse::Ok()))),
|
|
||||||
|_| AppConfig::default(),
|
|_| AppConfig::default(),
|
||||||
))
|
))
|
||||||
.tcp(),
|
.tcp(),
|
||||||
@ -205,8 +204,7 @@ async fn test_connection_force_close() {
|
|||||||
})
|
})
|
||||||
.and_then(
|
.and_then(
|
||||||
HttpService::new(map_config(
|
HttpService::new(map_config(
|
||||||
App::new()
|
App::new().service(web::resource("/").route(web::to(HttpResponse::Ok))),
|
||||||
.service(web::resource("/").route(web::to(|| HttpResponse::Ok()))),
|
|
||||||
|_| AppConfig::default(),
|
|_| AppConfig::default(),
|
||||||
))
|
))
|
||||||
.tcp(),
|
.tcp(),
|
||||||
|
@ -32,8 +32,7 @@ async fn test_connection_window_size() {
|
|||||||
let srv = test_server(move || {
|
let srv = test_server(move || {
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h2(map_config(
|
.h2(map_config(
|
||||||
App::new()
|
App::new().service(web::resource("/").route(web::to(HttpResponse::Ok))),
|
||||||
.service(web::resource("/").route(web::to(|| HttpResponse::Ok()))),
|
|
||||||
|_| AppConfig::default(),
|
|_| AppConfig::default(),
|
||||||
))
|
))
|
||||||
.openssl(ssl_acceptor())
|
.openssl(ssl_acceptor())
|
||||||
|
@ -64,9 +64,8 @@ async fn _test_connection_reuse_h2() {
|
|||||||
.and_then(
|
.and_then(
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h2(map_config(
|
.h2(map_config(
|
||||||
App::new().service(
|
App::new()
|
||||||
web::resource("/").route(web::to(|| HttpResponse::Ok())),
|
.service(web::resource("/").route(web::to(HttpResponse::Ok))),
|
||||||
),
|
|
||||||
|_| AppConfig::default(),
|
|_| AppConfig::default(),
|
||||||
))
|
))
|
||||||
.openssl(ssl_acceptor())
|
.openssl(ssl_acceptor())
|
||||||
|
@ -45,9 +45,8 @@ async fn test_connection_reuse_h2() {
|
|||||||
.and_then(
|
.and_then(
|
||||||
HttpService::build()
|
HttpService::build()
|
||||||
.h2(map_config(
|
.h2(map_config(
|
||||||
App::new().service(
|
App::new()
|
||||||
web::resource("/").route(web::to(|| HttpResponse::Ok())),
|
.service(web::resource("/").route(web::to(HttpResponse::Ok))),
|
||||||
),
|
|
||||||
|_| AppConfig::default(),
|
|_| AppConfig::default(),
|
||||||
))
|
))
|
||||||
.openssl(ssl_acceptor())
|
.openssl(ssl_acceptor())
|
||||||
|
21
src/app.rs
21
src/app.rs
@ -489,7 +489,7 @@ mod tests {
|
|||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_default_resource() {
|
async fn test_default_resource() {
|
||||||
let mut srv = init_service(
|
let mut srv = init_service(
|
||||||
App::new().service(web::resource("/test").to(|| HttpResponse::Ok())),
|
App::new().service(web::resource("/test").to(HttpResponse::Ok)),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
let req = TestRequest::with_uri("/test").to_request();
|
let req = TestRequest::with_uri("/test").to_request();
|
||||||
@ -502,13 +502,13 @@ mod tests {
|
|||||||
|
|
||||||
let mut srv = init_service(
|
let mut srv = init_service(
|
||||||
App::new()
|
App::new()
|
||||||
.service(web::resource("/test").to(|| HttpResponse::Ok()))
|
.service(web::resource("/test").to(HttpResponse::Ok))
|
||||||
.service(
|
.service(
|
||||||
web::resource("/test2")
|
web::resource("/test2")
|
||||||
.default_service(|r: ServiceRequest| {
|
.default_service(|r: ServiceRequest| {
|
||||||
ok(r.into_response(HttpResponse::Created()))
|
ok(r.into_response(HttpResponse::Created()))
|
||||||
})
|
})
|
||||||
.route(web::get().to(|| HttpResponse::Ok())),
|
.route(web::get().to(HttpResponse::Ok)),
|
||||||
)
|
)
|
||||||
.default_service(|r: ServiceRequest| {
|
.default_service(|r: ServiceRequest| {
|
||||||
ok(r.into_response(HttpResponse::MethodNotAllowed()))
|
ok(r.into_response(HttpResponse::MethodNotAllowed()))
|
||||||
@ -585,7 +585,7 @@ mod tests {
|
|||||||
DefaultHeaders::new()
|
DefaultHeaders::new()
|
||||||
.header(header::CONTENT_TYPE, HeaderValue::from_static("0001")),
|
.header(header::CONTENT_TYPE, HeaderValue::from_static("0001")),
|
||||||
)
|
)
|
||||||
.route("/test", web::get().to(|| HttpResponse::Ok())),
|
.route("/test", web::get().to(HttpResponse::Ok)),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
let req = TestRequest::with_uri("/test").to_request();
|
let req = TestRequest::with_uri("/test").to_request();
|
||||||
@ -601,7 +601,7 @@ mod tests {
|
|||||||
async fn test_router_wrap() {
|
async fn test_router_wrap() {
|
||||||
let mut srv = init_service(
|
let mut srv = init_service(
|
||||||
App::new()
|
App::new()
|
||||||
.route("/test", web::get().to(|| HttpResponse::Ok()))
|
.route("/test", web::get().to(HttpResponse::Ok))
|
||||||
.wrap(
|
.wrap(
|
||||||
DefaultHeaders::new()
|
DefaultHeaders::new()
|
||||||
.header(header::CONTENT_TYPE, HeaderValue::from_static("0001")),
|
.header(header::CONTENT_TYPE, HeaderValue::from_static("0001")),
|
||||||
@ -632,7 +632,7 @@ mod tests {
|
|||||||
Ok(res)
|
Ok(res)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.service(web::resource("/test").to(|| HttpResponse::Ok())),
|
.service(web::resource("/test").to(HttpResponse::Ok)),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
let req = TestRequest::with_uri("/test").to_request();
|
let req = TestRequest::with_uri("/test").to_request();
|
||||||
@ -648,7 +648,7 @@ mod tests {
|
|||||||
async fn test_router_wrap_fn() {
|
async fn test_router_wrap_fn() {
|
||||||
let mut srv = init_service(
|
let mut srv = init_service(
|
||||||
App::new()
|
App::new()
|
||||||
.route("/test", web::get().to(|| HttpResponse::Ok()))
|
.route("/test", web::get().to(HttpResponse::Ok))
|
||||||
.wrap_fn(|req, srv| {
|
.wrap_fn(|req, srv| {
|
||||||
let fut = srv.call(req);
|
let fut = srv.call(req);
|
||||||
async {
|
async {
|
||||||
@ -679,10 +679,9 @@ mod tests {
|
|||||||
.route(
|
.route(
|
||||||
"/test",
|
"/test",
|
||||||
web::get().to(|req: HttpRequest| {
|
web::get().to(|req: HttpRequest| {
|
||||||
HttpResponse::Ok().body(format!(
|
HttpResponse::Ok().body(
|
||||||
"{}",
|
req.url_for("youtube", &["12345"]).unwrap().to_string(),
|
||||||
req.url_for("youtube", &["12345"]).unwrap()
|
)
|
||||||
))
|
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -475,7 +475,7 @@ mod tests {
|
|||||||
let mut app = init_service(
|
let mut app = init_service(
|
||||||
App::new()
|
App::new()
|
||||||
.data(DropData(data.clone()))
|
.data(DropData(data.clone()))
|
||||||
.service(web::resource("/test").to(|| HttpResponse::Ok())),
|
.service(web::resource("/test").to(HttpResponse::Ok)),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
let req = TestRequest::with_uri("/test").to_request();
|
let req = TestRequest::with_uri("/test").to_request();
|
||||||
|
@ -311,10 +311,9 @@ mod tests {
|
|||||||
.route(
|
.route(
|
||||||
"/test",
|
"/test",
|
||||||
web::get().to(|req: HttpRequest| {
|
web::get().to(|req: HttpRequest| {
|
||||||
HttpResponse::Ok().body(format!(
|
HttpResponse::Ok().body(
|
||||||
"{}",
|
req.url_for("youtube", &["12345"]).unwrap().to_string(),
|
||||||
req.url_for("youtube", &["12345"]).unwrap()
|
)
|
||||||
))
|
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@ -330,9 +329,9 @@ mod tests {
|
|||||||
async fn test_service() {
|
async fn test_service() {
|
||||||
let mut srv = init_service(App::new().configure(|cfg| {
|
let mut srv = init_service(App::new().configure(|cfg| {
|
||||||
cfg.service(
|
cfg.service(
|
||||||
web::resource("/test").route(web::get().to(|| HttpResponse::Created())),
|
web::resource("/test").route(web::get().to(HttpResponse::Created)),
|
||||||
)
|
)
|
||||||
.route("/index.html", web::get().to(|| HttpResponse::Ok()));
|
.route("/index.html", web::get().to(HttpResponse::Ok));
|
||||||
}))
|
}))
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
|
17
src/data.rs
17
src/data.rs
@ -200,14 +200,14 @@ mod tests {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_route_data_extractor() {
|
async fn test_route_data_extractor() {
|
||||||
let mut srv =
|
let mut srv = init_service(
|
||||||
init_service(App::new().service(web::resource("/").data(10usize).route(
|
App::new().service(
|
||||||
web::get().to(|data: web::Data<usize>| {
|
web::resource("/")
|
||||||
let _ = data.clone();
|
.data(10usize)
|
||||||
HttpResponse::Ok()
|
.route(web::get().to(|_data: web::Data<usize>| HttpResponse::Ok())),
|
||||||
}),
|
),
|
||||||
)))
|
)
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
let req = TestRequest::default().to_request();
|
let req = TestRequest::default().to_request();
|
||||||
let resp = srv.call(req).await.unwrap();
|
let resp = srv.call(req).await.unwrap();
|
||||||
@ -233,7 +233,6 @@ mod tests {
|
|||||||
web::resource("/").data(10usize).route(web::get().to(
|
web::resource("/").data(10usize).route(web::get().to(
|
||||||
|data: web::Data<usize>| {
|
|data: web::Data<usize>| {
|
||||||
assert_eq!(**data, 10);
|
assert_eq!(**data, 10);
|
||||||
let _ = data.clone();
|
|
||||||
HttpResponse::Ok()
|
HttpResponse::Ok()
|
||||||
},
|
},
|
||||||
)),
|
)),
|
||||||
|
@ -626,7 +626,7 @@ mod tests {
|
|||||||
Ok(())
|
Ok(())
|
||||||
};
|
};
|
||||||
let s = format!("{}", FormatDisplay(&render));
|
let s = format!("{}", FormatDisplay(&render));
|
||||||
assert!(s.contains(&format!("{}", now.format("%Y-%m-%dT%H:%M:%S"))));
|
assert!(s.contains(&now.format("%Y-%m-%dT%H:%M:%S")));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
|
@ -91,9 +91,9 @@ where
|
|||||||
// That approach fails when a trailing slash is added,
|
// That approach fails when a trailing slash is added,
|
||||||
// and a duplicate slash is removed,
|
// and a duplicate slash is removed,
|
||||||
// since the length of the strings remains the same
|
// since the length of the strings remains the same
|
||||||
//
|
//
|
||||||
// For example, the path "/v1//s" will be normalized to "/v1/s/"
|
// For example, the path "/v1//s" will be normalized to "/v1/s/"
|
||||||
// Both of the paths have the same length,
|
// Both of the paths have the same length,
|
||||||
// so the change can not be deduced from the length comparison
|
// so the change can not be deduced from the length comparison
|
||||||
if path != original_path {
|
if path != original_path {
|
||||||
let mut parts = head.uri.clone().into_parts();
|
let mut parts = head.uri.clone().into_parts();
|
||||||
@ -129,7 +129,7 @@ mod tests {
|
|||||||
let mut app = init_service(
|
let mut app = init_service(
|
||||||
App::new()
|
App::new()
|
||||||
.wrap(NormalizePath::default())
|
.wrap(NormalizePath::default())
|
||||||
.service(web::resource("/v1/something/").to(|| HttpResponse::Ok())),
|
.service(web::resource("/v1/something/").to(HttpResponse::Ok)),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
|
@ -607,7 +607,7 @@ mod tests {
|
|||||||
header::CONTENT_TYPE,
|
header::CONTENT_TYPE,
|
||||||
HeaderValue::from_static("0001"),
|
HeaderValue::from_static("0001"),
|
||||||
))
|
))
|
||||||
.route(web::get().to(|| HttpResponse::Ok())),
|
.route(web::get().to(HttpResponse::Ok)),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
@ -637,7 +637,7 @@ mod tests {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.route(web::get().to(|| HttpResponse::Ok())),
|
.route(web::get().to(HttpResponse::Ok)),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
@ -684,9 +684,7 @@ mod tests {
|
|||||||
async fn test_default_resource() {
|
async fn test_default_resource() {
|
||||||
let mut srv = init_service(
|
let mut srv = init_service(
|
||||||
App::new()
|
App::new()
|
||||||
.service(
|
.service(web::resource("/test").route(web::get().to(HttpResponse::Ok)))
|
||||||
web::resource("/test").route(web::get().to(|| HttpResponse::Ok())),
|
|
||||||
)
|
|
||||||
.default_service(|r: ServiceRequest| {
|
.default_service(|r: ServiceRequest| {
|
||||||
ok(r.into_response(HttpResponse::BadRequest()))
|
ok(r.into_response(HttpResponse::BadRequest()))
|
||||||
}),
|
}),
|
||||||
@ -705,7 +703,7 @@ mod tests {
|
|||||||
let mut srv = init_service(
|
let mut srv = init_service(
|
||||||
App::new().service(
|
App::new().service(
|
||||||
web::resource("/test")
|
web::resource("/test")
|
||||||
.route(web::get().to(|| HttpResponse::Ok()))
|
.route(web::get().to(HttpResponse::Ok))
|
||||||
.default_service(|r: ServiceRequest| {
|
.default_service(|r: ServiceRequest| {
|
||||||
ok(r.into_response(HttpResponse::BadRequest()))
|
ok(r.into_response(HttpResponse::BadRequest()))
|
||||||
}),
|
}),
|
||||||
@ -731,17 +729,17 @@ mod tests {
|
|||||||
.service(
|
.service(
|
||||||
web::resource("/test/{p}")
|
web::resource("/test/{p}")
|
||||||
.guard(guard::Get())
|
.guard(guard::Get())
|
||||||
.to(|| HttpResponse::Ok()),
|
.to(HttpResponse::Ok),
|
||||||
)
|
)
|
||||||
.service(
|
.service(
|
||||||
web::resource("/test/{p}")
|
web::resource("/test/{p}")
|
||||||
.guard(guard::Put())
|
.guard(guard::Put())
|
||||||
.to(|| HttpResponse::Created()),
|
.to(HttpResponse::Created),
|
||||||
)
|
)
|
||||||
.service(
|
.service(
|
||||||
web::resource("/test/{p}")
|
web::resource("/test/{p}")
|
||||||
.guard(guard::Delete())
|
.guard(guard::Delete())
|
||||||
.to(|| HttpResponse::NoContent()),
|
.to(HttpResponse::NoContent),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
@ -783,7 +781,8 @@ mod tests {
|
|||||||
data3: web::Data<f64>| {
|
data3: web::Data<f64>| {
|
||||||
assert_eq!(**data1, 10);
|
assert_eq!(**data1, 10);
|
||||||
assert_eq!(**data2, '*');
|
assert_eq!(**data2, '*');
|
||||||
assert_eq!(**data3, 1.0);
|
let error = std::f64::EPSILON;
|
||||||
|
assert!((**data3 - 1.0).abs() < error);
|
||||||
HttpResponse::Ok()
|
HttpResponse::Ok()
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -480,7 +480,7 @@ pub(crate) mod tests {
|
|||||||
assert_eq!(resp.status(), StatusCode::OK);
|
assert_eq!(resp.status(), StatusCode::OK);
|
||||||
match resp.response().body() {
|
match resp.response().body() {
|
||||||
ResponseBody::Body(Body::Bytes(ref b)) => {
|
ResponseBody::Body(Body::Bytes(ref b)) => {
|
||||||
let bytes: Bytes = b.clone().into();
|
let bytes = b.clone();
|
||||||
assert_eq!(bytes, Bytes::from_static(b"some"));
|
assert_eq!(bytes, Bytes::from_static(b"some"));
|
||||||
}
|
}
|
||||||
_ => panic!(),
|
_ => panic!(),
|
||||||
|
@ -362,7 +362,7 @@ mod tests {
|
|||||||
App::new()
|
App::new()
|
||||||
.service(
|
.service(
|
||||||
web::resource("/test")
|
web::resource("/test")
|
||||||
.route(web::get().to(|| HttpResponse::Ok()))
|
.route(web::get().to(HttpResponse::Ok))
|
||||||
.route(web::put().to(|| async {
|
.route(web::put().to(|| async {
|
||||||
Err::<HttpResponse, _>(error::ErrorBadRequest("err"))
|
Err::<HttpResponse, _>(error::ErrorBadRequest("err"))
|
||||||
}))
|
}))
|
||||||
|
109
src/scope.rs
109
src/scope.rs
@ -678,12 +678,9 @@ mod tests {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_scope() {
|
async fn test_scope() {
|
||||||
let mut srv = init_service(
|
let mut srv = init_service(App::new().service(
|
||||||
App::new().service(
|
web::scope("/app").service(web::resource("/path1").to(HttpResponse::Ok)),
|
||||||
web::scope("/app")
|
))
|
||||||
.service(web::resource("/path1").to(|| HttpResponse::Ok())),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
let req = TestRequest::with_uri("/app/path1").to_request();
|
let req = TestRequest::with_uri("/app/path1").to_request();
|
||||||
@ -696,8 +693,8 @@ mod tests {
|
|||||||
let mut srv = init_service(
|
let mut srv = init_service(
|
||||||
App::new().service(
|
App::new().service(
|
||||||
web::scope("/app")
|
web::scope("/app")
|
||||||
.service(web::resource("").to(|| HttpResponse::Ok()))
|
.service(web::resource("").to(HttpResponse::Ok))
|
||||||
.service(web::resource("/").to(|| HttpResponse::Created())),
|
.service(web::resource("/").to(HttpResponse::Created)),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
@ -714,7 +711,7 @@ mod tests {
|
|||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_scope_root2() {
|
async fn test_scope_root2() {
|
||||||
let mut srv = init_service(App::new().service(
|
let mut srv = init_service(App::new().service(
|
||||||
web::scope("/app/").service(web::resource("").to(|| HttpResponse::Ok())),
|
web::scope("/app/").service(web::resource("").to(HttpResponse::Ok)),
|
||||||
))
|
))
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
@ -730,7 +727,7 @@ mod tests {
|
|||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_scope_root3() {
|
async fn test_scope_root3() {
|
||||||
let mut srv = init_service(App::new().service(
|
let mut srv = init_service(App::new().service(
|
||||||
web::scope("/app/").service(web::resource("/").to(|| HttpResponse::Ok())),
|
web::scope("/app/").service(web::resource("/").to(HttpResponse::Ok)),
|
||||||
))
|
))
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
@ -748,8 +745,8 @@ mod tests {
|
|||||||
let mut srv = init_service(
|
let mut srv = init_service(
|
||||||
App::new().service(
|
App::new().service(
|
||||||
web::scope("app")
|
web::scope("app")
|
||||||
.route("/path1", web::get().to(|| HttpResponse::Ok()))
|
.route("/path1", web::get().to(HttpResponse::Ok))
|
||||||
.route("/path1", web::delete().to(|| HttpResponse::Ok())),
|
.route("/path1", web::delete().to(HttpResponse::Ok)),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
@ -777,8 +774,8 @@ mod tests {
|
|||||||
App::new().service(
|
App::new().service(
|
||||||
web::scope("app").service(
|
web::scope("app").service(
|
||||||
web::resource("path1")
|
web::resource("path1")
|
||||||
.route(web::get().to(|| HttpResponse::Ok()))
|
.route(web::get().to(HttpResponse::Ok))
|
||||||
.route(web::delete().to(|| HttpResponse::Ok())),
|
.route(web::delete().to(HttpResponse::Ok)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@ -807,7 +804,7 @@ mod tests {
|
|||||||
App::new().service(
|
App::new().service(
|
||||||
web::scope("/app")
|
web::scope("/app")
|
||||||
.guard(guard::Get())
|
.guard(guard::Get())
|
||||||
.service(web::resource("/path1").to(|| HttpResponse::Ok())),
|
.service(web::resource("/path1").to(HttpResponse::Ok)),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
@ -842,7 +839,7 @@ mod tests {
|
|||||||
|
|
||||||
match resp.response().body() {
|
match resp.response().body() {
|
||||||
ResponseBody::Body(Body::Bytes(ref b)) => {
|
ResponseBody::Body(Body::Bytes(ref b)) => {
|
||||||
let bytes: Bytes = b.clone().into();
|
let bytes = b.clone();
|
||||||
assert_eq!(bytes, Bytes::from_static(b"project: project1"));
|
assert_eq!(bytes, Bytes::from_static(b"project: project1"));
|
||||||
}
|
}
|
||||||
_ => panic!(),
|
_ => panic!(),
|
||||||
@ -855,14 +852,9 @@ mod tests {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_nested_scope() {
|
async fn test_nested_scope() {
|
||||||
let mut srv = init_service(
|
let mut srv = init_service(App::new().service(web::scope("/app").service(
|
||||||
App::new().service(
|
web::scope("/t1").service(web::resource("/path1").to(HttpResponse::Created)),
|
||||||
web::scope("/app")
|
)))
|
||||||
.service(web::scope("/t1").service(
|
|
||||||
web::resource("/path1").to(|| HttpResponse::Created()),
|
|
||||||
)),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
let req = TestRequest::with_uri("/app/t1/path1").to_request();
|
let req = TestRequest::with_uri("/app/t1/path1").to_request();
|
||||||
@ -872,14 +864,9 @@ mod tests {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_nested_scope_no_slash() {
|
async fn test_nested_scope_no_slash() {
|
||||||
let mut srv = init_service(
|
let mut srv = init_service(App::new().service(web::scope("/app").service(
|
||||||
App::new().service(
|
web::scope("t1").service(web::resource("/path1").to(HttpResponse::Created)),
|
||||||
web::scope("/app")
|
)))
|
||||||
.service(web::scope("t1").service(
|
|
||||||
web::resource("/path1").to(|| HttpResponse::Created()),
|
|
||||||
)),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
let req = TestRequest::with_uri("/app/t1/path1").to_request();
|
let req = TestRequest::with_uri("/app/t1/path1").to_request();
|
||||||
@ -893,8 +880,8 @@ mod tests {
|
|||||||
App::new().service(
|
App::new().service(
|
||||||
web::scope("/app").service(
|
web::scope("/app").service(
|
||||||
web::scope("/t1")
|
web::scope("/t1")
|
||||||
.service(web::resource("").to(|| HttpResponse::Ok()))
|
.service(web::resource("").to(HttpResponse::Ok))
|
||||||
.service(web::resource("/").to(|| HttpResponse::Created())),
|
.service(web::resource("/").to(HttpResponse::Created)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@ -916,7 +903,7 @@ mod tests {
|
|||||||
web::scope("/app").service(
|
web::scope("/app").service(
|
||||||
web::scope("/t1")
|
web::scope("/t1")
|
||||||
.guard(guard::Get())
|
.guard(guard::Get())
|
||||||
.service(web::resource("/path1").to(|| HttpResponse::Ok())),
|
.service(web::resource("/path1").to(HttpResponse::Ok)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@ -953,7 +940,7 @@ mod tests {
|
|||||||
|
|
||||||
match resp.response().body() {
|
match resp.response().body() {
|
||||||
ResponseBody::Body(Body::Bytes(ref b)) => {
|
ResponseBody::Body(Body::Bytes(ref b)) => {
|
||||||
let bytes: Bytes = b.clone().into();
|
let bytes = b.clone();
|
||||||
assert_eq!(bytes, Bytes::from_static(b"project: project_1"));
|
assert_eq!(bytes, Bytes::from_static(b"project: project_1"));
|
||||||
}
|
}
|
||||||
_ => panic!(),
|
_ => panic!(),
|
||||||
@ -981,7 +968,7 @@ mod tests {
|
|||||||
|
|
||||||
match resp.response().body() {
|
match resp.response().body() {
|
||||||
ResponseBody::Body(Body::Bytes(ref b)) => {
|
ResponseBody::Body(Body::Bytes(ref b)) => {
|
||||||
let bytes: Bytes = b.clone().into();
|
let bytes = b.clone();
|
||||||
assert_eq!(bytes, Bytes::from_static(b"project: test - 1"));
|
assert_eq!(bytes, Bytes::from_static(b"project: test - 1"));
|
||||||
}
|
}
|
||||||
_ => panic!(),
|
_ => panic!(),
|
||||||
@ -997,7 +984,7 @@ mod tests {
|
|||||||
let mut srv = init_service(
|
let mut srv = init_service(
|
||||||
App::new().service(
|
App::new().service(
|
||||||
web::scope("/app")
|
web::scope("/app")
|
||||||
.service(web::resource("/path1").to(|| HttpResponse::Ok()))
|
.service(web::resource("/path1").to(HttpResponse::Ok))
|
||||||
.default_service(|r: ServiceRequest| {
|
.default_service(|r: ServiceRequest| {
|
||||||
ok(r.into_response(HttpResponse::BadRequest()))
|
ok(r.into_response(HttpResponse::BadRequest()))
|
||||||
}),
|
}),
|
||||||
@ -1018,9 +1005,10 @@ mod tests {
|
|||||||
async fn test_default_resource_propagation() {
|
async fn test_default_resource_propagation() {
|
||||||
let mut srv = init_service(
|
let mut srv = init_service(
|
||||||
App::new()
|
App::new()
|
||||||
.service(web::scope("/app1").default_service(
|
.service(
|
||||||
web::resource("").to(|| HttpResponse::BadRequest()),
|
web::scope("/app1")
|
||||||
))
|
.default_service(web::resource("").to(HttpResponse::BadRequest)),
|
||||||
|
)
|
||||||
.service(web::scope("/app2"))
|
.service(web::scope("/app2"))
|
||||||
.default_service(|r: ServiceRequest| {
|
.default_service(|r: ServiceRequest| {
|
||||||
ok(r.into_response(HttpResponse::MethodNotAllowed()))
|
ok(r.into_response(HttpResponse::MethodNotAllowed()))
|
||||||
@ -1043,21 +1031,21 @@ mod tests {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_middleware() {
|
async fn test_middleware() {
|
||||||
let mut srv =
|
let mut srv = init_service(
|
||||||
init_service(
|
App::new().service(
|
||||||
App::new().service(
|
web::scope("app")
|
||||||
web::scope("app")
|
.wrap(
|
||||||
.wrap(DefaultHeaders::new().header(
|
DefaultHeaders::new().header(
|
||||||
header::CONTENT_TYPE,
|
header::CONTENT_TYPE,
|
||||||
HeaderValue::from_static("0001"),
|
HeaderValue::from_static("0001"),
|
||||||
))
|
|
||||||
.service(
|
|
||||||
web::resource("/test")
|
|
||||||
.route(web::get().to(|| HttpResponse::Ok())),
|
|
||||||
),
|
),
|
||||||
),
|
)
|
||||||
)
|
.service(
|
||||||
.await;
|
web::resource("/test").route(web::get().to(HttpResponse::Ok)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
let req = TestRequest::with_uri("/app/test").to_request();
|
let req = TestRequest::with_uri("/app/test").to_request();
|
||||||
let resp = call_service(&mut srv, req).await;
|
let resp = call_service(&mut srv, req).await;
|
||||||
@ -1084,7 +1072,7 @@ mod tests {
|
|||||||
Ok(res)
|
Ok(res)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.route("/test", web::get().to(|| HttpResponse::Ok())),
|
.route("/test", web::get().to(HttpResponse::Ok)),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
@ -1105,7 +1093,6 @@ mod tests {
|
|||||||
"/t",
|
"/t",
|
||||||
web::get().to(|data: web::Data<usize>| {
|
web::get().to(|data: web::Data<usize>| {
|
||||||
assert_eq!(**data, 10);
|
assert_eq!(**data, 10);
|
||||||
let _ = data.clone();
|
|
||||||
HttpResponse::Ok()
|
HttpResponse::Ok()
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
@ -1141,7 +1128,6 @@ mod tests {
|
|||||||
"/t",
|
"/t",
|
||||||
web::get().to(|data: web::Data<usize>| {
|
web::get().to(|data: web::Data<usize>| {
|
||||||
assert_eq!(**data, 10);
|
assert_eq!(**data, 10);
|
||||||
let _ = data.clone();
|
|
||||||
HttpResponse::Ok()
|
HttpResponse::Ok()
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
@ -1157,7 +1143,7 @@ mod tests {
|
|||||||
async fn test_scope_config() {
|
async fn test_scope_config() {
|
||||||
let mut srv =
|
let mut srv =
|
||||||
init_service(App::new().service(web::scope("/app").configure(|s| {
|
init_service(App::new().service(web::scope("/app").configure(|s| {
|
||||||
s.route("/path1", web::get().to(|| HttpResponse::Ok()));
|
s.route("/path1", web::get().to(HttpResponse::Ok));
|
||||||
})))
|
})))
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
@ -1171,7 +1157,7 @@ mod tests {
|
|||||||
let mut srv =
|
let mut srv =
|
||||||
init_service(App::new().service(web::scope("/app").configure(|s| {
|
init_service(App::new().service(web::scope("/app").configure(|s| {
|
||||||
s.service(web::scope("/v1").configure(|s| {
|
s.service(web::scope("/v1").configure(|s| {
|
||||||
s.route("/", web::get().to(|| HttpResponse::Ok()));
|
s.route("/", web::get().to(HttpResponse::Ok));
|
||||||
}));
|
}));
|
||||||
})))
|
})))
|
||||||
.await;
|
.await;
|
||||||
@ -1193,10 +1179,9 @@ mod tests {
|
|||||||
s.route(
|
s.route(
|
||||||
"/",
|
"/",
|
||||||
web::get().to(|req: HttpRequest| async move {
|
web::get().to(|req: HttpRequest| async move {
|
||||||
HttpResponse::Ok().body(format!(
|
HttpResponse::Ok().body(
|
||||||
"{}",
|
req.url_for("youtube", &["xxxxxx"]).unwrap().to_string(),
|
||||||
req.url_for("youtube", &["xxxxxx"]).unwrap().as_str()
|
)
|
||||||
))
|
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}));
|
}));
|
||||||
|
@ -23,7 +23,6 @@ use futures_util::future::ok;
|
|||||||
use futures_util::StreamExt;
|
use futures_util::StreamExt;
|
||||||
use serde::de::DeserializeOwned;
|
use serde::de::DeserializeOwned;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use serde_json;
|
|
||||||
use socket2::{Domain, Protocol, Socket, Type};
|
use socket2::{Domain, Protocol, Socket, Type};
|
||||||
|
|
||||||
pub use actix_http::test::TestBuffer;
|
pub use actix_http::test::TestBuffer;
|
||||||
|
@ -407,9 +407,15 @@ mod tests {
|
|||||||
|
|
||||||
fn eq(err: UrlencodedError, other: UrlencodedError) -> bool {
|
fn eq(err: UrlencodedError, other: UrlencodedError) -> bool {
|
||||||
match err {
|
match err {
|
||||||
UrlencodedError::Overflow { .. } => matches!(other, UrlencodedError::Overflow { .. }),
|
UrlencodedError::Overflow { .. } => {
|
||||||
UrlencodedError::UnknownLength => matches!(other, UrlencodedError::UnknownLength),
|
matches!(other, UrlencodedError::Overflow { .. })
|
||||||
UrlencodedError::ContentType => matches!(other, UrlencodedError::ContentType),
|
}
|
||||||
|
UrlencodedError::UnknownLength => {
|
||||||
|
matches!(other, UrlencodedError::UnknownLength)
|
||||||
|
}
|
||||||
|
UrlencodedError::ContentType => {
|
||||||
|
matches!(other, UrlencodedError::ContentType)
|
||||||
|
}
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -434,7 +434,9 @@ mod tests {
|
|||||||
fn json_eq(err: JsonPayloadError, other: JsonPayloadError) -> bool {
|
fn json_eq(err: JsonPayloadError, other: JsonPayloadError) -> bool {
|
||||||
match err {
|
match err {
|
||||||
JsonPayloadError::Overflow => matches!(other, JsonPayloadError::Overflow),
|
JsonPayloadError::Overflow => matches!(other, JsonPayloadError::Overflow),
|
||||||
JsonPayloadError::ContentType => matches!(other, JsonPayloadError::ContentType),
|
JsonPayloadError::ContentType => {
|
||||||
|
matches!(other, JsonPayloadError::ContentType)
|
||||||
|
}
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -480,7 +482,7 @@ mod tests {
|
|||||||
.to_http_parts();
|
.to_http_parts();
|
||||||
|
|
||||||
let s = Json::<MyObject>::from_request(&req, &mut pl).await;
|
let s = Json::<MyObject>::from_request(&req, &mut pl).await;
|
||||||
let mut resp = Response::from_error(s.err().unwrap().into());
|
let mut resp = Response::from_error(s.err().unwrap());
|
||||||
assert_eq!(resp.status(), StatusCode::BAD_REQUEST);
|
assert_eq!(resp.status(), StatusCode::BAD_REQUEST);
|
||||||
|
|
||||||
let body = load_stream(resp.take_body()).await.unwrap();
|
let body = load_stream(resp.take_body()).await.unwrap();
|
||||||
|
@ -851,7 +851,7 @@ async fn test_slow_request() {
|
|||||||
use std::net;
|
use std::net;
|
||||||
|
|
||||||
let srv = test::start_with(test::config().client_timeout(200), || {
|
let srv = test::start_with(test::config().client_timeout(200), || {
|
||||||
App::new().service(web::resource("/").route(web::to(|| HttpResponse::Ok())))
|
App::new().service(web::resource("/").route(web::to(HttpResponse::Ok)))
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut stream = net::TcpStream::connect(srv.addr()).unwrap();
|
let mut stream = net::TcpStream::connect(srv.addr()).unwrap();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user