RequestHandle
pub struct RequestHandle { /* private fields */ }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().
Constants
An invalid handle.
This is primarily useful to represent uninitialized values when using the interfaces in
fastly_sys.
Methods
append_header
View sourceAdd a request header with given value.
Unlike insert_header(), this does not discard existing values
for the same header name.
Parameters
- self: &mut Self
- name: &HeaderName
- value: &HeaderValue
as_u32
View sourcefn as_u32(&self) -> u32Get 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.
Parameters
- self: &Self
Returns
as_u32_mut
View sourcefn as_u32_mut(&mut self) -> &mut u32Get 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.
Parameters
- self: &mut Self
Returns
bot_analyzed
View sourcefn bot_analyzed(&self) -> boolWhether bot detection analysis was performed for this request.
Parameters
- self: &Self
Returns
bot_category_bytes
View sourceA 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.
Parameters
- self: &Self
Returns
bot_category_kind
View sourceA value uniquely identifying the type of bot detected.
Returns None if bot detection was not executed.
Parameters
- self: &Self
Returns
bot_detected
View sourcefn bot_detected(&self) -> boolWhether a bot was detected in the request.
Parameters
- self: &Self
Returns
bot_name_bytes
View sourceA 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.
Parameters
- self: &Self
Returns
bot_verified
View sourceWhether the detected bot is a verified bot.
Returns None if bot detection was not executed or no bot was detected.
Parameters
- self: &Self
Returns
client_ddos_detected
View sourceReturns whether the request was tagged as contributing to a DDoS attack
Parameters
- self: &Self
Returns
client_ip_addr
View sourceReturns the IP address of the client making the HTTP request.
Parameters
- self: &Self
Returns
client_original_header_count
View sourceReturns the number of headers in the client request as originally received.
If this is not a valid downstream handle then this will return None.
Parameters
- self: &Self
Returns
client_original_header_names
View sourcefn 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.
Parameters
- self: &Self
- buf_size: usize
Returns
client_tls_cipher_openssl_name
View sourceGet 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");Parameters
- self: &Self
Returns
client_tls_cipher_openssl_name_bytes
View sourceLike Self::client_tls_cipher_openssl_name, but supports non-UTF-8 byte string.
Parameters
- self: &Self
Returns
client_tls_client_cert_verify_result
View sourceReturns the ClientCertVerifyResult from the downstream client mTLS handshake.
Returns None if not available.
Parameters
- self: &Self
Returns
client_tls_client_hello
View sourceGet the raw bytes sent by the client in the TLS ClientHello message.
See RFC 5246 for details.
Parameters
- self: &Self
Returns
client_tls_client_raw_certificate
View sourceGet 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.
Parameters
- self: &Self
Returns
client_tls_client_raw_certificate_bytes
View sourceLike Self::client_tls_client_raw_certificate, but supports non-UTF-8 byte sequences.
Parameters
- self: &Self
Returns
client_tls_client_servername
View sourceGet the hostname sent by the client in the TLS ServerName Indication.
See RFC 6066 for details.
Parameters
- self: &Self
Returns
client_tls_ja3_md5
View sourceGet the JA3 hash of the TLS ClientHello message.
Parameters
- self: &Self
Returns
client_tls_ja4
View sourceGet the JA4 hash of the TLS ClientHello message.
Parameters
- self: &Self
Returns
client_tls_protocol
View sourceGet 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"));Parameters
- self: &Self
Returns
client_tls_protocol_bytes
View sourceLike Self::client_tls_protocol, but supports non-UTF-8 byte sequences.
Parameters
- self: &Self
Returns
close
View sourceClose the RequestHandle by removing it from the host Session. If the handle has already
been closed an error will be returned. When calling
send/sendasync/sendasync_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// troublerequest.close()?;Parameters
- self: Self
Returns
fastly_key_is_valid
View sourcefn fastly_key_is_valid(&self) -> boolReturns whether or not a valid Fastly-Key for this service was received.
Parameters
- self: &Self
Returns
from_client
View sourcefn from_client() -> SelfGet 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().
Returns
from_u32
View sourceunsafe fn from_u32(handle: u32) -> SelfTurn 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.
Parameters
- handle: u32
Returns
get_header_names
View sourcefn 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.
Parameters
- self: &Self
- buf_size: usize
Returns
get_header_value
View sourcefn 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.
Parameters
- self: &Self
- name: &HeaderName
- max_len: usize
Returns
get_header_values
View sourcefn get_header_values<'a>(&'a self, name: &'a HeaderName, buf_size: usize) -> impl Iterator<Item = Result<HeaderValue, BufferSizeError>> + 'aGet 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():
12345678910111213141516let 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() });Parameters
- self: &Self
- name: &HeaderName
- buf_size: usize
Returns
get_method
View sourceGet 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.
Parameters
- self: &Self
- max_length: usize
Returns
get_url
View sourceGet 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.
Parameters
- self: &Self
- max_length: usize
Returns
get_version
View sourcefn get_version(&self) -> VersionGet the HTTP version of this request.
Parameters
- self: &Self
Returns
handoff_fanout
View sourcePass 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.
Parameters
- self: &mut Self
- backend: &str
Returns
handoff_websocket
View sourcePass 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.
Parameters
- self: &mut Self
- backend: &str
Returns
insert_header
View sourceSet a request header to the given value, discarding any previous values for the given header name.
Parameters
- self: &mut Self
- name: &HeaderName
- value: &HeaderValue
into_u32
View sourcefn into_u32(self) -> u32Turn 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.
Parameters
- self: Self
Returns
is_invalid
View sourceconst fn is_invalid(&self) -> boolReturns true if the request handle is invalid.
Parameters
- self: &Self
Returns
is_valid
View sourceconst fn is_valid(&self) -> boolReturns true if the request handle is valid.
Parameters
- self: &Self
Returns
new
View sourcefn new() -> SelfAcquire a new request handle.
By default, the request will have a GET method, a URL of /, and empty headers.
Returns
on_behalf_of
View sourcePerform 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.
Parameters
- self: &mut Self
- service: &str
Returns
remove_header
View sourceRemove all request headers of the given name, and return whether any headers were removed.
Parameters
- self: &mut Self
- name: &HeaderName
Returns
send
View sourcefn 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.
Parameters
- self: Self
- body: BodyHandle
- backend: &str
Returns
send_async
View sourcefn 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.
Parameters
- self: Self
- body: BodyHandle
- backend: &str
Returns
send_async_streaming
View sourcefn 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.
Parameters
- self: Self
- body: BodyHandle
- backend: &str
Returns
send_async_streaming_to_backend
View sourcefn 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.
Parameters
- self: Self
- body: BodyHandle
- backend: &Backend
Returns
send_async_to_backend
View sourcefn 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.
Parameters
- self: Self
- body: BodyHandle
- backend: &Backend
Returns
send_to_backend
View sourcefn 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.
Parameters
- self: Self
- body: BodyHandle
- backend: &Backend
Returns
server_ip_addr
View sourceReturns the IP address on which this server received the HTTP request.
Parameters
- self: &Self
Returns
set_auto_decompress_response
View sourceSet 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.
Parameters
- self: &mut Self
- content_encodings: ContentEncodings
set_cache_override
View sourceSet the cache override behavior for this request.
This setting will override any cache directive headers returned in response to this request. Note that staleiferror is not overridden by this mechanism.
Parameters
- self: &mut Self
- cache_override: &CacheOverride
set_framing_headers_mode
View sourceSets the way that framing headers are determined for this request.
Parameters
- self: &mut Self
- mode: FramingHeadersMode
set_header_values
View sourcewhere I: IntoIterator<Item = &'a HeaderValue>,Set the values for the given header name, replacing any headers that previously existed for that name.
Parameters
- self: &mut Self
- name: &HeaderName
- values: I
Trait implementations
impl Debug for RequestHandle
impl Drop for RequestHandle
impl Hash for RequestHandle
impl PartialEq for RequestHandle
impl RequestHandleCacheKey for RequestHandle
set_cache_key
View sourceSet the cache key to be used when attempting to satisfy this request from a cached response.
Stability
This is part of an experimental API that is subject to change or removal even in minor versions of this crate.
Parameters
- self: &mut Self
- key: impl AsRef<[u8]>
impl RequestHandleUpgradeWebsocket for RequestHandle
handoff_fanout
View sourcePass 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.
Parameters
- self: &mut Self
- backend: &str
Returns
handoff_websocket
View sourcePass 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.
Parameters
- self: &mut Self
- backend: &str
Returns