On Mon, Dec 7, 2015 at 2:54 PM, Stefan Eissing <[email protected]
> wrote:
> ok, after some more thinking. if a tls+http/1.1 upgrade together with
> Expect is indeed a use case, then, to make that work, sending the 101 needs
> to become the task of the switch protocol handler itself. Then the order in
> which intermediate responses are sent depends on the switched protocol.
>
> When writing the current code, I wanted the common tasks in core. But if
> that needs to vary, we need to shift that.
>
100-continue should be simple enough to implement; we can even defer
the 101-switching protocols until we determine that the chunked request
body "fits in memory". Roughly...
1. in the core protocol implementation, we determine that the provider
is willing, so far, based on a request body of known C-L body size
or of indeterminate length (no bytes read, chunked encoding)
2. we invoking a speculative connection filter read at the http protocol
to network layer - that http input filter sends the 100-continue where
it aught to be. That speculative read sets aside bytes read for later
consumption based on the buffer it is willing to offer. The body has
been read complete from the network or is still in an incomplete
chunk (or would block waiting for the next chunk).
3. back in the core protocol implementation, if the http input filter still
must read from the network beyond it's small buffer, no upgrade is
realistically possible, then we fall out before processing the protocol
switch and proceed as http/1.1.
4. alternately, if the input filter read completely, the core protocol
implementation now sends the 101-switching protocols and lets
the protocol implementation determine whether it injects the
appropriate filters and resumes (e.g. tls), assumes authority
over the core request handling and protocol (e.g. h2c), or jumps
the shark entirely (e.g. echo) and has nothing more to do with
the request.