pub struct RequestHandle { /* private fields */ }Expand description
The low-level interface to HTTP requests.
For most applications, you should use Request instead of this
interface. See the top-level handle documentation for more details.
§Getting the client request
Call RequestHandle::from_client() to get the client request being handled by this execution
of the Compute program.
§Creation and conversion
New requests can be created programmatically with RequestHandle::new(). In addition, you can
convert to and from Request using Request::from_handles() and
Request::into_handles().
§Sending backend requests
Requests can be sent to a backend in blocking or asynchronous fashion using
send(), send_async(), or
send_async_streaming().
Implementations§
Source§impl RequestHandle
impl RequestHandle
Sourcepub const INVALID: Self
pub const INVALID: Self
An invalid handle.
This is primarily useful to represent uninitialized values when using the interfaces in
fastly_sys.
Sourcepub const fn is_invalid(&self) -> bool
pub const fn is_invalid(&self) -> bool
Returns true if the request handle is invalid.
Sourcepub fn as_u32(&self) -> u32
pub fn as_u32(&self) -> u32
Get the underlying representation of the handle.
This should only be used when calling the raw ABI directly, and care should be taken not to reuse or alias handle values.
Sourcepub fn as_u32_mut(&mut self) -> &mut u32
pub fn as_u32_mut(&mut self) -> &mut u32
Get a mutable reference to the underlying u32 representation of the handle.
This should only be used when calling the raw ABI directly, and care should be taken not to reuse or alias handle values.
Sourcepub fn into_u32(self) -> u32
pub fn into_u32(self) -> u32
Turn a handle into its representation without closing the underlying resource.
This should only be used when calling the raw ABI directly, and care should be taken not to reuse or alias handle values.
Sourcepub unsafe fn from_u32(handle: u32) -> Self
pub unsafe fn from_u32(handle: u32) -> Self
Turn a handle representation into a RequestHandle Handle, claiming ownership of the
underlying resource.
§Safety
This should only be used when calling the raw ABI directly, and care should be taken not to reuse or alias handle values.
Sourcepub fn from_client() -> Self
pub fn from_client() -> Self
Get a handle to the client request being handled by this execution of the Compute program.
§Panics
This method panics if the client request has already been retrieved by this method,
client_request_and_body(), or Request::from_client().
Sourcepub fn new() -> Self
pub fn new() -> Self
Acquire a new request handle.
By default, the request will have a GET method, a URL of /, and empty headers.
Sourcepub fn get_header_names(
&self,
buf_size: usize,
) -> impl Iterator<Item = Result<HeaderName, BufferSizeError>> + '_
pub fn get_header_names( &self, buf_size: usize, ) -> impl Iterator<Item = Result<HeaderName, BufferSizeError>> + '_
Read the request’s header names via a buffer of the provided size.
If there is a header name that is longer than buf_size, this will return a
BufferSizeError; you can retry with a larger buffer size if necessary.
Sourcepub fn get_header_values<'a>(
&'a self,
name: &'a HeaderName,
buf_size: usize,
) -> impl Iterator<Item = Result<HeaderValue, BufferSizeError>> + 'a
pub fn get_header_values<'a>( &'a self, name: &'a HeaderName, buf_size: usize, ) -> impl Iterator<Item = Result<HeaderValue, BufferSizeError>> + 'a
Get the header values for the given name via a buffer of the provided size.
If there is a header value that is longer than the buffer, this will return a
BufferSizeError; you can retry with a larger buffer size if necessary.
§Examples
Collect all the header values into a Vec:
let name = HeaderName::from_static("My-App-Header");
let buf_size = 128;
let header_values: Vec<HeaderValue> = request
.get_header_values(&name, buf_size)
.collect::<Result<Vec<HeaderValue>, _>>()?;To try again with a larger buffer if the first call fails, you can use
unwrap_or_else():
let name = HeaderName::from_static("My-App-Header");
let buf_size = 128;
// Collect header values into a `Vec<HeaderValue>`, with a buffer size of `128`.
// If the first call fails, print our error and then try to collect header values
// again. The second call will use a larger buffer size of `1024`.
let header_values: Vec<HeaderValue> = request
.get_header_values(&name, buf_size)
.collect::<Result<_, _>>()
.unwrap_or_else(|err: BufferSizeError| {
let larger_buf_size = 1024;
request
.get_header_values(&name, larger_buf_size)
.collect::<Result<_, _>>()
.unwrap()
});Sourcepub fn set_header_values<'a, I>(&mut self, name: &HeaderName, values: I)where
I: IntoIterator<Item = &'a HeaderValue>,
pub fn set_header_values<'a, I>(&mut self, name: &HeaderName, values: I)where
I: IntoIterator<Item = &'a HeaderValue>,
Set the values for the given header name, replacing any headers that previously existed for that name.
Sourcepub fn get_header_value(
&self,
name: &HeaderName,
max_len: usize,
) -> Result<Option<HeaderValue>, BufferSizeError>
pub fn get_header_value( &self, name: &HeaderName, max_len: usize, ) -> Result<Option<HeaderValue>, BufferSizeError>
Get the value of a header, or None if the header is not present.
If there are multiple values for the header, only one is returned. See
get_header_values() if you need to get all of the values.
If the value is longer than max_len, this will return a BufferSizeError; you can retry
with a larger buffer size if necessary.
Sourcepub fn insert_header(&mut self, name: &HeaderName, value: &HeaderValue)
pub fn insert_header(&mut self, name: &HeaderName, value: &HeaderValue)
Set a request header to the given value, discarding any previous values for the given header name.
Sourcepub fn append_header(&mut self, name: &HeaderName, value: &HeaderValue)
pub fn append_header(&mut self, name: &HeaderName, value: &HeaderValue)
Add a request header with given value.
Unlike insert_header(), this does not discard existing values
for the same header name.
Sourcepub fn remove_header(&mut self, name: &HeaderName) -> bool
pub fn remove_header(&mut self, name: &HeaderName) -> bool
Remove all request headers of the given name, and return whether any headers were removed.
Sourcepub fn get_version(&self) -> Version
pub fn get_version(&self) -> Version
Get the HTTP version of this request.
Sourcepub fn set_version(&mut self, v: Version)
pub fn set_version(&mut self, v: Version)
Set the HTTP version of this request.
Sourcepub fn get_method(&self, max_length: usize) -> Result<Method, BufferSizeError>
pub fn get_method(&self, max_length: usize) -> Result<Method, BufferSizeError>
Get the request method.
If the method is longer than max_length, this will return a BufferSizeError; you can
retry with a larger buffer size if necessary.
Sourcepub fn set_method(&self, method: &Method)
pub fn set_method(&self, method: &Method)
Set the request method.
Sourcepub fn get_url(&self, max_length: usize) -> Result<Url, BufferSizeError>
pub fn get_url(&self, max_length: usize) -> Result<Url, BufferSizeError>
Get the request URL.
If the URL is longer than max_length, this will return a BufferSizeError; you can
retry with a larger buffer size if necessary.
Sourcepub fn send(
self,
body: BodyHandle,
backend: &str,
) -> Result<(ResponseHandle, BodyHandle), SendErrorCause>
pub fn send( self, body: BodyHandle, backend: &str, ) -> Result<(ResponseHandle, BodyHandle), SendErrorCause>
Retrieve a response for the request, either from cache or by sending it to the given backend server. Returns once the response headers have been received, or an error occurs.
Sourcepub fn send_to_backend(
self,
body: BodyHandle,
backend: &Backend,
) -> Result<(ResponseHandle, BodyHandle), SendErrorCause>
pub fn send_to_backend( self, body: BodyHandle, backend: &Backend, ) -> Result<(ResponseHandle, BodyHandle), SendErrorCause>
Retrieve a response for the request, either from cache or by sending it to the given backend server. Returns once the response headers have been received, or an error occurs.
Sourcepub fn send_async(
self,
body: BodyHandle,
backend: &str,
) -> Result<PendingRequestHandle, SendErrorCause>
pub fn send_async( self, body: BodyHandle, backend: &str, ) -> Result<PendingRequestHandle, SendErrorCause>
Send a request asynchronously via the given backend, returning as soon as the request has begun sending.
The resulting PendingRequestHandle can be evaluated using
PendingRequestHandle::poll(), PendingRequestHandle::wait(), or
select_handles(). It can also be discarded if the
request was sent for effects it might have, and the response is unimportant.
Sourcepub fn send_async_to_backend(
self,
body: BodyHandle,
backend: &Backend,
) -> Result<PendingRequestHandle, SendErrorCause>
pub fn send_async_to_backend( self, body: BodyHandle, backend: &Backend, ) -> Result<PendingRequestHandle, SendErrorCause>
Send a request asynchronously via the given backend, returning as soon as the request has begun sending.
The resulting PendingRequestHandle can be evaluated using
PendingRequestHandle::poll(), PendingRequestHandle::wait(), or
select_handles(). It can also be discarded if the
request was sent for effects it might have, and the response is unimportant.
Sourcepub fn send_async_streaming(
self,
body: BodyHandle,
backend: &str,
) -> Result<(StreamingBodyHandle, PendingRequestHandle), SendErrorCause>
pub fn send_async_streaming( self, body: BodyHandle, backend: &str, ) -> Result<(StreamingBodyHandle, PendingRequestHandle), SendErrorCause>
Send a request asynchronously via the given backend, and return a StreamingBodyHandle to
allow continued writes to the request body.
StreamingBodyHandle::finish() must be called in order to finish sending the request.
Sourcepub fn send_async_streaming_to_backend(
self,
body: BodyHandle,
backend: &Backend,
) -> Result<(StreamingBodyHandle, PendingRequestHandle), SendErrorCause>
pub fn send_async_streaming_to_backend( self, body: BodyHandle, backend: &Backend, ) -> Result<(StreamingBodyHandle, PendingRequestHandle), SendErrorCause>
Send a request asynchronously via the given backend, and return a StreamingBodyHandle to
allow continued writes to the request body.
StreamingBodyHandle::finish() must be called in order to finish sending the request.
Sourcepub fn set_cache_override(&mut self, cache_override: &CacheOverride)
pub fn set_cache_override(&mut self, cache_override: &CacheOverride)
Set the cache override behavior for this request.
This setting will override any cache directive headers returned in response to this request. Note that stale_if_error is not overridden by this mechanism.
Sourcepub fn close(self) -> Result<(), HandleError>
pub fn close(self) -> Result<(), HandleError>
Close the RequestHandle by removing it from the host Session. If the handle has already
been closed an error will be returned. When calling
send/send_async/send_async_streaming the RequestHandle is consumed and
it’s cleaned up. You should only call close if you have not sent a
request yet and want to clean up the resources if not being used.
§Examples
let request = RequestHandle::new();
// The handle is not being used so we can close it out without any
// trouble
request.close()?;Sourcepub fn set_auto_decompress_response(
&mut self,
content_encodings: ContentEncodings,
)
pub fn set_auto_decompress_response( &mut self, content_encodings: ContentEncodings, )
Set the content encodings to automatically decompress responses to this request.
If the response to this request is encoded by one of the encodings set by this method, the
response will be presented to the Compute program in decompressed form with the
Content-Encoding and Content-Length headers removed.
Sourcepub fn set_framing_headers_mode(&mut self, mode: FramingHeadersMode)
pub fn set_framing_headers_mode(&mut self, mode: FramingHeadersMode)
Sets the way that framing headers are determined for this request.
Sourcepub fn on_behalf_of(&mut self, service: &str) -> Result<(), FastlyStatus>
pub fn on_behalf_of(&mut self, service: &str) -> Result<(), FastlyStatus>
Perform this send on behalf of another service, meaning that we will use that service’s cache to look up and store the result.
§Internal / Privileged
This operation is privileged, and attempts to use this functionality without proper privileges will cause errors. If you are interested in having two or more of your services share the same cache, please talk to your Fastly account representative. While we have no plans to offer this ability widely – this capability is only currently allowed for Fastly-internal services – we may revisit this decision given sufficient customer input.
Sourcepub fn handoff_websocket(&mut self, backend: &str) -> Result<(), SendErrorCause>
pub fn handoff_websocket(&mut self, backend: &str) -> Result<(), SendErrorCause>
Pass the WebSocket directly to a backend.
This can only be used on services that have the WebSockets feature enabled and on requests that are valid WebSocket requests.
The sending completes in the background. Once this method has been called, no other response can be sent to this request, and the application can exit without affecting the send.
Sourcepub fn handoff_fanout(&mut self, backend: &str) -> Result<(), SendErrorCause>
pub fn handoff_fanout(&mut self, backend: &str) -> Result<(), SendErrorCause>
Pass the request through the Fanout GRIP proxy and on to a backend.
This can only be used on services that have the Fanout feature enabled.
The sending completes in the background. Once this method has been called, no other response can be sent to this request, and the application can exit without affecting the send.
Sourcepub fn fastly_key_is_valid(&self) -> bool
pub fn fastly_key_is_valid(&self) -> bool
Returns whether or not a valid Fastly-Key for this service was received.
Sourcepub fn client_ip_addr(&self) -> Option<IpAddr>
pub fn client_ip_addr(&self) -> Option<IpAddr>
Returns the IP address of the client making the HTTP request.
Sourcepub fn server_ip_addr(&self) -> Option<IpAddr>
pub fn server_ip_addr(&self) -> Option<IpAddr>
Returns the IP address on which this server received the HTTP request.
Sourcepub fn client_ddos_detected(&self) -> Option<bool>
pub fn client_ddos_detected(&self) -> Option<bool>
Returns whether the request was tagged as contributing to a DDoS attack
Sourcepub fn client_tls_client_hello(&self) -> Option<Bytes>
pub fn client_tls_client_hello(&self) -> Option<Bytes>
Get the raw bytes sent by the client in the TLS ClientHello message.
See RFC 5246 for details.
Sourcepub fn client_tls_client_servername(&self) -> Option<String>
pub fn client_tls_client_servername(&self) -> Option<String>
Get the hostname sent by the client in the TLS ServerName Indication.
See RFC 6066 for details.
Sourcepub fn client_tls_ja3_md5(&self) -> Option<[u8; 16]>
pub fn client_tls_ja3_md5(&self) -> Option<[u8; 16]>
Get the JA3 hash of the TLS ClientHello message.
Sourcepub fn client_tls_ja4(&self) -> Option<String>
pub fn client_tls_ja4(&self) -> Option<String>
Get the JA4 hash of the TLS ClientHello message.
Sourcepub fn client_tls_client_raw_certificate(&self) -> Option<String>
pub fn client_tls_client_raw_certificate(&self) -> Option<String>
Get the client certificate used to secure the downstream client mTLS connection, as a string, panicking if it is not UTF-8.
The value returned will be based on PEM format.
Sourcepub fn client_tls_client_raw_certificate_bytes(&self) -> Option<Bytes>
pub fn client_tls_client_raw_certificate_bytes(&self) -> Option<Bytes>
Like Self::client_tls_client_raw_certificate, but supports non-UTF-8 byte sequences.
Sourcepub fn client_tls_client_cert_verify_result(
&self,
) -> Option<ClientCertVerifyResult>
pub fn client_tls_client_cert_verify_result( &self, ) -> Option<ClientCertVerifyResult>
Returns the ClientCertVerifyResult from the downstream client mTLS handshake.
Returns None if not available.
Sourcepub fn client_tls_cipher_openssl_name(&self) -> Option<String>
pub fn client_tls_cipher_openssl_name(&self) -> Option<String>
Get the cipher suite used to secure the downstream client TLS connection, as a string, panicking if it is not UTF-8.
The value returned will be consistent with the OpenSSL name for the cipher suite.
§Examples
let handle = RequestHandle::from_client();
assert_eq!(
handle.client_tls_cipher_openssl_name().unwrap(),
"ECDHE-RSA-AES128-GCM-SHA256"
);Sourcepub fn client_tls_cipher_openssl_name_bytes(&self) -> Option<Bytes>
pub fn client_tls_cipher_openssl_name_bytes(&self) -> Option<Bytes>
Like Self::client_tls_cipher_openssl_name, but supports non-UTF-8 byte string.
Sourcepub fn client_original_header_names(
&self,
buf_size: usize,
) -> impl Iterator<Item = Result<String, BufferSizeError>>
pub fn client_original_header_names( &self, buf_size: usize, ) -> impl Iterator<Item = Result<String, BufferSizeError>>
Returns the client request’s header names exactly as they were originally received.
This includes both the original header name characters’ cases, as well as the original order of the received headers.
If there is a header name that is longer than the provided buffer, this will return a
BufferSizeError; you can retry with a larger buffer size if necessary.
Sourcepub fn client_original_header_count(&self) -> Result<Option<u32>, FastlyStatus>
pub fn client_original_header_count(&self) -> Result<Option<u32>, FastlyStatus>
Returns the number of headers in the client request as originally received.
If this is not a valid downstream handle then this will return None.
Sourcepub fn client_tls_protocol(&self) -> Result<Option<String>, FromUtf8Error>
pub fn client_tls_protocol(&self) -> Result<Option<String>, FromUtf8Error>
Get the TLS protocol version used to secure the downstream client TLS connection, as a string, panicking if it is not UTF-8.
§Examples
let handle = RequestHandle::from_client();
assert_eq!(handle.client_tls_protocol().unwrap().as_deref(), Some("TLSv1.2"));Sourcepub fn client_tls_protocol_bytes(&self) -> Option<Bytes>
pub fn client_tls_protocol_bytes(&self) -> Option<Bytes>
Like Self::client_tls_protocol, but supports non-UTF-8 byte sequences.
Sourcepub fn bot_analyzed(&self) -> bool
pub fn bot_analyzed(&self) -> bool
Whether bot detection analysis was performed for this request.
Sourcepub fn bot_detected(&self) -> bool
pub fn bot_detected(&self) -> bool
Whether a bot was detected in the request.
Sourcepub fn bot_name_bytes(&self) -> Option<Bytes>
pub fn bot_name_bytes(&self) -> Option<Bytes>
A byte string identifying the specific bot detected (e.g., GoogleBot, GPTBot, Bingbot).
Returns None if bot detection was not executed or no bot was detected.
Warning: Values may change over time. Use this for logging or informational purposes.
For conditional logic, use the bot_category_kind() value.
Sourcepub fn bot_category_bytes(&self) -> Option<Bytes>
pub fn bot_category_bytes(&self) -> Option<Bytes>
A byte string indicating the type of bot detected (e.g., SEARCH-ENGINE-CRAWLER, AI-CRAWLER, SUSPECTED-BOT).
Returns None if bot detection was not executed.
Warning: Values may change over time. Use this for logging or informational purposes.
For conditional logic, use the bot_category_kind() value.
Sourcepub fn bot_category_kind(&self) -> Option<u32>
pub fn bot_category_kind(&self) -> Option<u32>
A value uniquely identifying the type of bot detected.
Returns None if bot detection was not executed.
Sourcepub fn bot_verified(&self) -> Option<bool>
pub fn bot_verified(&self) -> Option<bool>
Whether the detected bot is a verified bot.
Returns None if bot detection was not executed or no bot was detected.
Trait Implementations§
Source§impl Debug for RequestHandle
impl Debug for RequestHandle
Source§impl Drop for RequestHandle
impl Drop for RequestHandle
impl Eq for RequestHandle
Source§impl From<RequestHandle> for Request
impl From<RequestHandle> for Request
Source§fn from(handle: RequestHandle) -> Self
fn from(handle: RequestHandle) -> Self
Source§impl Hash for RequestHandle
impl Hash for RequestHandle
Source§impl PartialEq for RequestHandle
impl PartialEq for RequestHandle
Source§impl RequestHandleUpgradeWebsocket for RequestHandle
impl RequestHandleUpgradeWebsocket for RequestHandle
Source§fn handoff_websocket(&mut self, backend: &str) -> Result<(), SendErrorCause>
👎Deprecated since 0.10.0: The RequestHandleUpgradeWebsocket::handoff_websocket() trait method is now part of RequestHandle.
fn handoff_websocket(&mut self, backend: &str) -> Result<(), SendErrorCause>
The RequestHandleUpgradeWebsocket::handoff_websocket() trait method is now part of RequestHandle.
Pass the WebSocket directly to a backend.
This can only be used on services that have the WebSockets feature enabled and on requests that are valid WebSocket requests.
The sending completes in the background. Once this method has been called, no other response can be sent to this request, and the application can exit without affecting the send.
Source§fn handoff_fanout(&mut self, backend: &str) -> Result<(), SendErrorCause>
👎Deprecated since 0.10.0: The RequestHandleUpgradeWebsocket::handoff_fanout() trait method is now part of RequestHandle.
fn handoff_fanout(&mut self, backend: &str) -> Result<(), SendErrorCause>
The RequestHandleUpgradeWebsocket::handoff_fanout() trait method is now part of RequestHandle.
Pass the request through the Fanout GRIP proxy and on to a backend.
This can only be used on services that have the Fanout feature enabled.
The sending completes in the background. Once this method has been called, no other response can be sent to this request, and the application can exit without affecting the send.
impl StructuralPartialEq for RequestHandle
Auto Trait Implementations§
impl Freeze for RequestHandle
impl RefUnwindSafe for RequestHandle
impl Send for RequestHandle
impl Sync for RequestHandle
impl Unpin for RequestHandle
impl UnsafeUnpin for RequestHandle
impl UnwindSafe for RequestHandle
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> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more