/** * Prepare the request headers * * @return array */ protected function prepare_headers() { $headers = array(); // Set the host header if (!isset($this->headers['host'])) { $host = $this->uri->getHost(); // If the port is not default, add it if (!($this->uri->getScheme() == 'http' && $this->uri->getPort() == 80 || $this->uri->getScheme() == 'https' && $this->uri->getPort() == 443)) { $host .= ':' . $this->uri->getPort(); } // var_dump($host); $headers[] = "Host: {$host}"; } // Set the connection header if (!isset($this->headers['connection'])) { if (!$this->config['keepalive']) { $headers[] = "Connection: close"; } } // Set the Accept-encoding header if not set - depending on whether // zlib is available or not. if (!isset($this->headers['accept-encoding'])) { if (function_exists('gzinflate') && $this->config['adapter'] !== 'Zend_Http_Client_Adapter_CurlProxy') { $headers[] = 'Accept-encoding: gzip, deflate'; } else { $headers[] = 'Accept-encoding: identity'; } } // Set the content-type header if ($this->method == self::POST && (!isset($this->headers['content-type']) && isset($this->enctype))) { $headers[] = "Content-type: {$this->enctype}"; } // Set the user agent header if (!isset($this->headers['user-agent']) && isset($this->config['useragent'])) { $headers[] = "User-agent: {$this->config['useragent']}"; } // Set HTTP authentication if needed if (is_array($this->auth)) { $auth = self::encodeAuthHeader($this->auth['user'], $this->auth['password'], $this->auth['type']); $headers[] = "Authorization: {$auth}"; } // Load cookies from cookie jar if (isset($this->cookiejar)) { $cookstr = $this->cookiejar->getMatchingCookies($this->uri, true, Zend_Http_CookieJar::COOKIE_STRING_CONCAT); if ($cookstr) { $headers[] = "Cookie: {$cookstr}"; } } // Add all other user defined headers foreach ($this->headers as $header) { list($name, $value) = $header; if (is_array($value)) { $value = implode(', ', $value); } $headers[] = "{$name}: {$value}"; } return $headers; }
/** * Send request to the proxy server with streaming support * * @param string $method * @param Zend_Uri_Http $uri * @param string $http_ver * @param array $headers * @param string $body * @return string Request as string */ public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') { // If no proxy is set, throw an error if (!$this->config['proxy_host']) { // require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception('No proxy host set!'); } // Make sure we're properly connected if (!$this->socket) { // require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception('Trying to write but we are not connected'); } $host = $this->config['proxy_host']; $port = $this->config['proxy_port']; if ($this->connected_to[0] != $host || $this->connected_to[1] != $port) { // require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception('Trying to write but we are connected to the wrong proxy ' . 'server'); } // Add Proxy-Authorization header if ($this->config['proxy_user'] && !isset($headers['proxy-authorization'])) { $headers['proxy-authorization'] = Zend_Http_Client::encodeAuthHeader($this->config['proxy_user'], $this->config['proxy_pass'], $this->config['proxy_auth']); } // if we are proxying HTTPS, preform CONNECT handshake with the proxy if ($uri->getScheme() == 'https' && !$this->negotiated) { $this->connectHandshake($uri->getHost(), $uri->getPort(), $http_ver, $headers); $this->negotiated = true; } // Save request method for later $this->method = $method; // Build request headers $request = "{$method} {$uri->__toString()} HTTP/{$http_ver}\r\n"; // Add all headers to the request string foreach ($headers as $k => $v) { if (is_string($k)) { $v = "{$k}: {$v}"; } $request .= "{$v}\r\n"; } $request .= "\r\n"; // Send the request headers if (!@fwrite($this->socket, $request)) { // require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception('Error writing request to proxy server'); } // Read from $body, write to socket $chunk = $body->read(self::CHUNK_SIZE); while ($chunk !== false) { if (!@fwrite($this->socket, $chunk)) { // require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception('Error writing request to server'); } $chunk = $body->read(self::CHUNK_SIZE); } $body->closeFileHandle(); return 'Large upload, request is not cached.'; }
/** * Send request to the remote server with streaming support. * * @param string $method * @param Zend_Uri_Http $uri * @param string $http_ver * @param array $headers * @param string $body * @return string Request as string */ public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') { // Make sure we're properly connected if (! $this->socket) { require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception( 'Trying to write but we are not connected'); } $host = $uri->getHost(); $host = (strtolower($uri->getScheme()) == 'https' ? $this->config['ssltransport'] : 'tcp') . '://' . $host; if ($this->connected_to[0] != $host || $this->connected_to[1] != $uri->getPort()) { require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception( 'Trying to write but we are connected to the wrong host'); } // Save request method for later $this->method = $method; // Build request headers $path = $uri->getPath(); if ($uri->getQuery()) $path .= '?' . $uri->getQuery(); $request = "{$method} {$path} HTTP/{$http_ver}\r\n"; foreach ($headers as $k => $v) { if (is_string($k)) $v = ucfirst($k) . ": $v"; $request .= "$v\r\n"; } // Send the headers over $request .= "\r\n"; if (! @fwrite($this->socket, $request)) { require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception( 'Error writing request to server'); } //read from $body, write to socket $chunk = $body->read(self::CHUNK_SIZE); while ($chunk !== FALSE) { if (! @fwrite($this->socket, $chunk)) { require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception( 'Error writing request to server'); } $chunk = $body->read(self::CHUNK_SIZE); } $body->closeFileHandle(); return 'Large upload, request is not cached.'; }
/** * Prepare the request headers * * @return array */ protected function prepare_headers() { $headers = array(); // Set the host header if (!isset($this->headers['host'])) { $host = $this->uri->getHost(); // If the port is not default, add it if (!($this->uri->getScheme() == 'http' && $this->uri->getPort() == 80 || $this->uri->getScheme() == 'https' && $this->uri->getPort() == 443)) { $host .= ':' . $this->uri->getPort(); } $headers[] = "Host: {$host}"; } // Set the connection header if (!isset($this->headers['connection'])) { if (!$this->config['keepalive']) { $headers[] = "Connection: close"; } } // Set the content-type header if (!isset($this->headers['content-type']) && isset($this->enctype)) { $headers[] = "Content-type: {$this->enctype}"; } // Set the user agent header if (!isset($this->headers['user-agent']) && isset($this->config['useragent'])) { $headers[] = "User-agent: {$this->config['useragent']}"; } // Set HTTP authentication if needed if (is_array($this->auth)) { $auth = self::encodeAuthHeader($this->auth['user'], $this->auth['password'], $this->auth['type']); $headers[] = "Authorization: {$auth}"; } // Load cookies from cookie jar if (isset($this->cookiejar)) { $cookstr = $this->cookiejar->getMatchingCookies($this->uri, true, Zend_Http_CookieJar::COOKIE_STRING_CONCAT); if ($cookstr) { $headers[] = "Cookie: {$cookstr}"; } } // Add all other user defined headers foreach ($this->headers as $name => $value) { if (is_array($value)) { $value = implode(', ', $value); } $headers[] = ucfirst($name) . ": {$value}"; } return $headers; }
/** * Send request to the remote server * * @param string $method * @param Zend_Uri_Http $uri * @param string $http_ver * @param array $headers * @param string $body * @return string Request as string */ public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') { $host = $uri->getHost(); $host = strtolower($uri->getScheme()) == 'https' ? 'sslv2://' . $host : $host; // Build request headers $path = $uri->getPath(); if ($uri->getQuery()) { $path .= '?' . $uri->getQuery(); } $request = "{$method} {$path} HTTP/{$http_ver}\r\n"; foreach ($headers as $k => $v) { if (is_string($k)) { $v = ucfirst($k) . ": {$v}"; } $request .= "{$v}\r\n"; } // Add the request body $request .= "\r\n" . $body; // Do nothing - just return the request as string return $request; }
/** * Send request to the remote server * * @param string $method * @param Zend_Uri_Http $uri * @param string $http_ver * @param array $headers * @param string $body * @return string Request as string */ public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') { // Make sure we're properly connected if (!$this->socket) { require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception('Trying to write but we are not connected'); } $host = $uri->getHost(); $host = (strtolower($uri->getScheme()) == 'https' ? $this->config['ssltransport'] : 'tcp') . '://' . $host; if ($this->connected_to[0] != $host || $this->connected_to[1] != $uri->getPort()) { require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception('Trying to write but we are connected to the wrong host'); } // Save request method for later $this->method = $method; // Build request headers $path = $uri->getPath(); if ($uri->getQuery()) { $path .= '?' . $uri->getQuery(); } $request = "{$method} {$path} HTTP/{$http_ver}\r\n"; foreach ($headers as $k => $v) { if (is_string($k)) { $v = ucfirst($k) . ": {$v}"; } $request .= "{$v}\r\n"; } // Add the request body $request .= "\r\n" . $body; // Send the request if (!@fwrite($this->socket, $request)) { require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception('Error writing request to server'); } return $request; }
/** * Send request to the remote server * * @param string $method * @param Zend_Uri_Http $uri * @param float $http_ver * @param array $headers * @param string $body */ public function write($method, $uri, $http_ver = 1.1, $headers = array(), $body = '') { // Make sure we're properly connected if (!$this->socket) { throw new Zend_Http_Client_Adapter_Exception("Trying to write but we are not connected"); } $host = $uri->getHost(); $host = strtolower($uri->getScheme()) == 'https' ? 'ssl://' . $host : $host; if ($this->connected_to[0] != $host || $this->connected_to[1] != $uri->getPort()) { throw new Zend_Http_Client_Adapter_Exception("Trying to write but we are connected to the wrong host"); } // Build request headers $request = "{$method} {$uri->__toString()} HTTP/{$http_ver}\r\n"; foreach ($headers as $k => $v) { if (is_string($k)) { $v = ucfirst($k) . ": {$v}"; } $request .= "{$v}\r\n"; } // Add the request body $request .= "\r\n" . $body; // Send the request fwrite($this->socket, $request); }
/** * Send request to the proxy server * * @param string $method * @param Zend_Uri_Http $uri * @param string $http_ver * @param array $headers * @param string $body * @return string Request as string */ public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') { // set URL curl_setopt($this->curl, CURLOPT_URL, $uri->__toString()); // var_dump($this->curl); // Make sure we're properly connected // if (! $this->curl) // require_once 'Zend/Http/Client/Adapter/Exception.php'; // throw new Zend_Http_Client_Adapter_Exception("Trying to write but we are not connected"); // if ($this->connected_to[0] != $uri->getHost() || $this->connected_to[1] != $uri->getPort()) // require_once 'Zend/Http/Client/Adapter/Exception.php'; // throw new Zend_Http_Client_Adapter_Exception("Trying to write but we are connected to the wrong host"); // ensure correct curl call if ($method == Zend_Http_Client::GET) { $curlMethod = CURLOPT_HTTPGET; } elseif ($method == Zend_Http_Client::POST) { $curlMethod = CURLOPT_POST; } else { // TODO: use CURLOPT_PUT for PUT requests, CURLOPT_CUSTOMREQUEST for other types of calls // For now, through an exception for unsupported request methods require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception("Method currently not supported"); } // get http version to use $curlHttp = ($http_ver = 1.1) ? CURL_HTTP_VERSION_1_1 : CURL_HTTP_VERSION_1_0; curl_setopt($this->curl, $curlMethod, true); curl_setopt($this->curl, $curlHttp, true); if ($uri->getScheme() == 'https') { curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, FALSE); } $host = $this->config['proxy_host']; $port = $this->config['proxy_port']; var_dump($host); var_dump($port); curl_setopt($this->curl, CURLOPT_PROXY, $host); curl_setopt($this->curl, CURLOPT_PROXYPORT, $port); // ensure headers are also returned curl_setopt($this->curl, CURLOPT_HEADER, false); // ensure actual response is returned curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true); // set additional headers curl_setopt($this->curl, CURLOPT_HTTPHEADER, $headers); // curl_setopt($this->curl, CURLOPT_ENCODING, "gzip"); // var_dump($this->config); // if(!$this->config['followlocation']){ // var_dump("OFF followlocation"); // curl_setopt($this->curl, CURLOPT_FOLLOWLOCATION, 0); // } else { // var_dump("ON followlocation"); // curl_setopt($this->curl, CURLOPT_FOLLOWLOCATION, 1); // } curl_setopt($this->curl, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($this->curl, CURLOPT_TIMEOUT, $this->config['timeout']); $ob =& $this; curl_setopt($this->curl, CURLOPT_HEADERFUNCTION, array(&$ob, 'readHeader')); if ($method == Zend_Http_Client::POST) { curl_setopt($this->curl, CURLOPT_POSTFIELDS, $body); } // send the request $this->response = curl_exec($this->curl); $this->response = $this->getHeaders() . $this->response; $con_est_str = "HTTP/1.0 200 Connection established"; if (strstr($this->response, $con_est_str) !== false) { $response = substr($this->response, strlen($con_est_str) + strlen("\r\n\r\n")); $this->response = $response; } else { if ($this->response === false) { require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception("\nCurl error: " . curl_error($this->curl) . "\n"); } } }
/** * Normalizes the uri for internal usage. * * @param Zend_Uri_Http $uri * @return Zend_Uri_Http */ protected function normalizeUri(Zend_Uri_Http $uri) { $defaultPorts = array('http' => 80, 'https' => 443); foreach ($defaultPorts as $scheme => $port) { if ($uri->getScheme() === $scheme && $uri->getPort() == $port) { // Remove default port. Do not modify original object. $uri = clone $uri; $uri->setPort(''); return $uri; } } return $uri; }