public function fetchRequest(RemoteContentRequest $request) { $outHeaders = array(); if ($request->hasHeaders()) { $headers = explode("\n", $request->getHeaders()); foreach ($headers as $header) { if (strpos($header, ':')) { $key = trim(substr($header, 0, strpos($header, ':'))); $val = trim(substr($header, strpos($header, ':') + 1)); if (strcmp($key, "User-Agent") != 0 && strcasecmp($key, "Transfer-Encoding") != 0 && strcasecmp($key, "Cache-Control") != 0 && strcasecmp($key, "Expries") != 0 && strcasecmp($key, "Content-Length") != 0) { $outHeaders[$key] = $val; } } } } $outHeaders['User-Agent'] = "Shindig PHP"; $options = array(); $options['timeout'] = Shindig_Config::get('curl_connection_timeout'); // configure proxy $proxyUrl = Shindig_Config::get('proxy'); if (!empty($proxyUrl)) { $options['adapter'] = 'Zend_Http_Client_Adapter_Proxy'; $proxy = parse_url($proxyUrl); if (isset($proxy['host'])) { $options['proxy_host'] = $proxy['host']; } if (isset($proxy['port'])) { $options['proxy_port'] = $proxy['port']; } if (isset($proxy['user'])) { $options['proxy_user'] = $proxy['user']; } if (isset($proxy['pass'])) { $options['proxy_pass'] = $proxy['pass']; } } $client = new Zend_Http_Client(); $client->setConfig($options); $client->setUri($request->getUrl()); $client->setHeaders($outHeaders); if ($request->getContentType()) { $client->setHeaders(Zend_Http_Client::CONTENT_TYPE, $request->getContentType()); } if ($request->isPost()) { $client->setMethod(Zend_Http_Client::POST); $client->setRawData($request->getPostBody()); } else { $client->setMethod(Zend_Http_Client::GET); } $response = $client->request(); $request->setHttpCode($response->getStatus()); $request->setContentType($response->getHeader('Content-Type')); $request->setResponseHeaders($response->getHeaders()); $request->setResponseContent($response->getBody()); $request->setResponseSize(strlen($response->getBody())); return $request; }
/** * Parses the result content into the headers and body, and retrieves the http code and content type * * @param RemoteContentRequest $request * @param string $content */ protected function parseResult(RemoteContentRequest $request, $content) { $headers = ''; $body = ''; $httpCode = curl_getinfo($request->handle, CURLINFO_HTTP_CODE); $contentType = curl_getinfo($request->handle, CURLINFO_CONTENT_TYPE); // Attempt to magically convert all text'ish responses to UTF8, especially the xml and json parsers get upset if invalid UTF8 is encountered $textTypes = array('text', 'html', 'json', 'xml', 'atom'); $isTextType = false; $isXml = false; foreach ($textTypes as $textType) { if (strpos($contentType, $textType) !== false) { if ($textType === 'xml') { $isXml = true; } $isTextType = true; break; } } if ($isTextType && function_exists('mb_convert_encoding')) { // try to retrieve content type out of $charset = 'UTF-8'; $matchedCharset = array(); if (0 != preg_match("/charset\\s*=\\s*([^\"' >]*)/ix", $content, $matchedCharset) || 0 != preg_match("/encoding\\s*=\\s*[\\'\"]([^\"' >]*)/ix", $content, $matchedCharset)) { //xml declaration if (trim($matchedCharset[1])) { $charset = trim($matchedCharset[1]); if (($pos = strpos($charset, "\n")) !== false) { $charset = trim(substr($charset, 0, $pos)); } } } // the xml and json parsers get very upset if there are invalid UTF8 sequences in the string, by recoding it any bad chars will be filtered out $content = mb_convert_encoding($content, 'UTF-8', $charset); // if original charset is not utf-8 we now try to rewrite any xml declarations if ($isXml === true && strtoupper($charset) !== 'UTF-8') { $pattern = 'encoding=\\s*([\'"])' . $charset . '\\s*\\1'; $content = mb_ereg_replace($pattern, 'encoding="UTF-8"', $content, "i"); } } // on redirects and such we get multiple headers back from curl it seems, we really only want the last one while (substr($content, 0, strlen('HTTP')) == 'HTTP' && strpos($content, "\r\n\r\n") !== false) { $headers = substr($content, 0, strpos($content, "\r\n\r\n")); $content = $body = substr($content, strlen($headers) + 4); } $headers = explode("\n", $headers); $parsedHeaders = array(); foreach ($headers as $header) { if (strpos($header, ':')) { $key = trim(substr($header, 0, strpos($header, ':'))); $key = str_replace(' ', '-', ucwords(str_replace('-', ' ', $key))); $val = trim(substr($header, strpos($header, ':') + 1)); $parsedHeaders[$key] = $val; } } if (!$httpCode) { $httpCode = '404'; } if (curl_errno($request->handle)) { $httpCode = '500'; $body = 'Curl error: ' . curl_error($request->handle); } $request->setHttpCode($httpCode); $request->setHttpCodeMsg($this->resolveHttpCode($httpCode)); $request->setContentType($contentType); $request->setResponseHeaders($parsedHeaders); $request->setResponseContent($body); $request->setResponseSize(strlen($content)); }
private function rewriteContent($gadgetUrl, RemoteContentRequest &$result) { try { // At the moment we're only able to rewrite CSS files, so check the content type and/or the file extension before rewriting $headers = $result->getResponseHeaders(); $isCss = false; if (isset($headers['Content-Type']) && strtolower($headers['Content-Type'] == 'text/csss')) { $isCss = true; } else { $ext = substr($_GET['url'], strrpos($_GET['url'], '.') + 1); $isCss = strtolower($ext) == 'css'; } if ($isCss) { $gadget = $this->createGadget($gadgetUrl); $rewrite = $gadget->gadgetSpec->rewrite; if (is_array($rewrite)) { $contentRewriter = new ContentRewriter($this->context, $gadget); $result->setResponseContent($contentRewriter->rewriteCSS($result->getResponseContent())); } } } catch (Exception $e) { // ignore, not being able to rewrite anything isn't fatal } }
private function fetch(RemoteContentRequest $request) { if ($request->getUrl() == 'http://test.chabotc.com/ok.html') { $request->setHttpCode(200); $request->setContentType('text/html; charset=UTF-8'); $request->setResponseContent('OK'); } else { if ($request->getUrl() == 'http://test.chabotc.com/fail.html') { $request->setHttpCode(404); } else { if (preg_match('/http:\\/\\/test\\.chabotc\\.com\\/valid(\\d)\\.html/', $request->getUrl(), $matches) > 0) { if ($this->valid[intval($matches[1])]) { $this->valid[intval($matches[1])] = false; $request->setHttpCode(200); $request->setContentType('text/html; charset=UTF-8'); $request->setResponseContent('OK'); } else { $request->setHttpCode(404); } } else { if (strpos($request->getUrl(), 'http://test.chabotc.com/signing.html') == 0) { $url = parse_url($request->getUrl()); $query = array(); parse_str($url['query'], $query); $request->setHttpCode(200); $request->setContentType('text/html; charset=UTF-8'); if ($query['xoauth_signature_publickey'] && $query['oauth_signature']) { $request->setResponseContent('OK'); } else { $request->setResponseContent('FAILED'); } } } } } }
/** * Parses the result content into the headers and body, and retrieves the http code and content type * * @param RemoteContentRequest $request * @param string $content */ private function parseResult(RemoteContentRequest $request, $content) { $headers = ''; $body = ''; $httpCode = curl_getinfo($request->handle, CURLINFO_HTTP_CODE); $contentType = curl_getinfo($request->handle, CURLINFO_CONTENT_TYPE); // Attempt to magically convert all text'ish responses to UTF8, especially the xml and json parsers get upset if invalid UTF8 is encountered $textTypes = array('text', 'html', 'json', 'xml', 'atom'); $isTextType = false; foreach ($textTypes as $textType) { if (strpos($contentType, $textType) !== false) { $isTextType = true; break; } } if ($isTextType && function_exists('mb_convert_encoding')) { $charset = 'UTF-8'; preg_match("/charset\\s*=\\s*([^\"' >]*)/ix", $content, $charset); if (isset($charset[1])) { $charset = trim($charset[1]); if (($pos = strpos($charset, "\n")) !== false) { $charset = trim(substr($charset, 0, $pos)); } } // the xml and json parsers get very upset if there are invalid UTF8 sequences in the string, by recoding it any bad chars will be filtered out $content = mb_convert_encoding($content, 'UTF-8', $charset); } // on redirects and such we get multiple headers back from curl it seems, we really only want the last one while (substr($content, 0, strlen('HTTP')) == 'HTTP' && strpos($content, "\r\n\r\n") !== false) { $headers = substr($content, 0, strpos($content, "\r\n\r\n")); $content = $body = substr($content, strlen($headers) + 4); } $headers = explode("\n", $headers); $parsedHeaders = array(); foreach ($headers as $header) { if (strpos($header, ':')) { $key = trim(substr($header, 0, strpos($header, ':'))); $key = str_replace(' ', '-', ucwords(str_replace('-', ' ', $key))); $val = trim(substr($header, strpos($header, ':') + 1)); $parsedHeaders[$key] = $val; } } if (!$httpCode) { $httpCode = '404'; } $request->setHttpCode($httpCode); $request->setHttpCodeMsg($this->resolveHttpCode($httpCode)); $request->setContentType($contentType); $request->setResponseHeaders($parsedHeaders); $request->setResponseContent($body); $request->setResponseSize(strlen($content)); }