--- /dev/null
+<?php
+
+include "server.inc";
+
+function respond($client, $msg) {
+ (new http\Env\Response)->setEnvRequest($msg)
+ ->setHeader("X-Req", $msg->getRequestUrl())
+ ->send($client);
+}
+
+serve(function($client) {
+ $count = trim(fgets(STDIN));
+
+ /* the peek message */
+ respond($client, new http\Message($client, false));
+
+ /* pipelined messages */
+ $req = array();
+ for ($i=0; $i < $count; ++ $i) {
+ $req[] = new http\Message($client, false);
+ }
+ foreach ($req as $msg) {
+ respond($client, $msg);
+ }
+});
--- /dev/null
+--TEST--
+pipelining
+--SKIPIF--
+<?php
+include "skipif.inc";
+skip_client_test();
+?>
+--FILE--
+<?php
+
+include "server.inc";
+
+echo "Test\n";
+
+server("pipeline.inc", function($port, $stdin, $stdout, $stderr) {
+ /* tell the server we're about to send 3 pipelined messages */
+ fputs($stdin, "3\n");
+
+ $client = new http\Client(null);
+ $client->configure(["pipelining" => true, "max_host_connections" => 0]);
+
+ /* this is just to let curl know the server may be capable of pipelining */
+ $client->enqueue(new http\Client\Request("GET", "http://localhost:$port"));
+ $client->send();
+
+ $client->enqueue(new http\Client\Request("GET", "http://localhost:$port/1"));
+ $client->enqueue(new http\Client\Request("GET", "http://localhost:$port/2"));
+ $client->enqueue(new http\Client\Request("GET", "http://localhost:$port/3"));
+ $client->send();
+
+ while (($response = $client->getResponse())) {
+ echo $response;
+ }
+});
+
+?>
+===DONE===
+--EXPECT--
+Test
+HTTP/1.1 200 OK
+X-Req: /3
+Etag: ""
+X-Original-Transfer-Encoding: chunked
+HTTP/1.1 200 OK
+X-Req: /2
+Etag: ""
+X-Original-Transfer-Encoding: chunked
+HTTP/1.1 200 OK
+X-Req: /1
+Etag: ""
+X-Original-Transfer-Encoding: chunked
+HTTP/1.1 200 OK
+X-Req: /
+Etag: ""
+X-Original-Transfer-Encoding: chunked
+===DONE===
<?php
-foreach (range(8000, 9000) as $port) {
- if (($server = stream_socket_server("tcp://localhost:$port"))) {
- fprintf(STDERR, "%s\n", $port);
- if (($client = stream_socket_accept($server))) {
- /* this might be a proxy connect or a standard request */
- $request = new http\Message($client, false);
-
- if ($request->getHeader("Proxy-Connection")) {
- $response = new http\Env\Response;
- $response->send($client);
-
- /* soak up the request following the connect */
- new http\Message($client, false);
- }
-
- /* return the initial message as response body */
- $response = new http\Env\Response;
- $response->getBody()->append($request);
- $response->send($client);
- }
- return;
+include "server.inc";
+
+serve(function($client) {
+ /* this might be a proxy connect or a standard request */
+ $request = new http\Message($client, false);
+
+ if ($request->getHeader("Proxy-Connection")) {
+ $response = new http\Env\Response;
+ $response->send($client);
+
+ /* soak up the request following the connect */
+ new http\Message($client, false);
}
-}
\ No newline at end of file
+
+ /* return the initial message as response body */
+ $response = new http\Env\Response;
+ $response->getBody()->append($request);
+ $response->send($client);
+});
--FILE--
<?php
+include "server.inc";
+
echo "Test\n";
-$spec = array(array("pipe","r"), array("pipe","w"), array("pipe","w"));
-if (($proc = proc_open(PHP_BINARY . " proxy.inc", $spec, $pipes, __DIR__))) {
- $port = trim(fgets($pipes[2]));
+server("proxy.inc", function($port, $stdin, $stdout, $stderr) {
echo "Server on port $port\n";
+
$c = new http\Client;
$r = new http\Client\Request("GET", "http://www.example.com/");
$r->setOptions(array(
- "timeout" => 3,
- "proxytunnel" => true,
- "proxyheader" => array("Hello" => "there!"),
- "proxyhost" => "localhost",
- "proxyport" => $port,
+ "timeout" => 3,
+ "proxytunnel" => true,
+ "proxyheader" => array("Hello" => "there!"),
+ "proxyhost" => "localhost",
+ "proxyport" => $port,
));
try {
$c->enqueue($r)->send();
echo $e;
}
echo $c->getResponse()->getBody();
- while (!feof($pipes[1])) {
- echo fgets($pipes[1]);
- }
unset($r, $client);
-}
+});
+
?>
===DONE===
--EXPECTF--
--- /dev/null
+<?php
+
+function serve(callable $cb) {
+ foreach (range(8000, 9000) as $port) {
+ if (($server = stream_socket_server("tcp://localhost:$port"))) {
+ fprintf(STDERR, "%s\n", $port);
+ if (($client = stream_socket_accept($server))) {
+ $cb($client);
+ }
+ return;
+ }
+ }
+}
+
+function server($file, callable $cb) {
+ $spec = array(array("pipe","r"), array("pipe","w"), array("pipe","w"));
+ if (($proc = proc_open(PHP_BINARY . " $file", $spec, $pipes, __DIR__))) {
+ $port = trim(fgets($pipes[2]));
+
+ $cb($port,
+ $stdin = $pipes[0],
+ $stdout = $pipes[1],
+ $stderr = $pipes[2]);
+
+ fpassthru($stderr);
+ fpassthru($stdout);
+ }
+}