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>