The wasi:http/proxy world captures a widely-implementable intersection of
hosts that includes HTTP forward and reverse proxies. Components targeting
this world may concurrently stream in and out any number of incoming and
outgoing HTTP requests.
- Imports:
- interface
wasi:io/poll@0.2.8 - interface
wasi:clocks/monotonic-clock@0.2.8 - interface
wasi:clocks/wall-clock@0.2.8 - interface
wasi:random/random@0.2.8 - interface
wasi:io/error@0.2.8 - interface
wasi:io/streams@0.2.8 - interface
wasi:cli/stdout@0.2.8 - interface
wasi:cli/stderr@0.2.8 - interface
wasi:cli/stdin@0.2.8 - interface
wasi:http/types@0.2.8 - interface
wasi:http/outgoing-handler@0.2.8
- interface
- Exports:
- interface
wasi:http/incoming-handler@0.2.8
- interface
A poll API intended to let users wait for I/O events on multiple handles at once.
pollable represents a single I/O event which may be ready, or not.
Return the readiness of a pollable. This function never blocks.
Returns true when the pollable is ready, and false otherwise.
self: borrow<pollable>
block returns immediately if the pollable is ready, and otherwise
blocks until ready.
This function is equivalent to calling poll.poll on a list
containing only this pollable.
self: borrow<pollable>
Poll for completion on a set of pollables.
This function takes a list of pollables, which identify I/O sources of interest, and waits until one or more of the events is ready for I/O.
The result list<u32> contains one or more indices of handles in the
argument list that is ready for I/O.
This function traps if either:
- the list is empty, or:
- the list contains more elements than can be indexed with a
u32value.
A timeout can be implemented by adding a pollable from the wasi-clocks API to the list.
This function does not return a result; polling in itself does not
do any I/O so it doesn't fail. If any of the I/O sources identified by
the pollables has an error, it is indicated by marking the source as
being ready for I/O.
in: list<borrow<pollable>>
WASI Monotonic Clock is a clock API intended to let users measure elapsed time.
It is intended to be portable at least between Unix-family platforms and Windows.
A monotonic clock is a clock which has an unspecified initial value, and successive reads of the clock will produce non-decreasing values.
An instant in time, in nanoseconds. An instant is relative to an unspecified initial value, and can only be compared to instances from the same monotonic-clock.
u64
A duration of time, in nanoseconds.
Read the current value of the clock.
The clock is monotonic, therefore calling this function repeatedly will produce a sequence of non-decreasing values.
For completeness, this function traps if it's not possible to represent
the value of the clock in an instant. Consequently, implementations
should ensure that the starting time is low enough to avoid the
possibility of overflow in practice.
Query the resolution of the clock. Returns the duration of time corresponding to a clock tick.
Create a pollable which will resolve once the specified instant
has occurred.
when:instant
- own<
pollable>
Create a pollable that will resolve after the specified duration has
elapsed from the time this function is invoked.
when:duration
- own<
pollable>
WASI Wall Clock is a clock API intended to let users query the current time. The name "wall" makes an analogy to a "clock on the wall", which is not necessarily monotonic as it may be reset.
It is intended to be portable at least between Unix-family platforms and Windows.
A wall clock is a clock which measures the date and time according to some external reference.
External references may be reset, so this clock is not necessarily monotonic, making it unsuitable for measuring elapsed time.
It is intended for reporting the current date and time for humans.
A time and date in seconds plus nanoseconds.
Read the current value of the clock.
This clock is not monotonic, therefore calling this function repeatedly will not necessarily produce a sequence of non-decreasing values.
The returned timestamps represent the number of seconds since 1970-01-01T00:00:00Z, also known as POSIX's Seconds Since the Epoch, also known as Unix Time.
The nanoseconds field of the output is always less than 1000000000.
Query the resolution of the clock.
The nanoseconds field of the output is always less than 1000000000.
WASI Random is a random data API.
It is intended to be portable at least between Unix-family platforms and Windows.
Return len cryptographically-secure random or pseudo-random bytes.
This function must produce data at least as cryptographically secure and fast as an adequately seeded cryptographically-secure pseudo-random number generator (CSPRNG). It must not block, from the perspective of the calling program, under any circumstances, including on the first request and on requests for numbers of bytes. The returned data must always be unpredictable.
This function must always return fresh data. Deterministic environments must omit this function, rather than implementing it with deterministic data.
Return a cryptographically-secure random or pseudo-random u64 value.
This function returns the same type of data as get-random-bytes,
represented as a u64.
A resource which represents some error information.
The only method provided by this resource is to-debug-string,
which provides some human-readable information about the error.
In the wasi:io package, this resource is returned through the
wasi:io/streams/stream-error type.
To provide more specific error information, other interfaces may
offer functions to "downcast" this error into more specific types. For example,
errors returned from streams derived from filesystem types can be described using
the filesystem's own error-code type. This is done using the function
wasi:filesystem/types/filesystem-error-code, which takes a borrow<error>
parameter and returns an option<wasi:filesystem/types/error-code>.
The set of functions which can "downcast" an error into a more
concrete type is open.
Returns a string that is suitable to assist humans in debugging this error.
WARNING: The returned string should not be consumed mechanically! It may change across platforms, hosts, or other implementation details. Parsing this string is a major platform-compatibility hazard.
self: borrow<error>
WASI I/O is an I/O abstraction API which is currently focused on providing stream types.
In the future, the component model is expected to add built-in stream types; when it does, they are expected to subsume this API.
#### `type pollable` [`pollable`](#pollable)
An error for input-stream and output-stream operations.
-
last-operation-failed: own<error>The last operation (a write or flush) failed before completion.
More information is available in the
errorpayload.After this, the stream will be closed. All future operations return
stream-error::closed. -
The stream is closed: no more input will be accepted by the stream. A closed output-stream will return this error on all future operations.
An input bytestream.
input-streams are non-blocking to the extent practical on underlying
platforms. I/O operations always return promptly; if fewer bytes are
promptly available than requested, they return the number of bytes promptly
available, which could even be zero. To wait for data to be available,
use the subscribe function to obtain a pollable which can be polled
for using wasi:io/poll.
An output bytestream.
output-streams are non-blocking to the extent practical on
underlying platforms. Except where specified otherwise, I/O operations also
always return promptly, after the number of bytes that can be written
promptly, which could even be zero. To wait for the stream to be ready to
accept data, the subscribe function to obtain a pollable which can be
polled for using wasi:io/poll.
Dropping an output-stream while there's still an active write in
progress may result in the data being lost. Before dropping the stream,
be sure to fully flush your writes.
Perform a non-blocking read from the stream.
When the source of a read is binary data, the bytes from the source
are returned verbatim. When the source of a read is known to the
implementation to be text, bytes containing the UTF-8 encoding of the
text are returned.
This function returns a list of bytes containing the read data,
when successful. The returned list will contain up to len bytes;
it may return fewer than requested, but not more. The list is
empty when no bytes are available for reading at this time. The
pollable given by subscribe will be ready when more bytes are
available.
This function fails with a stream-error when the operation
encounters an error, giving last-operation-failed, or when the
stream is closed, giving closed.
When the caller gives a len of 0, it represents a request to
read 0 bytes. If the stream is still open, this call should
succeed and return an empty list, or otherwise fail with closed.
The len parameter is a u64, which could represent a list of u8 which
is not possible to allocate in wasm32, or not desirable to allocate as
as a return value by the callee. The callee may return a list of bytes
less than len in size while more bytes are available for reading.
self: borrow<input-stream>len:u64
- result<list<
u8>,stream-error>
Read bytes from a stream, after blocking until at least one byte can
be read. Except for blocking, behavior is identical to read.
self: borrow<input-stream>len:u64
- result<list<
u8>,stream-error>
Skip bytes from a stream. Returns number of bytes skipped.
Behaves identical to read, except instead of returning a list
of bytes, returns the number of bytes consumed from the stream.
self: borrow<input-stream>len:u64
- result<
u64,stream-error>
Skip bytes from a stream, after blocking until at least one byte
can be skipped. Except for blocking behavior, identical to skip.
self: borrow<input-stream>len:u64
- result<
u64,stream-error>
Create a pollable which will resolve once either the specified stream
has bytes available to read or the other end of the stream has been
closed.
The created pollable is a child resource of the input-stream.
Implementations may trap if the input-stream is dropped before
all derived pollables created with this function are dropped.
self: borrow<input-stream>
- own<
pollable>
Check readiness for writing. This function never blocks.
Returns the number of bytes permitted for the next call to write,
or an error. Calling write with more bytes than this function has
permitted will trap.
When this function returns 0 bytes, the subscribe pollable will
become ready when this function will report at least 1 byte, or an
error.
self: borrow<output-stream>
- result<
u64,stream-error>
Perform a write. This function never blocks.
When the destination of a write is binary data, the bytes from
contents are written verbatim. When the destination of a write is
known to the implementation to be text, the bytes of contents are
transcoded from UTF-8 into the encoding of the destination and then
written.
Precondition: check-write gave permit of Ok(n) and contents has a length of less than or equal to n. Otherwise, this function will trap.
returns Err(closed) without writing if the stream has closed since the last call to check-write provided a permit.
self: borrow<output-stream>contents: list<u8>
- result<_,
stream-error>
Perform a write of up to 4096 bytes, and then flush the stream. Block until all of these operations are complete, or an error occurs.
Returns success when all of the contents written are successfully flushed to output. If an error occurs at any point before all contents are successfully flushed, that error is returned as soon as possible. If writing and flushing the complete contents causes the stream to become closed, this call should return success, and subsequent calls to check-write or other interfaces should return stream-error::closed.
self: borrow<output-stream>contents: list<u8>
- result<_,
stream-error>
Request to flush buffered output. This function never blocks.
This tells the output-stream that the caller intends any buffered
output to be flushed. the output which is expected to be flushed
is all that has been passed to write prior to this call.
Upon calling this function, the output-stream will not accept any
writes (check-write will return ok(0)) until the flush has
completed. The subscribe pollable will become ready when the
flush has completed and the stream can accept more writes.
self: borrow<output-stream>
- result<_,
stream-error>
Request to flush buffered output, and block until flush completes and stream is ready for writing again.
self: borrow<output-stream>
- result<_,
stream-error>
Create a pollable which will resolve once the output-stream
is ready for more writing, or an error has occurred. When this
pollable is ready, check-write will return ok(n) with n>0, or an
error.
If the stream is closed, this pollable is always ready immediately.
The created pollable is a child resource of the output-stream.
Implementations may trap if the output-stream is dropped before
all derived pollables created with this function are dropped.
self: borrow<output-stream>
- own<
pollable>
Write zeroes to a stream.
This should be used precisely like write with the exact same
preconditions (must use check-write first), but instead of
passing a list of bytes, you simply pass the number of zero-bytes
that should be written.
self: borrow<output-stream>len:u64
- result<_,
stream-error>
Perform a write of up to 4096 zeroes, and then flush the stream. Block until all of these operations are complete, or an error occurs.
Functionality is equivelant to blocking-write-and-flush with
contents given as a list of len containing only zeroes.
self: borrow<output-stream>len:u64
- result<_,
stream-error>
Read from one stream and write to another.
The behavior of splice is equivalent to:
- calling
check-writeon theoutput-stream - calling
readon theinput-streamwith the smaller of thecheck-writepermitted length and thelenprovided tosplice - calling
writeon theoutput-streamwith that read data.
Any error reported by the call to check-write, read, or
write ends the splice and reports that error.
This function returns the number of bytes transferred; it may be less
than len.
self: borrow<output-stream>src: borrow<input-stream>len:u64
- result<
u64,stream-error>
Read from one stream and write to another, with blocking.
This is similar to splice, except that it blocks until the
output-stream is ready for writing, and the input-stream
is ready for reading, before performing the splice.
self: borrow<output-stream>src: borrow<input-stream>len:u64
- result<
u64,stream-error>
----
- own<
output-stream>
----
- own<
output-stream>
----
- own<
input-stream>
This interface defines all of the types and methods for implementing HTTP Requests and Responses, both incoming and outgoing, as well as their headers, trailers, and bodies.
#### `type input-stream` [`input-stream`](#input_stream)
#### `type output-stream` [`output-stream`](#output_stream)
#### `type io-error` [`error`](#error)
#### `type pollable` [`pollable`](#pollable)
This type corresponds to HTTP standard Methods.
This type corresponds to HTTP standard Related Schemes.
Defines the case payload type for DNS-error above:
Defines the case payload type for TLS-alert-received above:
Defines the case payload type for HTTP-response-{header,trailer}-size above:
field-name: option<string>field-size: option<u32>
These cases are inspired by the IANA HTTP Proxy Error Types: https://www.iana.org/assignments/http-proxy-status/http-proxy-status.xhtml#table-http-proxy-error-types
DNS-timeoutDNS-error:DNS-error-payloaddestination-not-founddestination-unavailabledestination-IP-prohibiteddestination-IP-unroutableconnection-refusedconnection-terminatedconnection-timeoutconnection-read-timeoutconnection-write-timeoutconnection-limit-reachedTLS-protocol-errorTLS-certificate-errorTLS-alert-received:TLS-alert-received-payloadHTTP-request-deniedHTTP-request-length-requiredHTTP-request-body-size: option<u64>HTTP-request-method-invalidHTTP-request-URI-invalidHTTP-request-URI-too-longHTTP-request-header-section-size: option<u32>HTTP-request-header-size: option<field-size-payload>HTTP-request-trailer-section-size: option<u32>HTTP-request-trailer-size:field-size-payloadHTTP-response-incompleteHTTP-response-header-section-size: option<u32>HTTP-response-header-size:field-size-payloadHTTP-response-body-size: option<u64>HTTP-response-trailer-section-size: option<u32>HTTP-response-trailer-size:field-size-payloadHTTP-response-transfer-coding: option<string>HTTP-response-content-coding: option<string>HTTP-response-timeoutHTTP-upgrade-failedHTTP-protocol-errorloop-detectedconfiguration-errorinternal-error: option<string>This is a catch-all error for anything that doesn't fit cleanly into a more specific case. It also includes an optional string for an unstructured description of the error. Users should not depend on the string for diagnosing errors, as it's not required to be consistent between implementations.
This type enumerates the different kinds of errors that may occur when
setting or appending to a fields resource.
-
This error indicates that a `field-name` or `field-value` was syntactically invalid when used with an operation that sets headers in a `fields`.
-
This error indicates that a forbidden `field-name` was used when trying to set a header in a `fields`.
-
This error indicates that the operation on the `fields` was not permitted because the fields are immutable.
string
Field keys are always strings.
Field keys should always be treated as case insensitive by the fields
resource for the purposes of equality checking.
This type has been deprecated in favor of the field-name type.
Field names are always strings.
Field names should always be treated as case insensitive by the fields
resource for the purposes of equality checking.
Field values should always be ASCII strings. However, in reality, HTTP implementations often have to interpret malformed values, so they are provided as a list of bytes.
This following block defines the fields resource which corresponds to
HTTP standard Fields. Fields are a common representation used for both
Headers and Trailers.
A fields may be mutable or immutable. A fields created using the
constructor, from-list, or clone will be mutable, but a fields
resource given by other means (including, but not limited to,
incoming-request.headers, outgoing-request.headers) might be
immutable. In an immutable fields, the set, append, and delete
operations will fail with header-error.immutable.
Headers is an alias for Fields.
Trailers is an alias for Fields.
Represents an incoming HTTP Request.
Represents an outgoing HTTP Request.
Parameters for making an HTTP Request. Each of these parameters is currently an optional timeout applicable to the transport layer of the HTTP protocol.
These timeouts are separate from any the user may use to bound a
blocking call to wasi:io/poll.poll.
Represents the ability to send an HTTP Response.
This resource is used by the wasi:http/incoming-handler interface to
allow a Response to be sent corresponding to the Request provided as the
other argument to incoming-handler.handle.
u16
This type corresponds to the HTTP standard Status Code.
Represents an incoming HTTP Response.
Represents an incoming HTTP Request or Response's Body.
A body has both its contents - a stream of bytes - and a (possibly
empty) set of trailers, indicating that the full contents of the
body have been received. This resource represents the contents as
an input-stream and the delivery of trailers as a future-trailers,
and ensures that the user of this interface may only be consuming either
the body contents or waiting on trailers at any given time.
Represents a future which may eventually return trailers, or an error.
In the case that the incoming HTTP Request or Response did not have any trailers, this future will resolve to the empty set of trailers once the complete Request or Response body has been received.
Represents an outgoing HTTP Response.
Represents an outgoing HTTP Request or Response's Body.
A body has both its contents - a stream of bytes - and a (possibly
empty) set of trailers, inducating the full contents of the body
have been sent. This resource represents the contents as an
output-stream child resource, and the completion of the body (with
optional trailers) with a static function that consumes the
outgoing-body resource, and ensures that the user of this interface
may not write to the body contents after the body has been finished.
If the user code drops this resource, as opposed to calling the static
method finish, the implementation should treat the body as incomplete,
and that an error has occurred. The implementation should propagate this
error to the HTTP protocol by whatever means it has available,
including: corrupting the body on the wire, aborting the associated
Request, or sending a late status code for the Response.
Represents a future which may eventually return an incoming HTTP Response, or an error.
This resource is returned by the wasi:http/outgoing-handler interface to
provide the HTTP Response corresponding to the sent Request.
Attempts to extract a http-related error from the wasi:io error
provided.
Stream operations which return
wasi:io/stream.stream-error.last-operation-failed have a payload of
type wasi:io/error.error with more information about the operation
that failed. This payload can be passed through to this function to see
if there's http-related information about the error to return.
Note that this function is fallible because not all io-errors are http-related errors.
err: borrow<io-error>
- option<
error-code>
Construct an empty HTTP Fields.
The resulting fields is mutable.
- own<
fields>
Construct an HTTP Fields.
The resulting fields is mutable.
The list represents each name-value pair in the Fields. Names which have multiple values are represented by multiple entries in this list with the same name.
The tuple is a pair of the field name, represented as a string, and Value, represented as a list of bytes.
An error result will be returned if any field-name or field-value is
syntactically invalid, or if a field is forbidden.
entries: list<(field-name,field-value)>
- result<own<
fields>,header-error>
Get all of the values corresponding to a name. If the name is not present
in this fields or is syntactically invalid, an empty list is returned.
However, if the name is present but empty, this is represented by a list
with one or more empty field-values present.
self: borrow<fields>name:field-name
- list<
field-value>
Returns true when the name is present in this fields. If the name is
syntactically invalid, false is returned.
self: borrow<fields>name:field-name
Set all of the values for a name. Clears any existing values for that name, if they have been set.
Fails with header-error.immutable if the fields are immutable.
Fails with header-error.invalid-syntax if the field-name or any of
the field-values are syntactically invalid.
self: borrow<fields>name:field-namevalue: list<field-value>
- result<_,
header-error>
Delete all values for a name. Does nothing if no values for the name exist.
Fails with header-error.immutable if the fields are immutable.
Fails with header-error.invalid-syntax if the field-name is
syntactically invalid.
self: borrow<fields>name:field-name
- result<_,
header-error>
Append a value for a name. Does not change or delete any existing values for that name.
Fails with header-error.immutable if the fields are immutable.
Fails with header-error.invalid-syntax if the field-name or
field-value are syntactically invalid.
self: borrow<fields>name:field-namevalue:field-value
- result<_,
header-error>
Retrieve the full set of names and values in the Fields. Like the constructor, the list represents each name-value pair.
The outer list represents each name-value pair in the Fields. Names which have multiple values are represented by multiple entries in this list with the same name.
The names and values are always returned in the original casing and in the order in which they will be serialized for transport.
self: borrow<fields>
- list<(
field-name,field-value)>
Make a deep copy of the Fields. Equivalent in behavior to calling the
fields constructor on the return value of entries. The resulting
fields is mutable.
self: borrow<fields>
- own<
fields>
Returns the method of the incoming request.
self: borrow<incoming-request>
Returns the path with query parameters from the request, as a string.
self: borrow<incoming-request>
Returns the protocol scheme from the request.
self: borrow<incoming-request>
- option<
scheme>
Returns the authority of the Request's target URI, if present.
self: borrow<incoming-request>
Get the headers associated with the request.
The returned headers resource is immutable: set, append, and
delete operations will fail with header-error.immutable.
The headers returned are a child resource: it must be dropped before
the parent incoming-request is dropped. Dropping this
incoming-request before all children are dropped will trap.
self: borrow<incoming-request>
- own<
headers>
Gives the incoming-body associated with this request. Will only
return success at most once, and subsequent calls will return error.
self: borrow<incoming-request>
- result<own<
incoming-body>>
Construct a new outgoing-request with a default method of GET, and
none values for path-with-query, scheme, and authority.
headersis the HTTP Headers for the Request.
It is possible to construct, or manipulate with the accessor functions
below, an outgoing-request with an invalid combination of scheme
and authority, or headers which are not permitted to be sent.
It is the obligation of the outgoing-handler.handle implementation
to reject invalid constructions of outgoing-request.
- own<
outgoing-request>
Returns the resource corresponding to the outgoing Body for this Request.
Returns success on the first call: the outgoing-body resource for
this outgoing-request can be retrieved at most once. Subsequent
calls will return error.
self: borrow<outgoing-request>
- result<own<
outgoing-body>>
Get the Method for the Request.
self: borrow<outgoing-request>
Set the Method for the Request. Fails if the string present in a
method.other argument is not a syntactically valid method.
self: borrow<outgoing-request>method:method
Get the combination of the HTTP Path and Query for the Request.
When none, this represents an empty Path and empty Query.
self: borrow<outgoing-request>
Set the combination of the HTTP Path and Query for the Request.
When none, this represents an empty Path and empty Query. Fails is the
string given is not a syntactically valid path and query uri component.
self: borrow<outgoing-request>path-with-query: option<string>
Get the HTTP Related Scheme for the Request. When none, the
implementation may choose an appropriate default scheme.
self: borrow<outgoing-request>
- option<
scheme>
Set the HTTP Related Scheme for the Request. When none, the
implementation may choose an appropriate default scheme. Fails if the
string given is not a syntactically valid uri scheme.
self: borrow<outgoing-request>scheme: option<scheme>
Get the authority of the Request's target URI. A value of none may be used
with Related Schemes which do not require an authority. The HTTP and
HTTPS schemes always require an authority.
self: borrow<outgoing-request>
Set the authority of the Request's target URI. A value of none may be used
with Related Schemes which do not require an authority. The HTTP and
HTTPS schemes always require an authority. Fails if the string given is
not a syntactically valid URI authority.
self: borrow<outgoing-request>authority: option<string>
Get the headers associated with the Request.
The returned headers resource is immutable: set, append, and
delete operations will fail with header-error.immutable.
This headers resource is a child: it must be dropped before the parent
outgoing-request is dropped, or its ownership is transferred to
another component by e.g. outgoing-handler.handle.
self: borrow<outgoing-request>
- own<
headers>
Construct a default request-options value.
- own<
request-options>
The timeout for the initial connect to the HTTP Server.
self: borrow<request-options>
- option<
duration>
Set the timeout for the initial connect to the HTTP Server. An error return value indicates that this timeout is not supported.
self: borrow<request-options>duration: option<duration>
The timeout for receiving the first byte of the Response body.
self: borrow<request-options>
- option<
duration>
Set the timeout for receiving the first byte of the Response body. An error return value indicates that this timeout is not supported.
self: borrow<request-options>duration: option<duration>
The timeout for receiving subsequent chunks of bytes in the Response body stream.
self: borrow<request-options>
- option<
duration>
Set the timeout for receiving subsequent chunks of bytes in the Response body stream. An error return value indicates that this timeout is not supported.
self: borrow<request-options>duration: option<duration>
Send an HTTP 1xx response.
Unlike response-outparam.set, this does not consume the
response-outparam, allowing the guest to send an arbitrary number of
informational responses before sending the final response using
response-outparam.set.
This will return an HTTP-protocol-error if status is not in the
range [100-199], or an internal-error if the implementation does not
support informational responses.
self: borrow<response-outparam>status:u16headers: own<headers>
- result<_,
error-code>
Set the value of the response-outparam to either send a response,
or indicate an error.
This method consumes the response-outparam to ensure that it is
called at most once. If it is never called, the implementation
will respond with an error.
The user may provide an error to response to allow the
implementation determine how to respond with an HTTP error response.
param: own<response-outparam>response: result<own<outgoing-response>,error-code>
Returns the status code from the incoming response.
self: borrow<incoming-response>
Returns the headers from the incoming response.
The returned headers resource is immutable: set, append, and
delete operations will fail with header-error.immutable.
This headers resource is a child: it must be dropped before the parent
incoming-response is dropped.
self: borrow<incoming-response>
- own<
headers>
Returns the incoming body. May be called at most once. Returns error if called additional times.
self: borrow<incoming-response>
- result<own<
incoming-body>>
Returns the contents of the body, as a stream of bytes.
Returns success on first call: the stream representing the contents can be retrieved at most once. Subsequent calls will return error.
The returned input-stream resource is a child: it must be dropped
before the parent incoming-body is dropped, or consumed by
incoming-body.finish.
This invariant ensures that the implementation can determine whether
the user is consuming the contents of the body, waiting on the
future-trailers to be ready, or neither. This allows for network
backpressure is to be applied when the user is consuming the body,
and for that backpressure to not inhibit delivery of the trailers if
the user does not read the entire body.
self: borrow<incoming-body>
- result<own<
input-stream>>
Takes ownership of incoming-body, and returns a future-trailers.
This function will trap if the input-stream child is still alive.
this: own<incoming-body>
- own<
future-trailers>
Returns a pollable which becomes ready when either the trailers have
been received, or an error has occurred. When this pollable is ready,
the get method will return some.
self: borrow<future-trailers>
- own<
pollable>
Returns the contents of the trailers, or an error which occurred, once the future is ready.
The outer option represents future readiness. Users can wait on this
option to become some using the subscribe method.
The outer result is used to retrieve the trailers or error at most
once. It will be success on the first call in which the outer option
is some, and error on subsequent calls.
The inner result represents that either the HTTP Request or Response
body, as well as any trailers, were received successfully, or that an
error occurred receiving them. The optional trailers indicates whether
or not trailers were present in the body.
When some trailers are returned by this method, the trailers
resource is immutable, and a child. Use of the set, append, or
delete methods will return an error, and the resource must be
dropped before the parent future-trailers is dropped.
self: borrow<future-trailers>
- option<result<result<option<own<
trailers>>,error-code>>>
Construct an outgoing-response, with a default status-code of 200.
If a different status-code is needed, it must be set via the
set-status-code method.
headersis the HTTP Headers for the Response.
- own<
outgoing-response>
Get the HTTP Status Code for the Response.
self: borrow<outgoing-response>
Set the HTTP Status Code for the Response. Fails if the status-code given is not a valid http status code.
self: borrow<outgoing-response>status-code:status-code
Get the headers associated with the Request.
The returned headers resource is immutable: set, append, and
delete operations will fail with header-error.immutable.
This headers resource is a child: it must be dropped before the parent
outgoing-request is dropped, or its ownership is transferred to
another component by e.g. outgoing-handler.handle.
self: borrow<outgoing-response>
- own<
headers>
Returns the resource corresponding to the outgoing Body for this Response.
Returns success on the first call: the outgoing-body resource for
this outgoing-response can be retrieved at most once. Subsequent
calls will return error.
self: borrow<outgoing-response>
- result<own<
outgoing-body>>
Returns a stream for writing the body contents.
The returned output-stream is a child resource: it must be dropped
before the parent outgoing-body resource is dropped (or finished),
otherwise the outgoing-body drop or finish will trap.
Returns success on the first call: the output-stream resource for
this outgoing-body may be retrieved at most once. Subsequent calls
will return error.
self: borrow<outgoing-body>
- result<own<
output-stream>>
Finalize an outgoing body, optionally providing trailers. This must be
called to signal that the response is complete. If the outgoing-body
is dropped without calling outgoing-body.finalize, the implementation
should treat the body as corrupted.
Fails if the body's outgoing-request or outgoing-response was
constructed with a Content-Length header, and the contents written
to the body (via write) does not match the value given in the
Content-Length.
this: own<outgoing-body>trailers: option<own<trailers>>
- result<_,
error-code>
Returns a pollable which becomes ready when either the Response has
been received, or an error has occurred. When this pollable is ready,
the get method will return some.
self: borrow<future-incoming-response>
- own<
pollable>
Returns the incoming HTTP Response, or an error, once one is ready.
The outer option represents future readiness. Users can wait on this
option to become some using the subscribe method.
The outer result is used to retrieve the response or error at most
once. It will be success on the first call in which the outer option
is some, and error on subsequent calls.
The inner result represents that either the incoming HTTP Response
status and headers have received successfully, or that an error
occurred. Errors may also occur while consuming the response body,
but those will be reported by the incoming-body and its
output-stream child.
self: borrow<future-incoming-response>
- option<result<result<own<
incoming-response>,error-code>>>
This interface defines a handler of outgoing HTTP Requests. It should be imported by components which wish to make HTTP Requests.
#### `type request-options` [`request-options`](#request_options)
#### `type future-incoming-response` [`future-incoming-response`](#future_incoming_response)
#### `type error-code` [`error-code`](#error_code)
----
This function is invoked with an outgoing HTTP Request, and it returns
a resource future-incoming-response which represents an HTTP Response
which may arrive in the future.
The options argument accepts optional parameters for the HTTP
protocol's transport layer.
This function may return an error if the outgoing-request is invalid
or not allowed to be made. Otherwise, protocol errors are reported
through the future-incoming-response.
request: own<outgoing-request>options: option<own<request-options>>
- result<own<
future-incoming-response>,error-code>
#### `type response-outparam` [`response-outparam`](#response_outparam)
----
This function is invoked with an incoming HTTP Request, and a resource
response-outparam which provides the capability to reply with an HTTP
Response. The response is sent by calling the response-outparam.set
method, which allows execution to continue after the response has been
sent. This enables both streaming to the response body, and performing other
work.
The implementor of this function must write a response to the
response-outparam before returning, or else the caller will respond
with an error on its behalf.
request: own<incoming-request>response-out: own<response-outparam>