On Thu, May 21, 2020 at 11:54 PM Rowan Tommins <rowan.coll...@gmail.com>
wrote:

> Hi all,
>
> A few years ago, I posted a message suggesting that PHP improve support
> for HTTP/1.1 in its stream wrapper functions:
> https://externals.io/message/96192
>
> A quick summary of the current situation:
>
> * HTTP/1.1 was officially standardised in January 1997, and most web
> browsers had already implemented it by then
> * PHP has a very simple HTTP client implementation, used by the "http:"
> and "https:" stream wrappers, and also by extensions which make HTTP
> requests, such as ext/soap
> * The client implementation defaults to advertising HTTP/1.0 requests,
> unless over-ridden by a stream context option
> * Since a lot of servers only actually talk HTTP/1.1, the client mostly
> acts as an HTTP/1.1 client even when advertising HTTP/1.0
>
>
> In my previous message, I identified four requirements in HTTP/1.1 but
> not HTTP/1.0 that are relevant to a client:
>
> a) Send a "Host" header with every request. (RFC 7230 Section 5.4)
> b) Support persistent connections, or send "Connection: Close" with each
> request. (RFC 7230 Section 6.1)
> c) Ignore 1xx status lines (notably, "100 Continue") "even if the client
> does not expect one" (RFC 7231 Section 6.2)
> d) Support "chunked" transfer encoding (RFC 7230 Section 4.1)
>
>
> The PHP client now supports all four regardless of protocol version
> configured, i.e. it always sends "Host:" and "Connection: Close"
> headers; and always handles "100 Continue" and "Transfer-Encoding:
> Chunked" if returned by the server.
>
> I would like to propose that the client advertises HTTP/1.1 in its
> requests by default in PHP 8.0.  Users can opt out of this behaviour in
> a fully backwards- and forwards-compatible way if necessary using a
> stream context option, e.g.:
> https://gist.github.com/IMSoP/a685fed6589435530102d57138755511
>
>
> What are people's opinions? Does this need an RFC, or should I just
> submit a PR if nobody objects?
>

Sounds good to me. Assuming there are no objections, feel free to just send
a PR.

@Eliot: Unfortunately we don't implement HTTP 2 in the http:// stream
wrapper, so HTTP 1.1 is the best we can do there right now. We only provide
HTTP 2 support through the curl extension. Implementing HTTP 2 support
would certainly be a possibility, but I don't think it's particularly easy
to do so without pulling in a dependency like nghttp2.

@Max: I'm only guessing here, because I'm not familiar with the historical
context, but I imagine part of the motivation is to support HTTP requests
in a minimal build of PHP, which does not have any dependencies (that we do
not bundle ourselves).

We did actually provide an implementation of the http:// stream wrapper via
curl for a long time, but dropped it at some point, because there were many
subtle behavior differences to our native implementation.

Regards,
Nikita

Reply via email to