Den 2016-10-02 kl. 23:12, skrev Rowan Collins:

Hi internallers!

No, you haven't misread the subject line, I'm not talking about the exciting new HTTP/2, but HTTP/1.1, 20 years old this year.

To my surprise, PHP's HTTP stream wrapper (e.g. file_get_contents('http://example.com');) defaults to sending HTTP/1.0 requests. You can tell it to use HTTP/1.1 with an appropriate "stream context", but it's fiddly [1], and the implementation is incomplete.

There's actually already an exception to this: some SOAP servers were discovered to only talk HTTP/1.1, so ext/soap forces the wrapper to upgrade by default [bug-43069]. This in turn revealed some of the bugs in the wrapper's protocol support, one of which I have recently created a patch for [bug-47021].

It's reasonable to suppose that 9 years on from that bug those SOAP servers aren't alone in rejecting (or mishandling) HTTP/1.0 requests, and moves to implement HTTP/2.0 will only make that more likely.

I think it would be good to get this support into a better state, make it easier to switch on - e.g. with an INI setting, or some new stream URL syntax - and possibly make HTTP/1.1 the default in PHP 8.0.


As I understand it, supporting HTTP/1.1 as a client requires the following mandatory features on top of HTTP/1.0:

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)

Let me know if there are any I've missed.

I believe this is the current state of the PHP implementation:

a) Host header always sent regardless of protocol version.
b) The SOAP wrapper explicitly generates a "Connection: Close" header as well as forcing HTTP/1.1; users need to set it as a further option in stream_context_create(). It would be better if this was implicit with the protocol version. c) I can't find a bug report for this, but 100 Continue appears to be treated as an error status. This should be fixed. d) Chunked encoding itself was implemented, but the code for parsing headers was broken. If my PR [pr-1902] is approved, this will hopefully work correctly.


What do people think? Would this be a worthwhile effort?

[1]: Sample HTTP/1.1 context https://gist.github.com/IMSoP/8c62c97afc8765f418468b28a501409e
[bug-43069]: https://bugs.php.net/bug.php?id=43069
[bug-47021]: https://bugs.php.net/bug.php?id=47021
[pr-1902]: https://github.com/php/php-src/pull/1902

Regards,

Yup, personally I do find this a worthwhile effort! Would fixing
this behaviour also be applicable for HTTPS?

Regards //Björn Larsson

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to