13 function http_request($request, $timeout = 5)
15 $url = $request[
'url'];
18 $parts = parse_url($url);
19 if (array_key_exists(
'host', $parts)) {
20 $remote = $parts[
'host'];
22 return myErrorHandler(
"url ($url) has no host. Is it relative?");
24 if (array_key_exists(
'port', $parts)) {
25 $port = $parts[
'port'];
31 $request_headers =
"";
32 foreach ($request[
'headers'] as $name => $value) {
33 switch (strtolower($name)) {
43 case "accept-encoding":
49 $host_info .=
':' . $port;
51 $request_headers .=
"$name: $host_info\r\n";
55 $request_headers .=
"$name: $value\r\n";
61 switch (strtolower($parts[
'scheme'])) {
64 if ( ! $port ) $port = 443;
68 if ( ! $port ) $port = 80;
73 $scheme = $parts[
'scheme'] .
'://';
75 return myErrorHandler(
"Unknown scheme ($scheme) and no port.");
84 $sock = @fsockopen(
"$scheme$remote", $port, $errno, $errstr, $timeout);
86 return myErrorHandler(
"Unable to open URL ($url): $errstr");
91 stream_set_timeout($sock, $timeout);
94 if (array_key_exists(
'path', $parts)) {
95 $path_info = $parts[
'path'];
100 if (array_key_exists(
'query', $parts)) $path_info .=
'?' . $parts[
'query'];
101 if (array_key_exists(
'fragment', $parts)) $path_info .=
'#' . $parts[
'fragment'];
103 $out = $request[
"method"].
" ".$path_info.
" ".$request[
"protocol"].
"\r\n"
105 .
"Connection: close\r\n\r\n";
107 fwrite($sock, $request[
'payload']);
109 $header_str = stream_get_line($sock, 1024*16,
"\r\n\r\n");
110 $headers = http_parse_headers($header_str);
111 $status_line = array_shift($headers);
114 preg_match(
'|HTTP/\d+\.\d+\s+(\d+)\s+.*|i',$status_line,$match);
117 if (isset($match[1])) {
121 return array(
'headers' => $headers,
'socket' => $sock,
'status' => $status);
129 function http_parse_headers($header_str)
134 $header_str = preg_replace(
"/^(?:\x0D?\x0A)+/",
'', $header_str);
136 while (preg_match(
"/^([^\x0A]*?)\x0D?(?:\x0A|\$)/", $header_str, $matches)) {
137 $header_str = substr($header_str, strlen($matches[0]));
138 $status_line = $matches[1];
140 if (empty($headers)) {
142 $headers[] = $status_line;
144 elseif (preg_match(
'/^([^:\s]+)\s*:\s*(.*)/', $status_line, $matches)) {
147 $headers[$key] = $val;
149 list(,$key,$val) = $matches;
151 elseif (preg_match(
'/^\s+(.*)/', $status_line, $matches)) {
153 $val .=
" ".$matches[1];
161 $headers[$key] = $val;