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