NAME

Unblock::HTTP3::Transaction - one HTTP/3 request and response

SYNOPSIS

my $tx = $h3->request($request);

my $request  = $tx->request;
my $response = $tx->response;

if ($tx->is_terminal) {
    ...
}

DESCRIPTION

A Transaction represents one HTTP/3 request stream.

It keeps the Request, final Response, streaming body objects, informational responses, Datagram state, priority, and lifecycle state together. Applications normally do not need to match responses with raw QUIC stream IDs.

METHODS

stream_id

Returns the HTTP/3 request stream ID.

request

Returns the Uniform::HTTP::Request associated with this Transaction.

response

Returns the final Uniform::HTTP::Response when one is available.

On a server, the Transaction receives a mutable Response when the request is created.

local_reset_code

Returns the RESET_STREAM application error code explicitly requested by the local HTTP/3 layer for this request stream, or undef when none was requested.

A peer STOP_SENDING can cause QUIC itself to send the required RESET_STREAM. That transport-generated response is not reported here. The peer request is reported by "remote_stop_sending_code".

remote_reset_code

Returns the RESET_STREAM application error code received from the peer for this request stream, or undef when none has been received.

local_stop_sending_code

Returns the STOP_SENDING application error code sent locally for this request stream, or undef when none has been sent.

remote_stop_sending_code

Returns the STOP_SENDING application error code received from the peer for this request stream, or undef when none has been received.

is_aborted

True when any local or remote RESET_STREAM or STOP_SENDING code has been recorded for the Transaction.

These are HTTP/3 transport diagnostics. They are intentionally kept on the Transaction instead of the canonical Uniform Request or Response objects.

protocol

Returns the Extended CONNECT protocol identifier, or undef for an ordinary request or basic CONNECT tunnel.

is_extended_connect

True when the request is Extended CONNECT.

early_data

True when this Transaction's request was carried in QUIC 0-RTT.

0-RTT can be replayed and must be treated accordingly by the application.

priority

my $priority = $tx->priority;

$tx->priority(
    urgency     => 0,
    incremental => 1,
);

Gets or changes the live RFC 9218 priority.

Urgency is 0 through 7, where 0 is most urgent. Incremental is 0 or 1.

On a client, changing priority sends PRIORITY_UPDATE. On a server, it changes the local response scheduling priority.

request_body

Returns the request body stream object when the Transaction is configured for streaming.

On a client this is a writable Unblock::HTTP3::Body::Stream.

On a server this is a readable Unblock::HTTP3::Body::Reader.

response_body

Returns the response body stream object when the Transaction is configured for streaming.

On a server this is a writable Unblock::HTTP3::Body::Stream.

On a client this is a readable Unblock::HTTP3::Body::Reader.

send_response

Server only. Sends the final buffered or bodyless Response.

For a streaming response body, use response_body instead.

send_informational

$tx->send_informational(
    Uniform::HTTP::Response->new(
        status => 103,
    ),
);

Server only. Sends a 1xx response before the final Response. Status 101 is not used by HTTP/3.

next_informational

Client only. Returns the next received informational Response, or undef.

is_response_started

True after final response headers have started sending.

capsules

my $capsules = $tx->capsules;

Creates or returns a Unblock::HTTP3::Capsule::Stream for an Extended CONNECT Transaction.

The higher-level protocol is responsible for deciding whether Capsule Protocol use has been negotiated.

datagrams_enabled

True when this Transaction has HTTP Datagram semantics.

send_datagram

my $accepted = $tx->send_datagram($bytes);

Sends one RFC 9297 HTTP Datagram.

A false return means the unreliable payload was not accepted for transmission. The caller decides whether to retry or drop it.

next_datagram

Returns the next queued HTTP Datagram payload, or undef.

on_datagram

$tx->on_datagram(sub {
    my ($tx, $bytes) = @_;
    ...
});

Installs or replaces the receive callback. Passing undef removes it.

Queued Datagrams are drained to a newly installed callback.

max_datagram_payload_size

Returns the current maximum HTTP Datagram payload size for this Transaction. Returns zero when a Datagram cannot currently be sent.

cancel

Cancels the request stream with H3_REQUEST_CANCELLED. Returns the Transaction.

state

Returns one of:

active
complete
cancelled
error

error

Returns the Transaction error text when state is error.

is_complete

True when state is complete.

is_cancelled

True when state is cancelled.

is_terminal

True when the Transaction is complete, cancelled, or in error.

SEE ALSO

Unblock::HTTP3::Connection, Uniform::HTTP::Request, Uniform::HTTP::Response, Unblock::HTTP3::Body::Stream, Unblock::HTTP3::Body::Reader, Unblock::HTTP3::Capsule::Stream

AUTHOR

Joshua S. Day

LICENSE

This software is available under the MIT License.