class HttpConnection { private $host; private $port; private $headers; public function __construct($host, $port) { $this->host = $host; $this->port = $port; $this->headers = new HeaderList(array(), "\r\n"); } public function get($path, $params = array(), $headers = array()) { return $this->send($path, 'get', $params, $headers); } public function post($path, $params = array(), $headers = array()) { return $this->send($path, 'post', $params, $headers); } public static function serialize_auth($user, $pass) { return base64_encode("$user:$pass"); } public static function serialize_params($params) { $query_string = array(); foreach ($params as $key => $value) { $query_string[] = urlencode($key) . '=' . urlencode($value); } return implode('&', $query_string); } private function send($path, $method, $params = array(), $headers = array()) { $this->headers->add($headers); $params = self::serialize_params($params); $this->request = strtoupper($method) . " http://{$this->host}{$path}?{$params} HTTP/1.0\r\n"; $this->request .= $this->headers->to_s() . "\r\n"; if ($fp = fsockopen($this->host, $this->port, $errno, $errstr, 15)) { if (fwrite($fp, $this->request)) { while (!feof($fp)) { $this->response .= fread($fp, 4096); } } fclose($fp); } else { throw new Exception("could not establish connection with $host"); } return $this->parse_response(); } private function parse_response() { $this->response = str_replace("\r\n", "\n", $this->response); list($headers, $body) = explode("\n\n", $this->response, 2); $headers = new HeaderList($headers); return array('headers' => $headers->to_a(), 'body' => $body, 'code' => $headers->get_response_code()); } } class HeaderList { private $headers; private $response_code; private $linebreak; public function __construct($headers = array(), $linebreak = "\n") { $this->linebreak = $linebreak; $this->headers = $headers; if (is_string($this->headers)) { $this->parse_headers_string(); } } public function to_s() { $headers = ''; foreach ($this->headers as $header => $value) { $headers .= "$header: $value{$this->linebreak}"; } return $headers; } public function to_a() { return $this->headers; } public function __toString() { return $this->to_s(); } public function add($headers) { $this->headers = array_merge($this->headers, $headers); } public function get($header) { return $this->headers[$header]; } public function get_response_code() { return $this->response_code; } private function parse_headers_string() { $replace = ($this->linebreak == "\n" ? "\r\n" : "\n"); $headers = str_replace($replace, $this->linebreak, trim($this->headers)); $headers = explode($this->linebreak, $headers); $this->headers = array(); if (preg_match('/^HTTP\/\d\.\d (\d{3})/', $headers[0], $matches)) { $this->response_code = $matches[1]; array_shift($headers); } foreach ($headers as $string) { list($header, $value) = explode(': ', $string, 2); $this->headers[$header] = $value; } } }