Boost logo

Boost :

Subject: Re: [boost] [Beast] HTTP/1.0 Protocol compatibility
From: Vinnie Falco (vinnie.falco_at_[hidden])
Date: 2017-07-03 19:06:03


On Mon, Jul 3, 2017 at 11:47 AM, Artyom Beilis via Boost
<boost_at_[hidden]> wrote:
> I can't find there an (sami)automatic way to manage HTTP/1.0 vs
> HTTP/1.1 compatibility?

Some of it is automatic but the keep-alive is not.

> Example I have a client that supports HTTP/1.0 only and I need to
> transfer an unknown amount of data. Now as one who writes the server I
> need to check the clients protocol and choose chucked transfer
> encoding with possibility to keep connection keep alive or close one
> after data transfer using socket shutdown.

HTTP/1.0 doesn't support the chunked transfer encoding, but this
scenario is handled by Beast. The behavior depends on the Body type
you are using with the stream operation, and the
message::prepare_payload function. Here is a breakdown:

* If the Body knows the payload size, A call to
message::prepare_payload will set Content-Length and clear chunked
Transfer-Encoding if present

* If the Body does not know the payload size, and the version is
HTTP/1.1 then message::prepare_payload will set chunked
Transfer-Encoding, and clear Content-Length if set.

* If the Body does not know the payload size, and the version is
HTTP/1.0 then message::prepare_payload will clear chunked
Transfer-Encoding if set, and clear Content-Length if set.

During a serialization stream operation (i.e. write, async_write):

* If the message is version HTTP/1.1 and the Connection field includes
the "close" token, when the stream write operation is complete the
error http::stream_closed will be delivered. This indicates to the
caller that the connection should be closed

* If the message is version HTTP/1.0 and the Connection field does not
include the "keep-alive" token, when the stream write operation is
complete the error http::stream_closed will be delivered. This
indicates to the caller that the connection should be closed

* If the message is version HTTP/1.0 and the Content-Length field is
not set, then when the stream write operation is complete the error
http::stream_closed will be delivered. This indicates to the caller
that the connection should be closed.

> Shouldn't this kind of stuff should be handled automatically or
> sami-automatically?

Beast could probably do a tiny bit more, for example I should probably
add these signatures to http::message

    bool keep_alive() const;
    void keep_alive(bool should_keep_alive) const;

There are 1 or 2 other small quality-of-life members I will add to
message, they have not been written yet.

> Also note I tested some of your examples and found that they
> responding with HTTP/1.1 on HTTP/1.0 requests.

I didn't want to bloat the example with boring code to handle the
differences but after some discussion on the Slack I realize that the
examples need to be great, because most users are going to just copy
and paste them. This is something that I will certainly address.
Probably when I find myself repeating code in the example I will be
motivated to improve message's public interfaces to make it easier.

By the way I very much appreciate your analysis!

Thanks


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk