add pipelining test
authorMichael Wallner <mike@php.net>
Wed, 11 Feb 2015 11:12:26 +0000 (12:12 +0100)
committerMichael Wallner <mike@php.net>
Wed, 11 Feb 2015 11:12:26 +0000 (12:12 +0100)
tests/pipeline.inc [new file with mode: 0644]
tests/pipeline001.phpt [new file with mode: 0644]
tests/proxy.inc
tests/proxy001.phpt
tests/server.inc [new file with mode: 0644]

diff --git a/tests/pipeline.inc b/tests/pipeline.inc
new file mode 100644 (file)
index 0000000..815b463
--- /dev/null
@@ -0,0 +1,25 @@
+<?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);
+       }
+});
diff --git a/tests/pipeline001.phpt b/tests/pipeline001.phpt
new file mode 100644 (file)
index 0000000..54707df
--- /dev/null
@@ -0,0 +1,56 @@
+--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===
index d6803db..61b20dd 100644 (file)
@@ -1,25 +1,21 @@
 <?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);
+});
index c8a2e63..c3a5905 100644 (file)
@@ -8,20 +8,21 @@ skip_client_test();
 --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();
@@ -29,11 +30,9 @@ if (($proc = proc_open(PHP_BINARY . " proxy.inc", $spec, $pipes, __DIR__))) {
                echo $e;
        }
        echo $c->getResponse()->getBody();
-       while (!feof($pipes[1])) {
-               echo fgets($pipes[1]);
-       }
        unset($r, $client);
-}
+});
+
 ?>
 ===DONE===
 --EXPECTF--
diff --git a/tests/server.inc b/tests/server.inc
new file mode 100644 (file)
index 0000000..304e393
--- /dev/null
@@ -0,0 +1,28 @@
+<?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);
+       }
+}