/** * Executes an HTTP transaction and returns the response. * * @param HttpRequest $request * @return HttpResponse */ public function getResponse(HttpRequest $request) { $uri = $request->getUrl(); $headers = $request->getHeaders(); $flatHeaders = []; foreach ($headers as $key => $value) { $flatHeaders[] = $key . ": " . $value; } $flatHeaders[] = 'Connection: Keep-Alive'; $flatHeaders[] = 'Expect:'; $flatHeaders[] = 'Accept-Language: en-GB'; $flatHeaders[] = 'Cache-Control: no-cache'; $flatHeaders[] = 'User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)'; $curl = curl_init($uri); curl_setopt($curl, CURLOPT_HEADER, false); $payload = $request->getPayload(); switch ($request->getMethod()) { case "head": curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "HEAD"); break; case "delete": curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); break; case "post": curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $payload); break; case "put": curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $payload); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); break; } curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_HTTPHEADER, $flatHeaders); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($curl); $responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); $httpResponse = new HttpResponse(); $httpResponse->setResponseBody($response); $httpResponse->setResponseCode($responseCode); return $httpResponse; }
private function &serveFile() { // Serve file - we can do this using the writeFile() method, which is memory friendly $r = new HttpResponse($this->httpRequest->SERVER['httpVersion'], 200); // Cache? $useCache = false; $scriptnameHash = md5($this->http->getDocRoot() . $this->httpRequest->SERVER['SCRIPT_NAME']); if (isset($this->httpRequest->headers['Cache-Control']) || isset($this->httpRequest->headers['Pragma'])) { $ifModifiedSince = isset($this->httpRequest->headers['If-Modified-Since']) ? (int) strtotime($this->httpRequest->headers['If-Modified-Since']) : 0; $cacheControl = isset($this->httpRequest->headers['Cache-Control']) ? $this->httpRequest->parseHeaderValue($this->httpRequest->headers['Cache-Control']) : array(); $pragma = isset($this->httpRequest->headers['Pragma']) ? $this->httpRequest->parseHeaderValue($this->httpRequest->headers['Pragma']) : array(); // Detect 'If-Modified-Since' (weak) cache validator (http1.1) if ($ifModifiedSince > 0) { if (isset($this->http->cache[$scriptnameHash])) { if ($this->http->cache[$scriptnameHash] == $ifModifiedSince) { // File has not been changed - tell the browser to use the cache (send a 304) $useCache = true; } } else { $scriptMTime = filemtime($this->http->getDocRoot() . $this->httpRequest->SERVER['SCRIPT_NAME']); $this->http->cache[$scriptnameHash] = $scriptMTime; if ($scriptMTime == $ifModifiedSince) { // File has not been changed - tell the browser to use the cache (send a 304) $useCache = true; } } } else { if (isset($cacheControl['max-age']) && $cacheControl['max-age'] == 0 && $cacheControl != 'no-cache' && $pragma != 'no-cache' && isset($this->http->cache[$scriptnameHash])) { $scriptMTime = filemtime($this->http->getDocRoot() . $this->httpRequest->SERVER['SCRIPT_NAME']); if ($this->http->cache[$scriptnameHash] == $scriptMTime) { // File has not been changed - tell the browser to use the cache (send a 304) $useCache = true; } else { // File has been updated - store new mtime in cache $this->http->cache[$scriptnameHash] = $scriptMTime; } clearstatcache(); } } } if ($useCache) { $r->setResponseCode(304); $this->write($r->getHeaders()); } else { $scriptMTime = filemtime($this->http->getDocRoot() . $this->httpRequest->SERVER['SCRIPT_NAME']); $r->addHeader('Content-Type: ' . $this->getMimeType()); $r->addHeader('Last-Modified: ' . date('r', $scriptMTime)); if (isset($this->httpRequest->SERVER['HTTP_RANGE'])) { console('HTTP_RANGE HEADER : ' . $this->httpRequest->SERVER['HTTP_RANGE']); $exp = explode('=', $this->httpRequest->SERVER['HTTP_RANGE']); $startByte = (int) substr($exp[1], 0, -1); $r->addHeader('Content-Length: ' . (filesize($this->http->getDocRoot() . $this->httpRequest->SERVER['SCRIPT_NAME']) - $startByte)); $this->write($r->getHeaders()); $this->writeFile($this->http->getDocRoot() . $this->httpRequest->SERVER['SCRIPT_NAME'], $startByte); } else { $r->addHeader('Content-Length: ' . filesize($this->http->getDocRoot() . $this->httpRequest->SERVER['SCRIPT_NAME'])); $this->write($r->getHeaders()); $this->writeFile($this->http->getDocRoot() . $this->httpRequest->SERVER['SCRIPT_NAME']); } // Store the filemtime in $cache if (!isset($this->http->cache[$scriptnameHash])) { $this->http->cache[$scriptnameHash] = $scriptMTime; } clearstatcache(); } return $r; }