public static function send($method, $hostname, $port, $url_path, $data = array(), $headers = array())
{
$method = strtoupper($method);
if (!in_array($method, array('GET', 'POST', 'PROPFIND', 'OPTIONS', 'PUT', 'MKCOL'))) {
$method = 'GET';
}
if (!is_numeric($port)) {
$port = 80;
}
$s_data = array();
if (!is_array($data)) {
$s_data = $data;
} else {
foreach ($data as $key => $value) {
$s_data[] = $key . '=' . urlencode($value);
}
$s_data = implode('&', $s_data);
}
if ('GET' == $method && 0 != strlen($s_data)) {
$url_path .= '?' . $s_data;
$s_data = '';
}
$status_code = '';
if (!($s = @fsockopen($hostname, $port))) {
$body = '';
$headers = array();
$status_code = '500';
$status = 'HTTP/1.1 500 Internal server error or host unreachable.';
} else {
$content_type = 'application/x-www-form-urlencoded';
if (isset($headers['Content-Type'])) {
$content_type = $headers['Content-Type'];
unset($headers['Content-Type']);
}
fputs($s, $method . ' ' . $url_path . " HTTP/1.1\r\n");
fputs($s, "Host: {$hostname}\r\n");
fputs($s, "Content-Type: {$content_type}\r\n");
fputs($s, "Content-Length: " . strlen($s_data) . "\r\n");
fputs($s, "Accept-Encoding: compress, gzip\r\n");
fputs($s, "User-Agent: Gecko MSIE AppleWebKit KHTML Opera Win Mac Linux (April-Child.com simple HTTP client)\r\n");
foreach ($headers as $name => $value) {
fputs($s, "{$name}: {$value}\r\n");
}
fputs($s, "Connection: close\r\n\r\n");
fputs($s, $s_data);
$response = '';
while (!feof($s)) {
$response .= fgets($s, 128);
}
fclose($s);
$headers = array();
$body = '';
if (false !== ($ix = strpos($response, "\r\n\r\n"))) {
$raw_headers = explode("\r\n", substr($response, 0, $ix));
$status = array_shift($raw_headers);
preg_match_all('|\\d{3}|', $status, $m);
$status_code = $m[0][0];
foreach ($raw_headers as $header) {
$pair = explode(':', $header);
$headers[trim(strtolower($pair[0]))] = trim($pair[1]);
}
$body = SimpleHTTP::decode_body($headers, substr($response, $ix + 4));
}
}
return array('status' => $status, 'status_code' => $status_code, 'headers' => $headers, 'body' => $body);
}