1interface http-client {
2 /// An HTTP request.
3 record http-request {
4 /// The HTTP method for the request.
5 method: http-method,
6 /// The URL to which the request should be made.
7 url: string,
8 /// The headers for the request.
9 headers: list<tuple<string, string>>,
10 /// The request body.
11 body: option<list<u8>>,
12 /// The policy to use for redirects.
13 redirect-policy: redirect-policy,
14 }
15
16 /// HTTP methods.
17 enum http-method {
18 /// `GET`
19 get,
20 /// `HEAD`
21 head,
22 /// `POST`
23 post,
24 /// `PUT`
25 put,
26 /// `DELETE`
27 delete,
28 /// `OPTIONS`
29 options,
30 /// `PATCH`
31 patch,
32 }
33
34 /// The policy for dealing with redirects received from the server.
35 variant redirect-policy {
36 /// Redirects from the server will not be followed.
37 ///
38 /// This is the default behavior.
39 no-follow,
40 /// Redirects from the server will be followed up to the specified limit.
41 follow-limit(u32),
42 /// All redirects from the server will be followed.
43 follow-all,
44 }
45
46 /// An HTTP response.
47 record http-response {
48 /// The response headers.
49 headers: list<tuple<string, string>>,
50 /// The response body.
51 body: list<u8>,
52 }
53
54 /// Performs an HTTP request and returns the response.
55 fetch: func(req: http-request) -> result<http-response, string>;
56
57 /// An HTTP response stream.
58 resource http-response-stream {
59 /// Retrieves the next chunk of data from the response stream.
60 ///
61 /// Returns `Ok(None)` if the stream has ended.
62 next-chunk: func() -> result<option<list<u8>>, string>;
63 }
64
65 /// Performs an HTTP request and returns a response stream.
66 fetch-stream: func(req: http-request) -> result<http-response-stream, string>;
67}