mirror of
https://github.com/actix/actix-web.git
synced 2024-11-18 15:41:17 +00:00
hide httpmessage mod
This commit is contained in:
parent
871ca5e4ae
commit
77efc09362
35 changed files with 125 additions and 98 deletions
|
@ -150,7 +150,7 @@ impl TestServer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Construct test https server url
|
/// Construct test HTTPS server URL.
|
||||||
pub fn surl(&self, uri: &str) -> String {
|
pub fn surl(&self, uri: &str) -> String {
|
||||||
if uri.starts_with('/') {
|
if uri.starts_with('/') {
|
||||||
format!("https://localhost:{}{}", self.addr.port(), uri)
|
format!("https://localhost:{}{}", self.addr.port(), uri)
|
||||||
|
@ -164,7 +164,7 @@ impl TestServer {
|
||||||
self.client.get(self.url(path.as_ref()).as_str())
|
self.client.get(self.url(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create https `GET` request
|
/// Create HTTPS `GET` request
|
||||||
pub fn sget<S: AsRef<str>>(&self, path: S) -> ClientRequest {
|
pub fn sget<S: AsRef<str>>(&self, path: S) -> ClientRequest {
|
||||||
self.client.get(self.surl(path.as_ref()).as_str())
|
self.client.get(self.surl(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
@ -174,7 +174,7 @@ impl TestServer {
|
||||||
self.client.post(self.url(path.as_ref()).as_str())
|
self.client.post(self.url(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create https `POST` request
|
/// Create HTTPS `POST` request
|
||||||
pub fn spost<S: AsRef<str>>(&self, path: S) -> ClientRequest {
|
pub fn spost<S: AsRef<str>>(&self, path: S) -> ClientRequest {
|
||||||
self.client.post(self.surl(path.as_ref()).as_str())
|
self.client.post(self.surl(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
@ -184,7 +184,7 @@ impl TestServer {
|
||||||
self.client.head(self.url(path.as_ref()).as_str())
|
self.client.head(self.url(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create https `HEAD` request
|
/// Create HTTPS `HEAD` request
|
||||||
pub fn shead<S: AsRef<str>>(&self, path: S) -> ClientRequest {
|
pub fn shead<S: AsRef<str>>(&self, path: S) -> ClientRequest {
|
||||||
self.client.head(self.surl(path.as_ref()).as_str())
|
self.client.head(self.surl(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
@ -194,7 +194,7 @@ impl TestServer {
|
||||||
self.client.put(self.url(path.as_ref()).as_str())
|
self.client.put(self.url(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create https `PUT` request
|
/// Create HTTPS `PUT` request
|
||||||
pub fn sput<S: AsRef<str>>(&self, path: S) -> ClientRequest {
|
pub fn sput<S: AsRef<str>>(&self, path: S) -> ClientRequest {
|
||||||
self.client.put(self.surl(path.as_ref()).as_str())
|
self.client.put(self.surl(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
@ -204,7 +204,7 @@ impl TestServer {
|
||||||
self.client.patch(self.url(path.as_ref()).as_str())
|
self.client.patch(self.url(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create https `PATCH` request
|
/// Create HTTPS `PATCH` request
|
||||||
pub fn spatch<S: AsRef<str>>(&self, path: S) -> ClientRequest {
|
pub fn spatch<S: AsRef<str>>(&self, path: S) -> ClientRequest {
|
||||||
self.client.patch(self.surl(path.as_ref()).as_str())
|
self.client.patch(self.surl(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
@ -214,7 +214,7 @@ impl TestServer {
|
||||||
self.client.delete(self.url(path.as_ref()).as_str())
|
self.client.delete(self.url(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create https `DELETE` request
|
/// Create HTTPS `DELETE` request
|
||||||
pub fn sdelete<S: AsRef<str>>(&self, path: S) -> ClientRequest {
|
pub fn sdelete<S: AsRef<str>>(&self, path: S) -> ClientRequest {
|
||||||
self.client.delete(self.surl(path.as_ref()).as_str())
|
self.client.delete(self.surl(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
@ -224,12 +224,12 @@ impl TestServer {
|
||||||
self.client.options(self.url(path.as_ref()).as_str())
|
self.client.options(self.url(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create https `OPTIONS` request
|
/// Create HTTPS `OPTIONS` request
|
||||||
pub fn soptions<S: AsRef<str>>(&self, path: S) -> ClientRequest {
|
pub fn soptions<S: AsRef<str>>(&self, path: S) -> ClientRequest {
|
||||||
self.client.options(self.surl(path.as_ref()).as_str())
|
self.client.options(self.surl(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Connect to test http server
|
/// Connect to test HTTP server
|
||||||
pub fn request<S: AsRef<str>>(&self, method: Method, path: S) -> ClientRequest {
|
pub fn request<S: AsRef<str>>(&self, method: Method, path: S) -> ClientRequest {
|
||||||
self.client.request(method, path.as_ref())
|
self.client.request(method, path.as_ref())
|
||||||
}
|
}
|
||||||
|
@ -263,7 +263,7 @@ impl TestServer {
|
||||||
self.ws_at("/").await
|
self.ws_at("/").await
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Stop http server
|
/// Stop HTTP server
|
||||||
fn stop(&mut self) {
|
fn stop(&mut self) {
|
||||||
self.system.stop();
|
self.system.stop();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
use std::pin::Pin;
|
//! Traits and structures to aid consuming and writing HTTP payloads.
|
||||||
use std::task::{Context, Poll};
|
|
||||||
use std::{fmt, mem};
|
use std::{
|
||||||
|
fmt, mem,
|
||||||
|
pin::Pin,
|
||||||
|
task::{Context, Poll},
|
||||||
|
};
|
||||||
|
|
||||||
use bytes::{Bytes, BytesMut};
|
use bytes::{Bytes, BytesMut};
|
||||||
use futures_core::{ready, Stream};
|
use futures_core::{ready, Stream};
|
||||||
|
@ -8,8 +12,8 @@ use pin_project::pin_project;
|
||||||
|
|
||||||
use crate::error::Error;
|
use crate::error::Error;
|
||||||
|
|
||||||
|
/// Body size hint.
|
||||||
#[derive(Debug, PartialEq, Copy, Clone)]
|
#[derive(Debug, PartialEq, Copy, Clone)]
|
||||||
/// Body size hint
|
|
||||||
pub enum BodySize {
|
pub enum BodySize {
|
||||||
None,
|
None,
|
||||||
Empty,
|
Empty,
|
||||||
|
@ -23,7 +27,7 @@ impl BodySize {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Type that provides this trait can be streamed to a peer.
|
/// Type that implement this trait can be streamed to a peer.
|
||||||
pub trait MessageBody {
|
pub trait MessageBody {
|
||||||
fn size(&self) -> BodySize;
|
fn size(&self) -> BodySize;
|
||||||
|
|
||||||
|
@ -80,7 +84,7 @@ impl ResponseBody<Body> {
|
||||||
|
|
||||||
impl<B> ResponseBody<B> {
|
impl<B> ResponseBody<B> {
|
||||||
pub fn take_body(&mut self) -> ResponseBody<B> {
|
pub fn take_body(&mut self) -> ResponseBody<B> {
|
||||||
std::mem::replace(self, ResponseBody::Other(Body::None))
|
mem::replace(self, ResponseBody::Other(Body::None))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +131,7 @@ impl<B: MessageBody> Stream for ResponseBody<B> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represents various types of http message body.
|
/// Represents various types of HTTP message body.
|
||||||
pub enum Body {
|
pub enum Body {
|
||||||
/// Empty response. `Content-Length` header is not set.
|
/// Empty response. `Content-Length` header is not set.
|
||||||
None,
|
None,
|
||||||
|
|
|
@ -34,7 +34,8 @@ enum SslConnector {
|
||||||
#[cfg(not(any(feature = "openssl", feature = "rustls")))]
|
#[cfg(not(any(feature = "openssl", feature = "rustls")))]
|
||||||
type SslConnector = ();
|
type SslConnector = ();
|
||||||
|
|
||||||
/// Manages http client network connectivity
|
/// Manages HTTP client network connectivity.
|
||||||
|
///
|
||||||
/// The `Connector` type uses a builder-like combinator pattern for service
|
/// The `Connector` type uses a builder-like combinator pattern for service
|
||||||
/// construction that finishes by calling the `.finish()` method.
|
/// construction that finishes by calling the `.finish()` method.
|
||||||
///
|
///
|
||||||
|
@ -160,8 +161,9 @@ where
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Maximum supported http major version
|
/// Maximum supported HTTP major version.
|
||||||
/// Supported versions http/1.1, http/2
|
///
|
||||||
|
/// Supported versions are HTTP/1.1 and HTTP/2.
|
||||||
pub fn max_http_version(mut self, val: http::Version) -> Self {
|
pub fn max_http_version(mut self, val: http::Version) -> Self {
|
||||||
let versions = match val {
|
let versions = match val {
|
||||||
http::Version::HTTP_11 => vec![b"http/1.1".to_vec()],
|
http::Version::HTTP_11 => vec![b"http/1.1".to_vec()],
|
||||||
|
|
|
@ -65,13 +65,16 @@ impl From<actix_tls::connect::ConnectError> for ConnectError {
|
||||||
|
|
||||||
#[derive(Debug, Display, From)]
|
#[derive(Debug, Display, From)]
|
||||||
pub enum InvalidUrl {
|
pub enum InvalidUrl {
|
||||||
#[display(fmt = "Missing url scheme")]
|
#[display(fmt = "Missing URL scheme")]
|
||||||
MissingScheme,
|
MissingScheme,
|
||||||
#[display(fmt = "Unknown url scheme")]
|
|
||||||
|
#[display(fmt = "Unknown URL scheme")]
|
||||||
UnknownScheme,
|
UnknownScheme,
|
||||||
|
|
||||||
#[display(fmt = "Missing host name")]
|
#[display(fmt = "Missing host name")]
|
||||||
MissingHost,
|
MissingHost,
|
||||||
#[display(fmt = "Url parse error: {}", _0)]
|
|
||||||
|
#[display(fmt = "URL parse error: {}", _0)]
|
||||||
HttpError(http::Error),
|
HttpError(http::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,25 +86,33 @@ pub enum SendRequestError {
|
||||||
/// Invalid URL
|
/// Invalid URL
|
||||||
#[display(fmt = "Invalid URL: {}", _0)]
|
#[display(fmt = "Invalid URL: {}", _0)]
|
||||||
Url(InvalidUrl),
|
Url(InvalidUrl),
|
||||||
|
|
||||||
/// Failed to connect to host
|
/// Failed to connect to host
|
||||||
#[display(fmt = "Failed to connect to host: {}", _0)]
|
#[display(fmt = "Failed to connect to host: {}", _0)]
|
||||||
Connect(ConnectError),
|
Connect(ConnectError),
|
||||||
|
|
||||||
/// Error sending request
|
/// Error sending request
|
||||||
Send(io::Error),
|
Send(io::Error),
|
||||||
|
|
||||||
/// Error parsing response
|
/// Error parsing response
|
||||||
Response(ParseError),
|
Response(ParseError),
|
||||||
|
|
||||||
/// Http error
|
/// Http error
|
||||||
#[display(fmt = "{}", _0)]
|
#[display(fmt = "{}", _0)]
|
||||||
Http(HttpError),
|
Http(HttpError),
|
||||||
|
|
||||||
/// Http2 error
|
/// Http2 error
|
||||||
#[display(fmt = "{}", _0)]
|
#[display(fmt = "{}", _0)]
|
||||||
H2(h2::Error),
|
H2(h2::Error),
|
||||||
|
|
||||||
/// Response took too long
|
/// Response took too long
|
||||||
#[display(fmt = "Timeout while waiting for response")]
|
#[display(fmt = "Timeout while waiting for response")]
|
||||||
Timeout,
|
Timeout,
|
||||||
/// Tunnels are not supported for http2 connection
|
|
||||||
|
/// Tunnels are not supported for HTTP/2 connection
|
||||||
#[display(fmt = "Tunnels are not supported for http2 connection")]
|
#[display(fmt = "Tunnels are not supported for http2 connection")]
|
||||||
TunnelNotSupported,
|
TunnelNotSupported,
|
||||||
|
|
||||||
/// Error sending request body
|
/// Error sending request body
|
||||||
Body(Error),
|
Body(Error),
|
||||||
}
|
}
|
||||||
|
@ -127,7 +138,8 @@ pub enum FreezeRequestError {
|
||||||
/// Invalid URL
|
/// Invalid URL
|
||||||
#[display(fmt = "Invalid URL: {}", _0)]
|
#[display(fmt = "Invalid URL: {}", _0)]
|
||||||
Url(InvalidUrl),
|
Url(InvalidUrl),
|
||||||
/// Http error
|
|
||||||
|
/// HTTP error
|
||||||
#[display(fmt = "{}", _0)]
|
#[display(fmt = "{}", _0)]
|
||||||
Http(HttpError),
|
Http(HttpError),
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
//! Http client api
|
//! HTTP client.
|
||||||
|
|
||||||
use http::Uri;
|
use http::Uri;
|
||||||
|
|
||||||
mod config;
|
mod config;
|
||||||
|
|
|
@ -95,32 +95,32 @@ impl ServiceConfig {
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if connection is secure (HTTPS)
|
||||||
#[inline]
|
#[inline]
|
||||||
/// Returns true if connection is secure(https)
|
|
||||||
pub fn secure(&self) -> bool {
|
pub fn secure(&self) -> bool {
|
||||||
self.0.secure
|
self.0.secure
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
/// Returns the local address that this server is bound to.
|
/// Returns the local address that this server is bound to.
|
||||||
|
#[inline]
|
||||||
pub fn local_addr(&self) -> Option<net::SocketAddr> {
|
pub fn local_addr(&self) -> Option<net::SocketAddr> {
|
||||||
self.0.local_addr
|
self.0.local_addr
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
/// Keep alive duration if configured.
|
/// Keep alive duration if configured.
|
||||||
|
#[inline]
|
||||||
pub fn keep_alive(&self) -> Option<Duration> {
|
pub fn keep_alive(&self) -> Option<Duration> {
|
||||||
self.0.keep_alive
|
self.0.keep_alive
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
/// Return state of connection keep-alive functionality
|
/// Return state of connection keep-alive functionality
|
||||||
|
#[inline]
|
||||||
pub fn keep_alive_enabled(&self) -> bool {
|
pub fn keep_alive_enabled(&self) -> bool {
|
||||||
self.0.ka_enabled
|
self.0.ka_enabled
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
/// Client timeout for first request.
|
/// Client timeout for first request.
|
||||||
|
#[inline]
|
||||||
pub fn client_timer(&self) -> Option<Sleep> {
|
pub fn client_timer(&self) -> Option<Sleep> {
|
||||||
let delay_time = self.0.client_timeout;
|
let delay_time = self.0.client_timeout;
|
||||||
if delay_time != 0 {
|
if delay_time != 0 {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use std::future::Future;
|
//! Stream decoders.
|
||||||
use std::io::{self, Write};
|
|
||||||
use std::pin::Pin;
|
|
||||||
use std::task::{Context, Poll};
|
use std::task::{Context, Poll};
|
||||||
|
use std::{future::Future, io, io::Write as _, pin::Pin};
|
||||||
|
|
||||||
use actix_rt::task::{spawn_blocking, JoinHandle};
|
use actix_rt::task::{spawn_blocking, JoinHandle};
|
||||||
use brotli2::write::BrotliDecoder;
|
use brotli2::write::BrotliDecoder;
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
//! Stream encoder
|
//! Stream encoders.
|
||||||
use std::future::Future;
|
|
||||||
use std::io::{self, Write};
|
|
||||||
use std::pin::Pin;
|
|
||||||
use std::task::{Context, Poll};
|
use std::task::{Context, Poll};
|
||||||
|
use std::{future::Future, io, io::Write as _, pin::Pin};
|
||||||
|
|
||||||
use actix_rt::task::{spawn_blocking, JoinHandle};
|
use actix_rt::task::{spawn_blocking, JoinHandle};
|
||||||
use brotli2::write::BrotliEncoder;
|
use brotli2::write::BrotliEncoder;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
//! Content-Encoding support
|
//! Content-Encoding support.
|
||||||
|
|
||||||
use std::io;
|
use std::io;
|
||||||
|
|
||||||
use bytes::{Bytes, BytesMut};
|
use bytes::{Bytes, BytesMut};
|
||||||
|
|
|
@ -38,7 +38,7 @@ pub type Result<T, E = Error> = result::Result<T, E>;
|
||||||
/// converting errors with `into()`.
|
/// converting errors with `into()`.
|
||||||
///
|
///
|
||||||
/// Whenever it is created from an external object a response error is created
|
/// Whenever it is created from an external object a response error is created
|
||||||
/// for it that can be used to create an http response from it this means that
|
/// for it that can be used to create an HTTP response from it this means that
|
||||||
/// if you have access to an actix `Error` you can always get a
|
/// if you have access to an actix `Error` you can always get a
|
||||||
/// `ResponseError` reference from it.
|
/// `ResponseError` reference from it.
|
||||||
pub struct Error {
|
pub struct Error {
|
||||||
|
@ -404,7 +404,7 @@ impl ResponseError for crate::cookie::ParseError {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Display, From)]
|
#[derive(Debug, Display, From)]
|
||||||
/// A set of errors that can occur during dispatching http requests
|
/// A set of errors that can occur during dispatching HTTP requests
|
||||||
pub enum DispatchError {
|
pub enum DispatchError {
|
||||||
/// Service error
|
/// Service error
|
||||||
Service(Error),
|
Service(Error),
|
||||||
|
|
|
@ -178,7 +178,7 @@ where
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create http/1 dispatcher with slow request timeout.
|
/// Create HTTP/1 dispatcher with slow request timeout.
|
||||||
pub(crate) fn with_timeout(
|
pub(crate) fn with_timeout(
|
||||||
io: T,
|
io: T,
|
||||||
codec: Codec,
|
codec: Codec,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
//! HTTP/1 implementation
|
//! HTTP/1 protocol implementation.
|
||||||
use bytes::{Bytes, BytesMut};
|
use bytes::{Bytes, BytesMut};
|
||||||
|
|
||||||
mod client;
|
mod client;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
//! HTTP/2 implementation.
|
//! HTTP/2 protocol.
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
pin::Pin,
|
pin::Pin,
|
||||||
|
|
|
@ -243,7 +243,7 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Service` implementation for http/2 transport
|
/// `Service` implementation for HTTP/2 transport
|
||||||
pub struct H2ServiceHandler<T, S, B>
|
pub struct H2ServiceHandler<T, S, B>
|
||||||
where
|
where
|
||||||
S: Service<Request>,
|
S: Service<Request>,
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
//! Helper trait for types that can be effectively borrowed as a [HeaderValue].
|
//! Helper trait for types that can be effectively borrowed as a [HeaderValue].
|
||||||
|
//!
|
||||||
|
//! [HeaderValue]: crate::http::HeaderValue
|
||||||
|
|
||||||
use std::{borrow::Cow, str::FromStr};
|
use std::{borrow::Cow, str::FromStr};
|
||||||
|
|
||||||
|
|
|
@ -25,8 +25,8 @@ pub mod encoding;
|
||||||
mod extensions;
|
mod extensions;
|
||||||
mod header;
|
mod header;
|
||||||
mod helpers;
|
mod helpers;
|
||||||
mod httpcodes;
|
mod http_codes;
|
||||||
pub mod httpmessage;
|
mod httpmessage;
|
||||||
mod message;
|
mod message;
|
||||||
mod payload;
|
mod payload;
|
||||||
mod request;
|
mod request;
|
||||||
|
|
|
@ -107,7 +107,7 @@ impl<P> Request<P> {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
/// Mutable reference to a http message part of the request
|
/// Mutable reference to a HTTP message part of the request
|
||||||
pub fn head_mut(&mut self) -> &mut RequestHead {
|
pub fn head_mut(&mut self) -> &mut RequestHead {
|
||||||
&mut *self.head
|
&mut *self.head
|
||||||
}
|
}
|
||||||
|
@ -158,10 +158,12 @@ impl<P> Request<P> {
|
||||||
self.head().method == Method::CONNECT
|
self.head().method == Method::CONNECT
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Peer socket address
|
/// Peer socket address.
|
||||||
///
|
///
|
||||||
/// Peer address is actual socket address, if proxy is used in front of
|
/// Peer address is the directly connected peer's socket address. If a proxy is used in front of
|
||||||
/// actix http server, then peer address would be address of this proxy.
|
/// the Actix Web server, then it would be address of this proxy.
|
||||||
|
///
|
||||||
|
/// Will only return None when called in unit tests.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn peer_addr(&self) -> Option<net::SocketAddr> {
|
pub fn peer_addr(&self) -> Option<net::SocketAddr> {
|
||||||
self.head().peer_addr
|
self.head().peer_addr
|
||||||
|
|
|
@ -32,13 +32,13 @@ pub struct Response<B = Body> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Response<Body> {
|
impl Response<Body> {
|
||||||
/// Create http response builder with specific status.
|
/// Create HTTP response builder with specific status.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn build(status: StatusCode) -> ResponseBuilder {
|
pub fn build(status: StatusCode) -> ResponseBuilder {
|
||||||
ResponseBuilder::new(status)
|
ResponseBuilder::new(status)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create http response builder
|
/// Create HTTP response builder
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn build_from<T: Into<ResponseBuilder>>(source: T) -> ResponseBuilder {
|
pub fn build_from<T: Into<ResponseBuilder>>(source: T) -> ResponseBuilder {
|
||||||
source.into()
|
source.into()
|
||||||
|
@ -97,7 +97,7 @@ impl<B> Response<B> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
/// Mutable reference to a http message part of the response
|
/// Mutable reference to a HTTP message part of the response
|
||||||
pub fn head_mut(&mut self) -> &mut ResponseHead {
|
pub fn head_mut(&mut self) -> &mut ResponseHead {
|
||||||
&mut *self.head
|
&mut *self.head
|
||||||
}
|
}
|
||||||
|
|
|
@ -432,7 +432,7 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Service` implementation for http transport
|
/// `Service` implementation for HTTP transport
|
||||||
pub struct HttpServiceHandler<T, S, B, X, U>
|
pub struct HttpServiceHandler<T, S, B, X, U>
|
||||||
where
|
where
|
||||||
S: Service<Request>,
|
S: Service<Request>,
|
||||||
|
|
|
@ -7,7 +7,7 @@ use std::io;
|
||||||
use actix_http::error::{ErrorBadRequest, PayloadError};
|
use actix_http::error::{ErrorBadRequest, PayloadError};
|
||||||
use actix_http::http::header::{self, HeaderName, HeaderValue};
|
use actix_http::http::header::{self, HeaderName, HeaderValue};
|
||||||
use actix_http::http::{Method, StatusCode, Version};
|
use actix_http::http::{Method, StatusCode, Version};
|
||||||
use actix_http::httpmessage::HttpMessage;
|
use actix_http::HttpMessage;
|
||||||
use actix_http::{body, Error, HttpService, Request, Response};
|
use actix_http::{body, Error, HttpService, Request, Response};
|
||||||
use actix_http_test::test_server;
|
use actix_http_test::test_server;
|
||||||
use actix_service::{fn_service, ServiceFactoryExt};
|
use actix_service::{fn_service, ServiceFactoryExt};
|
||||||
|
|
|
@ -10,7 +10,7 @@ use futures_util::future::{self, err, ok, ready, FutureExt};
|
||||||
use futures_util::stream::{once, StreamExt};
|
use futures_util::stream::{once, StreamExt};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
|
|
||||||
use actix_http::httpmessage::HttpMessage;
|
use actix_http::HttpMessage;
|
||||||
use actix_http::{
|
use actix_http::{
|
||||||
body, error, http, http::header, Error, HttpService, KeepAlive, Request, Response,
|
body, error, http, http::header, Error, HttpService, KeepAlive, Request, Response,
|
||||||
};
|
};
|
||||||
|
|
|
@ -15,7 +15,7 @@ use bytes::Bytes;
|
||||||
use futures_core::Stream;
|
use futures_core::Stream;
|
||||||
use tokio::sync::oneshot::Sender;
|
use tokio::sync::oneshot::Sender;
|
||||||
|
|
||||||
/// Execution context for http actors
|
/// Execution context for HTTP actors
|
||||||
pub struct HttpContext<A>
|
pub struct HttpContext<A>
|
||||||
where
|
where
|
||||||
A: Actor<Context = HttpContext<A>>,
|
A: Actor<Context = HttpContext<A>>,
|
||||||
|
|
|
@ -82,8 +82,9 @@ impl ClientBuilder {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Maximum supported http major version
|
/// Maximum supported HTTP major version.
|
||||||
/// Supported versions http/1.1, http/2
|
///
|
||||||
|
/// Supported versions are HTTP/1.1 and HTTP/2.
|
||||||
pub fn max_http_version(mut self, val: http::Version) -> Self {
|
pub fn max_http_version(mut self, val: http::Version) -> Self {
|
||||||
self.max_http_version = Some(val);
|
self.max_http_version = Some(val);
|
||||||
self
|
self
|
||||||
|
|
|
@ -134,7 +134,7 @@ use self::connect::{Connect, ConnectorWrapper};
|
||||||
///
|
///
|
||||||
/// let res = client.get("http://www.rust-lang.org") // <- Create request builder
|
/// let res = client.get("http://www.rust-lang.org") // <- Create request builder
|
||||||
/// .insert_header(("User-Agent", "Actix-web"))
|
/// .insert_header(("User-Agent", "Actix-web"))
|
||||||
/// .send() // <- Send http request
|
/// .send() // <- Send HTTP request
|
||||||
/// .await; // <- send request and wait for response
|
/// .await; // <- send request and wait for response
|
||||||
///
|
///
|
||||||
/// println!("Response: {:?}", res);
|
/// println!("Response: {:?}", res);
|
||||||
|
|
|
@ -42,10 +42,10 @@ cfg_if::cfg_if! {
|
||||||
/// let response = awc::Client::new()
|
/// let response = awc::Client::new()
|
||||||
/// .get("http://www.rust-lang.org") // <- Create request builder
|
/// .get("http://www.rust-lang.org") // <- Create request builder
|
||||||
/// .insert_header(("User-Agent", "Actix-web"))
|
/// .insert_header(("User-Agent", "Actix-web"))
|
||||||
/// .send() // <- Send http request
|
/// .send() // <- Send HTTP request
|
||||||
/// .await;
|
/// .await;
|
||||||
///
|
///
|
||||||
/// response.and_then(|response| { // <- server http response
|
/// response.and_then(|response| { // <- server HTTP response
|
||||||
/// println!("Response: {:?}", response);
|
/// println!("Response: {:?}", response);
|
||||||
/// Ok(())
|
/// Ok(())
|
||||||
/// });
|
/// });
|
||||||
|
@ -219,7 +219,7 @@ impl ClientRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Force close connection instead of returning it back to connections pool.
|
/// Force close connection instead of returning it back to connections pool.
|
||||||
/// This setting affect only http/1 connections.
|
/// This setting affect only HTTP/1 connections.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn force_close(mut self) -> Self {
|
pub fn force_close(mut self) -> Self {
|
||||||
self.head.set_connection_type(ConnectionType::Close);
|
self.head.set_connection_type(ConnectionType::Close);
|
||||||
|
|
|
@ -109,7 +109,7 @@ impl<S> ClientResponse<S>
|
||||||
where
|
where
|
||||||
S: Stream<Item = Result<Bytes, PayloadError>>,
|
S: Stream<Item = Result<Bytes, PayloadError>>,
|
||||||
{
|
{
|
||||||
/// Loads http response's body.
|
/// Loads HTTP response's body.
|
||||||
pub fn body(&mut self) -> MessageBody<S> {
|
pub fn body(&mut self) -> MessageBody<S> {
|
||||||
MessageBody::new(self)
|
MessageBody::new(self)
|
||||||
}
|
}
|
||||||
|
@ -151,7 +151,7 @@ impl<S> fmt::Debug for ClientResponse<S> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Future that resolves to a complete http message body.
|
/// Future that resolves to a complete HTTP message body.
|
||||||
pub struct MessageBody<S> {
|
pub struct MessageBody<S> {
|
||||||
length: Option<usize>,
|
length: Option<usize>,
|
||||||
err: Option<PayloadError>,
|
err: Option<PayloadError>,
|
||||||
|
|
|
@ -72,7 +72,7 @@ where
|
||||||
/// Set application data. Application data could be accessed
|
/// Set application data. Application data could be accessed
|
||||||
/// by using `Data<T>` extractor where `T` is data type.
|
/// by using `Data<T>` extractor where `T` is data type.
|
||||||
///
|
///
|
||||||
/// **Note**: http server accepts an application factory rather than
|
/// **Note**: HTTP server accepts an application factory rather than
|
||||||
/// an application instance. Http server constructs an application
|
/// an application instance. Http server constructs an application
|
||||||
/// instance for each thread, thus application data must be constructed
|
/// instance for each thread, thus application data must be constructed
|
||||||
/// multiple times. If you want to share data between different
|
/// multiple times. If you want to share data between different
|
||||||
|
@ -207,7 +207,7 @@ where
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Register http service.
|
/// Register HTTP service.
|
||||||
///
|
///
|
||||||
/// Http service is any type that implements `HttpServiceFactory` trait.
|
/// Http service is any type that implements `HttpServiceFactory` trait.
|
||||||
///
|
///
|
||||||
|
|
|
@ -27,7 +27,7 @@ pub(crate) type FnDataFactory =
|
||||||
///
|
///
|
||||||
/// Application data can be accessed by using `Data<T>` extractor where `T` is data type.
|
/// Application data can be accessed by using `Data<T>` extractor where `T` is data type.
|
||||||
///
|
///
|
||||||
/// **Note**: http server accepts an application factory rather than an application instance. HTTP
|
/// **Note**: HTTP server accepts an application factory rather than an application instance. HTTP
|
||||||
/// server constructs an application instance for each thread, thus application data must be
|
/// server constructs an application instance for each thread, thus application data must be
|
||||||
/// constructed multiple times. If you want to share data between different threads, a shareable
|
/// constructed multiple times. If you want to share data between different threads, a shareable
|
||||||
/// object should be used, e.g. `Send + Sync`. Application data does not need to be `Send`
|
/// object should be used, e.g. `Send + Sync`. Application data does not need to be `Send`
|
||||||
|
|
22
src/guard.rs
22
src/guard.rs
|
@ -176,7 +176,7 @@ impl Guard for NotGuard {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Http method guard
|
/// HTTP method guard.
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub struct MethodGuard(http::Method);
|
pub struct MethodGuard(http::Method);
|
||||||
|
|
||||||
|
@ -186,52 +186,52 @@ impl Guard for MethodGuard {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Guard to match *GET* http method
|
/// Guard to match *GET* HTTP method.
|
||||||
pub fn Get() -> MethodGuard {
|
pub fn Get() -> MethodGuard {
|
||||||
MethodGuard(http::Method::GET)
|
MethodGuard(http::Method::GET)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Predicate to match *POST* http method
|
/// Predicate to match *POST* HTTP method.
|
||||||
pub fn Post() -> MethodGuard {
|
pub fn Post() -> MethodGuard {
|
||||||
MethodGuard(http::Method::POST)
|
MethodGuard(http::Method::POST)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Predicate to match *PUT* http method
|
/// Predicate to match *PUT* HTTP method.
|
||||||
pub fn Put() -> MethodGuard {
|
pub fn Put() -> MethodGuard {
|
||||||
MethodGuard(http::Method::PUT)
|
MethodGuard(http::Method::PUT)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Predicate to match *DELETE* http method
|
/// Predicate to match *DELETE* HTTP method.
|
||||||
pub fn Delete() -> MethodGuard {
|
pub fn Delete() -> MethodGuard {
|
||||||
MethodGuard(http::Method::DELETE)
|
MethodGuard(http::Method::DELETE)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Predicate to match *HEAD* http method
|
/// Predicate to match *HEAD* HTTP method.
|
||||||
pub fn Head() -> MethodGuard {
|
pub fn Head() -> MethodGuard {
|
||||||
MethodGuard(http::Method::HEAD)
|
MethodGuard(http::Method::HEAD)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Predicate to match *OPTIONS* http method
|
/// Predicate to match *OPTIONS* HTTP method.
|
||||||
pub fn Options() -> MethodGuard {
|
pub fn Options() -> MethodGuard {
|
||||||
MethodGuard(http::Method::OPTIONS)
|
MethodGuard(http::Method::OPTIONS)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Predicate to match *CONNECT* http method
|
/// Predicate to match *CONNECT* HTTP method.
|
||||||
pub fn Connect() -> MethodGuard {
|
pub fn Connect() -> MethodGuard {
|
||||||
MethodGuard(http::Method::CONNECT)
|
MethodGuard(http::Method::CONNECT)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Predicate to match *PATCH* http method
|
/// Predicate to match *PATCH* HTTP method.
|
||||||
pub fn Patch() -> MethodGuard {
|
pub fn Patch() -> MethodGuard {
|
||||||
MethodGuard(http::Method::PATCH)
|
MethodGuard(http::Method::PATCH)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Predicate to match *TRACE* http method
|
/// Predicate to match *TRACE* HTTP method.
|
||||||
pub fn Trace() -> MethodGuard {
|
pub fn Trace() -> MethodGuard {
|
||||||
MethodGuard(http::Method::TRACE)
|
MethodGuard(http::Method::TRACE)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Predicate to match specified http method
|
/// Predicate to match specified HTTP method.
|
||||||
pub fn Method(method: http::Method) -> MethodGuard {
|
pub fn Method(method: http::Method) -> MethodGuard {
|
||||||
MethodGuard(method)
|
MethodGuard(method)
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,7 +62,7 @@ impl HttpRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This method returns mutable reference to the request head.
|
/// This method returns mutable reference to the request head.
|
||||||
/// panics if multiple references of http request exists.
|
/// panics if multiple references of HTTP request exists.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub(crate) fn head_mut(&mut self) -> &mut RequestHead {
|
pub(crate) fn head_mut(&mut self) -> &mut RequestHead {
|
||||||
&mut Rc::get_mut(&mut self.inner).unwrap().head
|
&mut Rc::get_mut(&mut self.inner).unwrap().head
|
||||||
|
@ -202,12 +202,14 @@ impl HttpRequest {
|
||||||
&self.app_state().rmap()
|
&self.app_state().rmap()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Peer socket address
|
/// Peer socket address.
|
||||||
///
|
///
|
||||||
/// Peer address is actual socket address, if proxy is used in front of
|
/// Peer address is the directly connected peer's socket address. If a proxy is used in front of
|
||||||
/// actix http server, then peer address would be address of this proxy.
|
/// the Actix Web server, then it would be address of this proxy.
|
||||||
///
|
///
|
||||||
/// To get client connection information `.connection_info()` should be used.
|
/// To get client connection information `.connection_info()` should be used.
|
||||||
|
///
|
||||||
|
/// Will only return None when called in unit tests.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn peer_addr(&self) -> Option<net::SocketAddr> {
|
pub fn peer_addr(&self) -> Option<net::SocketAddr> {
|
||||||
self.head().peer_addr
|
self.head().peer_addr
|
||||||
|
|
|
@ -40,7 +40,7 @@ struct Config {
|
||||||
|
|
||||||
/// An HTTP Server.
|
/// An HTTP Server.
|
||||||
///
|
///
|
||||||
/// Create new http server with application factory.
|
/// Create new HTTP server with application factory.
|
||||||
///
|
///
|
||||||
/// ```rust,no_run
|
/// ```rust,no_run
|
||||||
/// use actix_web::{web, App, HttpResponse, HttpServer};
|
/// use actix_web::{web, App, HttpResponse, HttpServer};
|
||||||
|
@ -86,7 +86,7 @@ where
|
||||||
S::Service: 'static,
|
S::Service: 'static,
|
||||||
B: MessageBody + 'static,
|
B: MessageBody + 'static,
|
||||||
{
|
{
|
||||||
/// Create new http server with application factory
|
/// Create new HTTP server with application factory
|
||||||
pub fn new(factory: F) -> Self {
|
pub fn new(factory: F) -> Self {
|
||||||
HttpServer {
|
HttpServer {
|
||||||
factory,
|
factory,
|
||||||
|
@ -131,8 +131,7 @@ where
|
||||||
|
|
||||||
/// Set number of workers to start.
|
/// Set number of workers to start.
|
||||||
///
|
///
|
||||||
/// By default http server uses number of available logical cpu as threads
|
/// By default, server uses number of available logical CPU as thread count.
|
||||||
/// count.
|
|
||||||
pub fn workers(mut self, num: usize) -> Self {
|
pub fn workers(mut self, num: usize) -> Self {
|
||||||
self.builder = self.builder.workers(num);
|
self.builder = self.builder.workers(num);
|
||||||
self
|
self
|
||||||
|
@ -257,7 +256,7 @@ where
|
||||||
/// Get addresses of bound sockets and the scheme for it.
|
/// Get addresses of bound sockets and the scheme for it.
|
||||||
///
|
///
|
||||||
/// This is useful when the server is bound from different sources
|
/// This is useful when the server is bound from different sources
|
||||||
/// with some sockets listening on http and some listening on https
|
/// with some sockets listening on HTTP and some listening on HTTPS
|
||||||
/// and the user should be presented with an enumeration of which
|
/// and the user should be presented with an enumeration of which
|
||||||
/// socket requires which protocol.
|
/// socket requires which protocol.
|
||||||
pub fn addrs_with_scheme(&self) -> Vec<(net::SocketAddr, &str)> {
|
pub fn addrs_with_scheme(&self) -> Vec<(net::SocketAddr, &str)> {
|
||||||
|
@ -610,7 +609,7 @@ where
|
||||||
{
|
{
|
||||||
/// Start listening for incoming connections.
|
/// Start listening for incoming connections.
|
||||||
///
|
///
|
||||||
/// This method starts number of http workers in separate threads.
|
/// This method starts number of HTTP workers in separate threads.
|
||||||
/// For each address this method starts separate thread which does
|
/// For each address this method starts separate thread which does
|
||||||
/// `accept()` in a loop.
|
/// `accept()` in a loop.
|
||||||
///
|
///
|
||||||
|
|
|
@ -164,12 +164,14 @@ impl ServiceRequest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Peer socket address
|
/// Peer socket address.
|
||||||
///
|
///
|
||||||
/// Peer address is actual socket address, if proxy is used in front of
|
/// Peer address is the directly connected peer's socket address. If a proxy is used in front of
|
||||||
/// actix http server, then peer address would be address of this proxy.
|
/// the Actix Web server, then it would be address of this proxy.
|
||||||
///
|
///
|
||||||
/// To get client connection information `ConnectionInfo` should be used.
|
/// To get client connection information `ConnectionInfo` should be used.
|
||||||
|
///
|
||||||
|
/// Will only return None when called in unit tests.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn peer_addr(&self) -> Option<net::SocketAddr> {
|
pub fn peer_addr(&self) -> Option<net::SocketAddr> {
|
||||||
self.head().peer_addr
|
self.head().peer_addr
|
||||||
|
|
10
src/test.rs
10
src/test.rs
|
@ -851,13 +851,13 @@ impl TestServerConfig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Start http/1.1 server only
|
/// Start HTTP/1.1 server only
|
||||||
pub fn h1(mut self) -> Self {
|
pub fn h1(mut self) -> Self {
|
||||||
self.tp = HttpVer::Http1;
|
self.tp = HttpVer::Http1;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Start http/2 server only
|
/// Start HTTP/2 server only
|
||||||
pub fn h2(mut self) -> Self {
|
pub fn h2(mut self) -> Self {
|
||||||
self.tp = HttpVer::Http2;
|
self.tp = HttpVer::Http2;
|
||||||
self
|
self
|
||||||
|
@ -956,7 +956,7 @@ impl TestServer {
|
||||||
self.client.options(self.url(path.as_ref()).as_str())
|
self.client.options(self.url(path.as_ref()).as_str())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Connect to test http server
|
/// Connect to test HTTP server
|
||||||
pub fn request<S: AsRef<str>>(&self, method: Method, path: S) -> ClientRequest {
|
pub fn request<S: AsRef<str>>(&self, method: Method, path: S) -> ClientRequest {
|
||||||
self.client.request(method, path.as_ref())
|
self.client.request(method, path.as_ref())
|
||||||
}
|
}
|
||||||
|
@ -990,7 +990,7 @@ impl TestServer {
|
||||||
self.ws_at("/").await
|
self.ws_at("/").await
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gracefully stop http server
|
/// Gracefully stop HTTP server
|
||||||
pub async fn stop(self) {
|
pub async fn stop(self) {
|
||||||
self.server.stop(true).await;
|
self.server.stop(true).await;
|
||||||
self.system.stop();
|
self.system.stop();
|
||||||
|
@ -1006,7 +1006,7 @@ impl Drop for TestServer {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use actix_http::httpmessage::HttpMessage;
|
use actix_http::HttpMessage;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue