1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
//! Experimental, unstable and incomplete implementation of wasip3 version of `wasi:http`.
//!
//! This module is under heavy development.
//! It is not compliant with semver and is not ready
//! for production use.
//!
//! Bug and security fixes limited to wasip3 will not be given patch releases.
//!
//! Documentation of this module may be incorrect or out-of-sync with the implementation.
pub use Request;
pub use Response;
/// The default value configured for [`WasiHttpHooks::p3_outgoing_body_chunk_size`].
///
/// [`WasiHttpHooks::p3_outgoing_body_chunk_size`]: crate::WasiHttpHooks::p3_outgoing_body_chunk_size
pub const DEFAULT_OUTGOING_BODY_CHUNK_SIZE: usize = 1024 * 1024;
use crate::;
use ;
use Deref;
use Arc;
use ;
use ;
pub type HttpResult<T> = ;
pub type HttpError = ;
pub type HeaderResult<T> = ;
pub type HeaderError = ;
pub type RequestOptionsResult<T> = ;
pub type RequestOptionsError = ;
/// Add all interfaces from this module into the `linker` provided.
///
/// This function will add all interfaces implemented by this module to the
/// [`Linker`], which corresponds to the `wasi:http/imports` world supported by
/// this module.
///
/// # Example
///
/// ```
/// use wasmtime::{Engine, Result, Store, Config};
/// use wasmtime::component::{Linker, ResourceTable};
/// use wasmtime_wasi_http::{WasiHttpCtx, WasiHttpCtxView, WasiHttpView};
///
/// fn main() -> Result<()> {
/// let mut config = Config::new();
/// config.wasm_component_model_async(true);
/// let engine = Engine::new(&config)?;
///
/// let mut linker = Linker::<MyState>::new(&engine);
/// wasmtime_wasi_http::p3::add_to_linker(&mut linker)?;
/// // ... add any further functionality to `linker` if desired ...
///
/// let mut store = Store::new(
/// &engine,
/// MyState::default(),
/// );
///
/// // ... use `linker` to instantiate within `store` ...
///
/// Ok(())
/// }
///
/// #[derive(Default)]
/// struct MyState {
/// http: WasiHttpCtx,
/// table: ResourceTable,
/// }
///
/// impl WasiHttpView for MyState {
/// fn http(&mut self) -> WasiHttpCtxView<'_> {
/// WasiHttpCtxView {
/// ctx: &mut self.http,
/// table: &mut self.table,
/// hooks: Default::default(),
/// }
/// }
/// }
/// ```
/// Interfaces that are added via [`add_named_to_linker`].
/// Add all interfaces from this module into the `linker` provided for any
/// named imports that a component has.
///
/// This function is similar to [`add_to_linker`] except that it's specifically
/// designed to work with named imports of `wasi:http` interfaces that
/// components may have. This requires a [`Component`] parameter to be passed in
/// when populating the [`Linker`] provided to see what the [`Component`]
/// actually imports.
///
/// If this isn't low level enough you can invoke the bindgen-generated
/// `add_to_linker` functions within the [`named_imports`] module directly
/// instead.
///
/// [`named_imports`]: crate::p3::bindings::named_imports
///
/// The `lookup` function provided here is invoked for every named import found
/// for a particular interface. The [`Interface`] given is what's being bound,
/// and the `&str` argument is the name that the component imports it as. The
/// embedder can then decide how it would like to allocate a [`NamedId`] for
/// this import. If `Ok` is returned then the linker is populated with this
/// name, and imported functions will pass the [`NamedId`] later to the
/// implementation of [`WasiHttpNamedView`] on `T` when invoked. If `Err` is
/// returned then the error will cause this entire function to fail and this
/// function call will return the same error.
///
/// # Example
///
/// ```
/// use std::collections::HashMap;
/// use wasmtime::component::{Component, Linker, ResourceTable};
/// use wasmtime::{Engine, Result, Store, Config};
/// use wasmtime_wasi::NamedId;
/// use wasmtime_wasi_http::{WasiHttpCtx, WasiHttpCtxView, WasiHttpNamedView};
///
/// fn main() -> Result<()> {
/// let mut config = Config::new();
/// config.wasm_component_model_async(true);
/// let engine = Engine::new(&config)?;
/// let component = Component::new(&engine, "(component)")?;
///
/// let mut linker = Linker::<MyState>::new(&engine);
///
/// // ... add default functionality to `linker` as needed ...
///
/// // and then additionally fill in any specific named imports `component`
/// // might have for `wasi:http` interfaces.
/// let mut name_map = HashMap::new();
/// wasmtime_wasi_http::p3::add_named_to_linker(&mut linker, &component, |_i, name| {
/// let len = name_map.len();
/// Ok(NamedId(*name_map.entry(name.to_string()).or_insert(len)))
/// })?;
///
/// // Here a `WasiHttpCtx` is allocated per-named-import and will then be
/// // referred to internally by the [`NamedId`] allocated above. You could
/// // also use `name_map` to configure each context differently.
/// let mut my_state = MyState::default();
/// for _ in 0..name_map.len() {
/// my_state.contexts.push(WasiHttpCtx::default());
/// }
/// let mut store = Store::new(&engine, my_state);
///
/// // ... use `linker` to instantiate within `store` ...
///
/// Ok(())
/// }
///
/// #[derive(Default)]
/// struct MyState {
/// table: ResourceTable,
/// contexts: Vec<WasiHttpCtx>,
/// }
///
/// impl WasiHttpNamedView for MyState {
/// fn http(&mut self, id: NamedId) -> WasiHttpCtxView<'_> {
/// WasiHttpCtxView {
/// ctx: &mut self.contexts[id.0],
/// table: &mut self.table,
/// hooks: Default::default(),
/// }
/// }
/// }
/// ```
/// An [Arc], which may be immutable.
///
/// In `wasi:http` resources like `fields` or `request-options` may be
/// mutable or immutable. This construct is used to model them efficiently.