pub struct Response<'r> { /* private fields */ }
Expand description
A response, as returned by types implementing
Responder
.
See Builder
for docs on how a Response
is typically created and the
module docs for notes on composing responses
Upgrading
A response may optionally register IoHandler
s for upgraded requests via
Response::add_upgrade()
or the corresponding builder method
Builder::upgrade()
. If the incoming request 1) requests an upgrade via a
Connection: Upgrade
header and 2) includes a protocol in its Upgrade
header that is registered by the returned Response
, the connection will be
upgraded. An upgrade response is sent to the client, and the registered
IoHandler
for the client’s preferred protocol is invoked with an
IoStream
representing a raw byte stream to the
client. Note that protocol names are treated case-insensitively during
matching.
If a connection is upgraded, Rocket automatically set the following in the upgrade response:
- The response status to
101 Switching Protocols
. - The
Connection: Upgrade
header. - The
Upgrade
header’s value to the selected protocol.
As such, a response should never set a 101
status nor the Connection
or Upgrade
headers: Rocket handles this automatically. Instead, it should
set a status and headers to use in case the connection is not upgraded,
either due to an error or because the client did not request an upgrade.
If a connection is not upgraded due to an error, even though there was a
matching, registered protocol, the IoHandler
is not invoked, and the
original response is sent to the client without alteration.
Implementations§
source§impl<'r> Response<'r>
impl<'r> Response<'r>
sourcepub fn new() -> Response<'r>
pub fn new() -> Response<'r>
Creates a new, empty Response
without a status, body, or headers.
Because all HTTP responses must have a status, if a default Response
is written to the client without a status, the status defaults to 200 Ok
.
Example
use rocket::Response;
use rocket::http::Status;
let mut response = Response::new();
assert_eq!(response.status(), Status::Ok);
assert_eq!(response.headers().len(), 0);
assert!(response.body().is_none());
sourcepub fn build() -> Builder<'r>
pub fn build() -> Builder<'r>
Returns a Builder
with a base of Response::new()
.
Example
use rocket::Response;
let builder = Response::build();
sourcepub fn build_from(other: Response<'r>) -> Builder<'r>
pub fn build_from(other: Response<'r>) -> Builder<'r>
Returns a Builder
with a base of other
.
Example
use rocket::Response;
let other = Response::new();
let builder = Response::build_from(other);
sourcepub fn status(&self) -> Status
pub fn status(&self) -> Status
Returns the status of self
.
Example
use rocket::Response;
use rocket::http::Status;
let mut response = Response::new();
assert_eq!(response.status(), Status::Ok);
response.set_status(Status::NotFound);
assert_eq!(response.status(), Status::NotFound);
sourcepub fn set_status(&mut self, status: Status)
pub fn set_status(&mut self, status: Status)
Sets the status of self
to status
.
Example
use rocket::Response;
use rocket::http::Status;
let mut response = Response::new();
response.set_status(Status::ImATeapot);
assert_eq!(response.status(), Status::ImATeapot);
sourcepub fn content_type(&self) -> Option<ContentType>
pub fn content_type(&self) -> Option<ContentType>
Returns the Content-Type header of self
. If the header is not present
or is malformed, returns None
.
Example
use rocket::Response;
use rocket::http::ContentType;
let mut response = Response::new();
response.set_header(ContentType::HTML);
assert_eq!(response.content_type(), Some(ContentType::HTML));
Returns an iterator over the cookies in self
as identified by the
Set-Cookie
header. Malformed cookies are skipped.
Example
use rocket::Response;
use rocket::http::Cookie;
let mut response = Response::new();
response.set_header(Cookie::new("hello", "world!"));
let cookies: Vec<_> = response.cookies().collect();
assert_eq!(cookies, vec![Cookie::new("hello", "world!")]);
sourcepub fn headers(&self) -> &HeaderMap<'r>
pub fn headers(&self) -> &HeaderMap<'r>
Returns a HeaderMap
of all of the headers in self
.
Example
use rocket::Response;
use rocket::http::Header;
let mut response = Response::new();
response.adjoin_raw_header("X-Custom", "1");
response.adjoin_raw_header("X-Custom", "2");
let mut custom_headers = response.headers().iter();
assert_eq!(custom_headers.next(), Some(Header::new("X-Custom", "1")));
assert_eq!(custom_headers.next(), Some(Header::new("X-Custom", "2")));
assert_eq!(custom_headers.next(), None);
sourcepub fn set_header<'h: 'r, H: Into<Header<'h>>>(&mut self, header: H) -> bool
pub fn set_header<'h: 'r, H: Into<Header<'h>>>(&mut self, header: H) -> bool
Sets the header header
in self
. Any existing headers with the name
header.name
will be lost, and only header
will remain. The type of
header
can be any type that implements Into<Header>
. This includes
Header
itself, ContentType
and
hyper::header
types.
Example
use rocket::Response;
use rocket::http::ContentType;
let mut response = Response::new();
response.set_header(ContentType::HTML);
assert_eq!(response.headers().iter().next(), Some(ContentType::HTML.into()));
assert_eq!(response.headers().len(), 1);
response.set_header(ContentType::JSON);
assert_eq!(response.headers().iter().next(), Some(ContentType::JSON.into()));
assert_eq!(response.headers().len(), 1);
sourcepub fn set_raw_header<'a: 'r, 'b: 'r, N, V>(
&mut self,
name: N,
value: V
) -> boolwhere
N: Into<Cow<'a, str>>,
V: Into<Cow<'b, str>>,
pub fn set_raw_header<'a: 'r, 'b: 'r, N, V>( &mut self, name: N, value: V ) -> boolwhere N: Into<Cow<'a, str>>, V: Into<Cow<'b, str>>,
Sets the custom header with name name
and value value
in self
. Any
existing headers with the same name
will be lost, and the new custom
header will remain. This method should be used sparingly; prefer to use
set_header instead.
Example
use rocket::Response;
use rocket::http::Header;
let mut response = Response::new();
response.set_raw_header("X-Custom", "1");
assert_eq!(response.headers().get_one("X-Custom"), Some("1"));
assert_eq!(response.headers().len(), 1);
response.set_raw_header("X-Custom", "2");
assert_eq!(response.headers().get_one("X-Custom"), Some("2"));
assert_eq!(response.headers().len(), 1);
sourcepub fn adjoin_header<'h: 'r, H: Into<Header<'h>>>(&mut self, header: H)
pub fn adjoin_header<'h: 'r, H: Into<Header<'h>>>(&mut self, header: H)
Adds the header header
to self
. If self
contains headers with the
name header.name
, another header with the same name and value
header.value
is added. The type of header
can be any type that
implements Into<Header>
. This includes Header
itself,
ContentType
and hyper::header
types.
Example
use rocket::Response;
use rocket::http::Header;
use rocket::http::hyper::header::ACCEPT;
let mut response = Response::new();
response.adjoin_header(Header::new(ACCEPT.as_str(), "application/json"));
response.adjoin_header(Header::new(ACCEPT.as_str(), "text/plain"));
let mut accept_headers = response.headers().iter();
assert_eq!(accept_headers.next(), Some(Header::new(ACCEPT.as_str(), "application/json")));
assert_eq!(accept_headers.next(), Some(Header::new(ACCEPT.as_str(), "text/plain")));
assert_eq!(accept_headers.next(), None);
sourcepub fn adjoin_raw_header<'a: 'r, 'b: 'r, N, V>(&mut self, name: N, value: V)where
N: Into<Cow<'a, str>>,
V: Into<Cow<'b, str>>,
pub fn adjoin_raw_header<'a: 'r, 'b: 'r, N, V>(&mut self, name: N, value: V)where N: Into<Cow<'a, str>>, V: Into<Cow<'b, str>>,
Adds a custom header with name name
and value value
to self
. If
self
already contains headers with the name name
, another header
with the same name
and value
is added. The type of header
can be
any type implements Into<Header>
. This includes Header
itself,
ContentType
and hyper::header
types.
Example
use rocket::Response;
use rocket::http::Header;
let mut response = Response::new();
response.adjoin_raw_header("X-Custom", "one");
response.adjoin_raw_header("X-Custom", "two");
let mut custom_headers = response.headers().iter();
assert_eq!(custom_headers.next(), Some(Header::new("X-Custom", "one")));
assert_eq!(custom_headers.next(), Some(Header::new("X-Custom", "two")));
assert_eq!(custom_headers.next(), None);
sourcepub fn remove_header(&mut self, name: &str)
pub fn remove_header(&mut self, name: &str)
Removes all headers with the name name
.
Example
use rocket::Response;
let mut response = Response::new();
response.adjoin_raw_header("X-Custom", "one");
response.adjoin_raw_header("X-Custom", "two");
response.adjoin_raw_header("X-Other", "hi");
assert_eq!(response.headers().len(), 3);
response.remove_header("X-Custom");
assert_eq!(response.headers().len(), 1);
sourcepub fn body(&self) -> &Body<'r>
pub fn body(&self) -> &Body<'r>
Returns an immutable borrow of the body of self
, if there is one.
Example
use std::io::Cursor;
use rocket::Response;
let mut response = Response::new();
assert!(response.body().is_none());
let string = "Hello, world!";
response.set_sized_body(string.len(), Cursor::new(string));
assert!(response.body().is_some());
sourcepub fn upgrade(&mut self, proto: &str) -> Option<Pin<&mut (dyn IoHandler + 'r)>>
pub fn upgrade(&mut self, proto: &str) -> Option<Pin<&mut (dyn IoHandler + 'r)>>
Returns the IoHandler
for the protocol proto
.
Returns Some
if such a handler was registered via
Response::add_upgrade()
or the corresponding builder method
upgrade()
. Otherwise returns None
.
use std::pin::Pin;
use rocket::Response;
use rocket::data::{IoHandler, IoStream};
use rocket::tokio::io;
struct EchoHandler;
#[rocket::async_trait]
impl IoHandler for EchoHandler {
async fn io(self: Pin<Box<Self>>, io: IoStream) -> io::Result<()> {
let (mut reader, mut writer) = io::split(io);
io::copy(&mut reader, &mut writer).await?;
Ok(())
}
}
let mut response = Response::new();
assert!(response.upgrade("raw-echo").is_none());
response.add_upgrade("raw-echo", EchoHandler);
assert!(response.upgrade("raw-echo").is_some());
sourcepub fn body_mut(&mut self) -> &mut Body<'r>
pub fn body_mut(&mut self) -> &mut Body<'r>
Returns a mutable borrow of the body of self
, if there is one. A
mutable borrow allows for reading the body.
Example
use std::io::Cursor;
use rocket::Response;
let mut response = Response::new();
assert!(response.body().is_none());
let string = "Hello, world!";
response.set_sized_body(string.len(), Cursor::new(string));
let string = response.body_mut().to_string().await;
assert_eq!(string.unwrap(), "Hello, world!");
sourcepub fn set_sized_body<B, S>(&mut self, size: S, body: B)where
B: AsyncRead + AsyncSeek + Send + 'r,
S: Into<Option<usize>>,
pub fn set_sized_body<B, S>(&mut self, size: S, body: B)where B: AsyncRead + AsyncSeek + Send + 'r, S: Into<Option<usize>>,
Sets the body of self
to be the fixed-sized body
with size
size
, which may be None
. If size
is None
, the body’s size will
be computing with calls to seek
just before being written out in a
response.
Example
use std::io;
use rocket::Response;
let string = "Hello, world!";
let mut response = Response::new();
response.set_sized_body(string.len(), io::Cursor::new(string));
assert_eq!(response.body_mut().to_string().await?, "Hello, world!");
sourcepub fn set_streamed_body<B>(&mut self, body: B)where
B: AsyncRead + Send + 'r,
pub fn set_streamed_body<B>(&mut self, body: B)where B: AsyncRead + Send + 'r,
Sets the body of self
to body
, which will be streamed.
The max chunk size is configured via Response::set_max_chunk_size()
and defaults to Body::DEFAULT_MAX_CHUNK
.
Example
use tokio::io::{repeat, AsyncReadExt};
use rocket::Response;
let mut response = Response::new();
response.set_streamed_body(repeat(97).take(5));
assert_eq!(response.body_mut().to_string().await?, "aaaaa");
sourcepub fn add_upgrade<N, H>(&mut self, protocol: N, handler: H)where
N: Into<Uncased<'r>>,
H: IoHandler + 'r,
pub fn add_upgrade<N, H>(&mut self, protocol: N, handler: H)where N: Into<Uncased<'r>>, H: IoHandler + 'r,
Registers handler
as the I/O handler for upgrade protocol protocol
.
Responses registering I/O handlers for upgraded protocols should not
set the response status to 101
, nor set the Connection
or Upgrade
headers. Rocket automatically sets these headers as needed. See
Response
#upgrading for details.
If a handler was previously registered for protocol
, this handler
replaces it. If the connection is upgraded to protocol
, the last
handler
registered for the protocol is used to handle the connection.
See IoHandler
for details on implementing an I/O handler. For
details on connection upgrading, see Response
#upgrading.
Example
use std::pin::Pin;
use rocket::Response;
use rocket::data::{IoHandler, IoStream};
use rocket::tokio::io;
struct EchoHandler;
#[rocket::async_trait]
impl IoHandler for EchoHandler {
async fn io(self: Pin<Box<Self>>, io: IoStream) -> io::Result<()> {
let (mut reader, mut writer) = io::split(io);
io::copy(&mut reader, &mut writer).await?;
Ok(())
}
}
let mut response = Response::new();
assert!(response.upgrade("raw-echo").is_none());
response.add_upgrade("raw-echo", EchoHandler);
assert!(response.upgrade("raw-echo").is_some());
sourcepub fn set_max_chunk_size(&mut self, size: usize)
pub fn set_max_chunk_size(&mut self, size: usize)
Sets the body’s maximum chunk size to size
bytes.
The default max chunk size is Body::DEFAULT_MAX_CHUNK
. The max chunk
size is a property of the body and is thus reset whenever a body is set
via Response::set_streamed_body()
, Response::set_sized_body()
,
or the corresponding builder methods.
This setting does not typically need to be changed. Configuring a high value can result in high memory usage. Similarly, configuring a low value can result in excessive network writes. When unsure, leave the value unchanged.
Example
use tokio::io::{repeat, AsyncReadExt};
use rocket::Response;
let mut response = Response::new();
response.set_streamed_body(repeat(97).take(5));
response.set_max_chunk_size(3072);
sourcepub fn merge(&mut self, other: Response<'r>)
pub fn merge(&mut self, other: Response<'r>)
Replaces this response’s status and body with that of other
, if they
exist in other
. Any headers that exist in other
replace the ones in
self
. Any in self
that aren’t in other
remain in self
.
Example
use rocket::Response;
use rocket::http::{Status, ContentType};
let base = Response::build()
.status(Status::NotFound)
.header(ContentType::HTML)
.raw_header("X-Custom", "value 1")
.finalize();
let response = Response::build()
.status(Status::ImATeapot)
.raw_header("X-Custom", "value 2")
.raw_header_adjoin("X-Custom", "value 3")
.merge(base)
.finalize();
assert_eq!(response.status(), Status::NotFound);
let ctype: Vec<_> = response.headers().get("Content-Type").collect();
assert_eq!(ctype, vec![ContentType::HTML.to_string()]);
let custom_values: Vec<_> = response.headers().get("X-Custom").collect();
assert_eq!(custom_values, vec!["value 1"]);
sourcepub fn join(&mut self, other: Response<'r>)
pub fn join(&mut self, other: Response<'r>)
Sets self
’s status and body to that of other
if they are not already
set in self
. Any headers present in both other
and self
are
adjoined.
Example
use rocket::Response;
use rocket::http::{Status, ContentType};
let other = Response::build()
.status(Status::NotFound)
.header(ContentType::HTML)
.raw_header("X-Custom", "value 1")
.finalize();
let response = Response::build()
.status(Status::ImATeapot)
.raw_header("X-Custom", "value 2")
.raw_header_adjoin("X-Custom", "value 3")
.join(other)
.finalize();
assert_eq!(response.status(), Status::ImATeapot);
let ctype: Vec<_> = response.headers().get("Content-Type").collect();
assert_eq!(ctype, vec![ContentType::HTML.to_string()]);
let custom_values: Vec<_> = response.headers().get("X-Custom").collect();
assert_eq!(custom_values, vec!["value 2", "value 3", "value 1"]);
Trait Implementations§
Auto Trait Implementations§
impl<'r> !RefUnwindSafe for Response<'r>
impl<'r> Send for Response<'r>
impl<'r> !Sync for Response<'r>
impl<'r> Unpin for Response<'r>
impl<'r> !UnwindSafe for Response<'r>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoCollection<T> for T
impl<T> IntoCollection<T> for T
source§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere T: ?Sized,
source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the foreground set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red()
and
green()
, which have the same functionality but are
pithier.
Example
Set foreground color to white using fg()
:
use yansi::{Paint, Color};
painted.fg(Color::White);
Set foreground color to white using white()
.
use yansi::Paint;
painted.white();
source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightYellow
.
Example
println!("{}", value.bright_yellow());
source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightMagenta
.
Example
println!("{}", value.bright_magenta());
source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the background set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red()
and
on_green()
, which have the same functionality but
are pithier.
Example
Set background color to red using fg()
:
use yansi::{Paint, Color};
painted.bg(Color::Red);
Set background color to red using on_red()
.
use yansi::Paint;
painted.on_red();
source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightBlack
.
Example
println!("{}", value.on_bright_black());
source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightGreen
.
Example
println!("{}", value.on_bright_green());
source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightYellow
.
Example
println!("{}", value.on_bright_yellow());
source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightBlue
.
Example
println!("{}", value.on_bright_blue());
source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightMagenta
.
Example
println!("{}", value.on_bright_magenta());
source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightCyan
.
Example
println!("{}", value.on_bright_cyan());
source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightWhite
.
Example
println!("{}", value.on_bright_white());
source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute
value
.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold()
and
underline()
, which have the same functionality
but are pithier.
Example
Make text bold using attr()
:
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);
Make text bold using using bold()
.
use yansi::Paint;
painted.bold();
source§fn underline(&self) -> Painted<&T>
fn underline(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::Underline
.
Example
println!("{}", value.underline());
source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::RapidBlink
.
Example
println!("{}", value.rapid_blink());
source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi
Quirk
value
.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask()
and
wrap()
, which have the same functionality but are
pithier.
Example
Enable wrapping using .quirk()
:
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);
Enable wrapping using wrap()
.
use yansi::Paint;
painted.wrap();
source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition
value
applies. Replaces any previous condition.
See the crate level docs for more details.
Example
Enable styling painted
only when both stdout
and stderr
are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);