예제 #1
0
 /**
  * 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;
 }
예제 #2
0
 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;
 }