/**
  * Send HTTP request
  *
  * Given a Method, URL, Headers, and Body, perform and HTTP request,
  * and return an array of arity 2 containing an associative array of
  * response headers and the response body.
  *
  * @return array
  */
 public static function httpRequest($method, $url, $request_headers = array(), $obj = '')
 {
     # Set up curl
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $url);
     curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
     if ($method == 'GET') {
         curl_setopt($ch, CURLOPT_HTTPGET, 1);
     } else {
         if ($method == 'POST') {
             curl_setopt($ch, CURLOPT_POST, 1);
             curl_setopt($ch, CURLOPT_POSTFIELDS, $obj);
         } else {
             if ($method == 'PUT') {
                 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
                 curl_setopt($ch, CURLOPT_POSTFIELDS, $obj);
             } else {
                 if ($method == 'DELETE') {
                     curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
                 } else {
                     if ($method == 'HEAD') {
                         curl_setopt($ch, CURLOPT_NOBODY, 1);
                     }
                 }
             }
         }
     }
     # Capture the response headers...
     $response_headers_io = new StringIO();
     curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$response_headers_io, 'write'));
     # Capture the response body...
     $response_body_io = new StringIO();
     curl_setopt($ch, CURLOPT_WRITEFUNCTION, array(&$response_body_io, 'write'));
     try {
         # Run the request.
         curl_exec($ch);
         $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
         curl_close($ch);
         # Get the headers...
         $parsed_headers = Utils::parseHttpHeaders($response_headers_io->contents());
         $response_headers = array("http_code" => $http_code);
         foreach ($parsed_headers as $key => $value) {
             $response_headers[strtolower($key)] = $value;
         }
         # Get the body...
         $response_body = $response_body_io->contents();
         # Return a new RiakResponse object.
         return array($response_headers, $response_body);
     } catch (Exception $e) {
         curl_close($ch);
         error_log('Error: ' . $e->getMessage());
         return null;
     }
 }