@@ -230,77 +230,36 @@ interface types {
230
230
/// Trailers is an alias for Fields.
231
231
type trailers = fields ;
232
232
233
- /// Represents an HTTP Request or Response's Body.
234
- ///
235
- /// A body has both its contents - a stream of bytes - and a (possibly empty)
236
- /// set of trailers, indicating that the full contents of the body have been
237
- /// received. This resource represents the contents as a `stream<u8>` and the
238
- /// delivery of trailers as a `trailers` , and ensures that the user of this
239
- /// interface may only be consuming either the body contents or waiting on
240
- /// trailers at any given time.
241
- resource body {
242
-
243
- /// Construct a new `body` with the specified stream.
244
- ///
245
- /// This function returns a future, which will resolve
246
- /// to an error code if transmitting stream data fails.
247
- ///
248
- /// The returned future resolves to success once body stream
249
- /// is fully transmitted.
250
- new : static func (
251
- %stream : stream <u8 >,
252
- ) -> tuple <body , future <result <_ , error-code >>>;
253
-
254
- /// Construct a new `body` with the specified stream and trailers.
255
- ///
256
- /// This function returns a future, which will resolve
257
- /// to an error code if transmitting stream data or trailers fails.
258
- ///
259
- /// The returned future resolves to success once body stream and trailers
260
- /// are fully transmitted.
261
- new-with-trailers : static func (
262
- %stream : stream <u8 >,
263
- trailers : future<trailers>
264
- ) -> tuple<body, future<result<_, error-code>>>;
265
-
266
- /// Returns the contents of the body, as a stream of bytes.
267
- ///
268
- /// This function may be called multiple times as long as any `stream` s
269
- /// returned by previous calls have been dropped first.
270
- ///
271
- /// On success, this function returns a stream and a future, which will resolve
272
- /// to an error code if receiving data from stream fails.
273
- /// The returned future resolves to success if body is closed.
274
- %stream : func () -> result <tuple <stream <u8 >, future <result <_ , error-code >>>>;
275
-
276
- /// Takes ownership of `body` , and returns an unresolved optional `trailers` result.
277
- ///
278
- /// This function will trap if a `stream` child is still alive.
279
- finish : static func (this : body ) -> future<result <option <trailers >, error-code >>;
280
- }
281
-
282
233
/// Represents an HTTP Request.
283
234
resource request {
284
235
285
236
/// Construct a new `request` with a default `method` of `GET` , and
286
237
/// `none` values for `path-with-query` , `scheme` , and `authority` .
287
238
///
288
- /// * `headers` is the HTTP Headers for the Response.
289
- /// * `body` is the optional contents of the body, possibly including
290
- /// trailers.
291
- /// * `options` is optional `request-options` to be used if the request is
292
- /// sent over a network connection.
239
+ /// `headers` is the HTTP Headers for the Request.
240
+ ///
241
+ /// `contents` is the optional body content stream with `none`
242
+ /// representing a zero-length content stream.
243
+ /// Once it is closed, `trailers` future must resolve to a result.
244
+ /// If `trailers` resolves to an error, underlying connection
245
+ /// will be closed immediately.
246
+ ///
247
+ /// `options` is optional `request-options` resource to be used
248
+ /// if the request is sent over a network connection.
293
249
///
294
250
/// It is possible to construct, or manipulate with the accessor functions
295
- /// below, an `request` with an invalid combination of `scheme`
251
+ /// below, a `request` with an invalid combination of `scheme`
296
252
/// and `authority` , or `headers` which are not permitted to be sent.
297
253
/// It is the obligation of the `handler.handle` implementation
298
254
/// to reject invalid constructions of `request` .
299
- constructor (
255
+ ///
256
+ /// The returned future resolves to result of transmission of this request.
257
+ new : static func (
300
258
headers : headers ,
301
- body : option <body >,
259
+ contents : option <stream <u8 >>,
260
+ trailers : future <result <option <trailers >, error-code >>,
302
261
options : option <request-options >
303
- );
262
+ ) -> tuple < request , future < result < _ , error-code >>> ;
304
263
305
264
/// Get the Method for the Request.
306
265
method : func () -> method ;
@@ -348,22 +307,28 @@ interface types {
348
307
///
349
308
/// The returned `headers` resource is immutable: `set` , `append` , and
350
309
/// `delete` operations will fail with `header-error.immutable` .
351
- ///
352
- /// This headers resource is a child: it must be dropped before the parent
353
- /// `request` is dropped, or its ownership is transferred to another
354
- /// component by e.g. `handler.handle` .
355
310
headers : func () -> headers ;
356
311
357
- /// Get the body associated with the Request, if any .
312
+ /// Get body of the Request.
358
313
///
359
- /// This body resource is a child: it must be dropped before the parent
360
- /// `request` is dropped, or its ownership is transferred to another
361
- /// component by e.g. `handler.handle` .
362
- body : func () -> option <body >;
363
-
364
- /// Takes ownership of the `request` and returns the `headers` , `body`
365
- /// and `request-options` , if any.
366
- into-parts : static func (this : request ) -> tuple <headers , option <body >, option <request-options >>;
314
+ /// Stream returned by this method represents the contents of the body.
315
+ /// Once the stream is reported as closed, callers should await the returned future
316
+ /// to determine whether the body was received successfully.
317
+ /// The future will only resolve after the stream is reported as closed.
318
+ ///
319
+ /// The stream and future returned by this method are children:
320
+ /// they should be closed or consumed before the parent `response`
321
+ /// is dropped, or its ownership is transferred to another component
322
+ /// by e.g. `handler.handle` .
323
+ ///
324
+ /// This method may be called multiple times.
325
+ ///
326
+ /// This method will return an error if it is called while either:
327
+ /// - a stream or future returned by a previous call to this method is still open
328
+ /// - a stream returned by a previous call to this method has reported itself as closed
329
+ /// Thus there will always be at most one readable stream open for a given body.
330
+ /// Each subsequent stream picks up where the last stream left off, up until it is finished.
331
+ body : func () -> result <tuple <stream <u8 >, future <result <option <trailers >, error-code >>>>;
367
332
}
368
333
369
334
/// Parameters for making an HTTP Request. Each of these parameters is
@@ -400,6 +365,10 @@ interface types {
400
365
/// body stream. An error return value indicates that this timeout is not
401
366
/// supported or that this handle is immutable.
402
367
set-between-bytes-timeout : func (duration : option <duration >) -> result <_ , request-options-error >;
368
+
369
+ /// Make a deep copy of the `request-options` .
370
+ /// The resulting `request-options` is mutable.
371
+ clone : func () -> request-options ;
403
372
}
404
373
405
374
/// This type corresponds to the HTTP standard Status Code.
@@ -408,17 +377,24 @@ interface types {
408
377
/// Represents an HTTP Response.
409
378
resource response {
410
379
411
- /// Construct an `response` , with a default `status-code` of `200` . If a
412
- /// different `status-code` is needed, it must be set via the
380
+ /// Construct a new `response` , with a default `status-code` of `200` .
381
+ /// If a different `status-code` is needed, it must be set via the
413
382
/// `set-status-code` method.
414
383
///
415
- /// * `headers` is the HTTP Headers for the Response.
416
- /// * `body` is the optional contents of the body, possibly including
417
- /// trailers.
418
- constructor (
384
+ /// `headers` is the HTTP Headers for the Response.
385
+ ///
386
+ /// `contents` is the optional body content stream with `none`
387
+ /// representing a zero-length content stream.
388
+ /// Once it is closed, `trailers` future must resolve to a result.
389
+ /// If `trailers` resolves to an error, underlying connection
390
+ /// will be closed immediately.
391
+ ///
392
+ /// The returned future resolves to result of transmission of this response.
393
+ new : static func (
419
394
headers : headers ,
420
- body : option <body >,
421
- );
395
+ contents : option <stream <u8 >>,
396
+ trailers : future <result <option <trailers >, error-code >>,
397
+ ) -> tuple <response , future <result <_ , error-code >>>;
422
398
423
399
/// Get the HTTP Status Code for the Response.
424
400
status-code : func () -> status-code ;
@@ -427,25 +403,31 @@ interface types {
427
403
/// given is not a valid http status code.
428
404
set-status-code : func (status-code : status-code ) -> result ;
429
405
430
- /// Get the headers associated with the Request .
406
+ /// Get the headers associated with the Response .
431
407
///
432
408
/// The returned `headers` resource is immutable: `set` , `append` , and
433
409
/// `delete` operations will fail with `header-error.immutable` .
434
- ///
435
- /// This headers resource is a child: it must be dropped before the parent
436
- /// `response` is dropped, or its ownership is transferred to another
437
- /// component by e.g. `handler.handle` .
438
410
headers : func () -> headers ;
439
411
440
- /// Get the body associated with the Response, if any .
412
+ /// Get body of the Response.
441
413
///
442
- /// This body resource is a child: it must be dropped before the parent
443
- /// `response` is dropped, or its ownership is transferred to another
444
- /// component by e.g. `handler.handle` .
445
- body : func () -> option <body >;
446
-
447
- /// Takes ownership of the `response` and returns the `headers` and `body` ,
448
- /// if any.
449
- into-parts : static func (this : response ) -> tuple <headers , option <body >>;
414
+ /// Stream returned by this method represents the contents of the body.
415
+ /// Once the stream is reported as closed, callers should await the returned future
416
+ /// to determine whether the body was received successfully.
417
+ /// The future will only resolve after the stream is reported as closed.
418
+ ///
419
+ /// The stream and future returned by this method are children:
420
+ /// they should be closed or consumed before the parent `response`
421
+ /// is dropped, or its ownership is transferred to another component
422
+ /// by e.g. `handler.handle` .
423
+ ///
424
+ /// This method may be called multiple times.
425
+ ///
426
+ /// This method will return an error if it is called while either:
427
+ /// - a stream or future returned by a previous call to this method is still open
428
+ /// - a stream returned by a previous call to this method has reported itself as closed
429
+ /// Thus there will always be at most one readable stream open for a given body.
430
+ /// Each subsequent stream picks up where the last stream left off, up until it is finished.
431
+ body : func () -> result <tuple <stream <u8 >, future <result <option <trailers >, error-code >>>>;
450
432
}
451
433
}
0 commit comments