Annotation of embedaddon/php/ext/standard/tests/http/server.inc, revision 1.1.1.1
1.1 misho 1: <?php
2:
3: function http_server_skipif($socket_string) {
4:
5: if (!function_exists('pcntl_fork')) die('skip pcntl_fork() not available');
6: if (!function_exists('posix_kill')) die('skip posix_kill() not available');
7: if (!stream_socket_server($socket_string)) die('skip stream_socket_server() failed');
8: }
9:
10: /* Minimal HTTP server with predefined responses.
11: *
12: * $socket_string is the socket to create and listen on (e.g. tcp://127.0.0.1:1234)
13: * $files is an array of files containing N responses for N expected requests. Server dies after N requests.
14: * $output is a stream on which everything sent by clients is written to
15: */
16: function http_server($socket_string, array $files, &$output = null) {
17:
18: pcntl_alarm(60);
19:
20: $server = stream_socket_server($socket_string, $errno, $errstr);
21: if (!$server) {
22: return false;
23: }
24:
25: if ($output === null) {
26: $output = tmpfile();
27: if ($output === false) {
28: return false;
29: }
30: }
31:
32: $pid = pcntl_fork();
33: if ($pid == -1) {
34: die('could not fork');
35: } else if ($pid) {
36: return $pid;
37: }
38:
39: foreach($files as $file) {
40:
41: $sock = stream_socket_accept($server);
42: if (!$sock) {
43: exit(1);
44: }
45:
46: // read headers
47:
48: $content_length = 0;
49:
50: stream_set_blocking($sock, 0);
51: while (!feof($sock)) {
52:
53: list($r, $w, $e) = array(array($sock), null, null);
54: if (!stream_select($r, $w, $e, 1)) continue;
55:
56: $line = stream_get_line($sock, 8192, "\r\n");
57: if ($line === b'') {
58: fwrite($output, b"\r\n");
59: break;
60: } else if ($line !== false) {
61: fwrite($output, b"$line\r\n");
62:
63: if (preg_match(b'#^Content-Length\s*:\s*([[:digit:]]+)\s*$#i', $line, $matches)) {
64: $content_length = (int) $matches[1];
65: }
66: }
67: }
68: stream_set_blocking($sock, 1);
69:
70: // read content
71:
72: if ($content_length > 0) {
73: stream_copy_to_stream($sock, $output, $content_length);
74: }
75:
76: // send response
77:
78: $fd = fopen($file, 'rb');
79: stream_copy_to_stream($fd, $sock);
80:
81: fclose($sock);
82: }
83:
84: exit(0);
85: }
86:
87: function http_server_kill($pid) {
88: posix_kill($pid, SIGTERM);
89: pcntl_waitpid($pid, $status);
90: }
91:
92: ?>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>