Annotation of embedaddon/php/ext/standard/tests/http/server.inc, revision 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>