HTTP server: Persistent connection on HTTP/1.0 hangs, when using streaming response body

Open
#552 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
76/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Quiet
Tech stack
php
Domain
api, backend

Research direction

Start at src/Io/StreamingServer.php around line 308 and reproduce the issue with the provided streaming ThroughStream example and curl --http1.0 request. Trace how an HTTP/1.0 response with an unknown body size handles Connection: keep-alive; done means the response is transmitted and the connection closes instead of hanging.

Written by the indexing model from the issue text.

Description

bug

Assuming the response body is streaming and its size is unknown, when a request such as this is received:

GET / HTTP/1.0
Connection: keep-alive

ReactPHP produces a response without a Content-Length header, such as this:

HTTP/1.0 200 OK
Connection: keep-alive

<data>

and doesn't close the connection, which then just hangs until timeout, because for the client there is no way of telling, when the response data is finished transmitting.

Steps to reproduce:

$server = new React\Http\HttpServer(function () {
    $stream = new ThroughStream();
    Loop::futureTick(function () use ($stream) {
        $stream->write("foo\n");
        $stream->end();
    });
    return new Response(200, body: $stream);
});

$socket = new React\Socket\SocketServer("0.0.0.0:80");
$server->listen($socket);
curl -v --http1.0 -H "connection: keep-alive" localhost:80

Tested on v1.11.0 and 3.x-dev (4e1b4f369eea9428ac38b8851e113ce5ad47cbee).


Since it's HTTP/1.0, Transfer-Encoding: chunked cannot be used. I believe the only good way to handle this situation is to ignore the requested Connection: keep-alive and just close the connection after the response is transmitted. I think this should be a valid behavior - server is not required to strictly obey the keep-alive request header.

The relevant code is here: https://github.com/reactphp/http/blob/1.x/src/Io/StreamingServer.php#L308

Dominant language
PHP
Stars
781
Forks
166
PR merge metrics
No merged PRs in 30d

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from reactphp/http

All issues in reactphp/http

Similar issues

More PHP issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.