--- /dev/null
+<?php
+
+include "server.inc";
+
+serve(function($client) {
+ $request = new http\Message($client, false);
+ $cookies = new http\Cookie($request->getHeader("cookie"));
+ $response = new http\Env\Response;
+ $response->setCookie($cookies->setCookie("counter", $cookies->getCookie("counter")+1));
+ $response->send($client);
+});
--- /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
+<?php
+
+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);
+ }
+
+ /* return the initial message as response body */
+ $response = new http\Env\Response;
+ $response->getBody()->append($request);
+ $response->send($client);
+});
--- /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);
+ do {
+ $R = [$server]; $W = []; $E = [];
+ $select = stream_select($R, $E, $E, 0, 10000);
+ if ($select && ($client = stream_socket_accept($server, 1))) {
+ if (getenv("PHP_HTTP_TEST_SSL")) {
+ stream_socket_enable_crypto($client, true, STREAM_CRYPTO_METHOD_SSLv23_SERVER);
+ }
+ while (!feof($client)) {
+ $cb($client);
+ }
+ }
+ } while ($select !== false);
+ return;
+ }
+ }
+}
+
+function server($handler, callable $cb) {
+ $spec = array(array("pipe","r"), array("pipe","w"), array("pipe","w"));
+ $comm = sprintf("%s %s/%s", PHP_BINARY, __DIR__, $handler);
+ if (($proc = proc_open($comm, $spec, $pipes, __DIR__))) {
+ $port = trim(fgets($pipes[2]));
+
+ try {
+ $cb($port, $stdin = $pipes[0], $stdout = $pipes[1], $stderr = $pipes[2]);
+ } catch (Exception $e) {
+ echo $e,"\n";
+ }
+
+ proc_terminate($proc);
+
+ fpassthru($stderr);
+ fpassthru($stdout);
+ }
+}