/**
  * Returns a web response that corresponds to serving a given static file.
  */
 public function serveDocument(StupidHttp_WebRequest $request, $documentPath)
 {
     // First, check for timestamp if possible.
     $serverTimestamp = filemtime($documentPath);
     $ifModifiedSince = $request->getHeader('If-Modified-Since');
     if ($ifModifiedSince != null) {
         $clientTimestamp = strtotime($ifModifiedSince);
         if ($clientTimestamp > $serverTimestamp) {
             return new StupidHttp_WebResponse(304);
         }
     }
     // ...otherwise, check for similar checksum.
     $documentSize = filesize($documentPath);
     if ($documentSize == 0) {
         return new StupidHttp_WebResponse(200);
     }
     $documentHandle = fopen($documentPath, "rb");
     $contents = fread($documentHandle, $documentSize);
     fclose($documentHandle);
     if ($contents === false) {
         throw new StupidHttp_WebException('Error reading file: ' . $documentPath, 500);
     }
     $contentsHash = md5($contents);
     $ifNoneMatch = $request->getHeader('If-None-Match');
     if ($ifNoneMatch != null) {
         if ($ifNoneMatch == $contentsHash) {
             return new StupidHttp_WebResponse(304);
         }
     }
     // ...ok, let's send the file.
     $this->ensureMimeTypes();
     $extension = pathinfo($documentPath, PATHINFO_EXTENSION);
     $headers = array('Content-Length' => $documentSize, 'Content-MD5' => base64_encode($contentsHash), 'Content-Type' => isset($this->mimeTypes[$extension]) ? $this->mimeTypes[$extension] : 'text/plain', 'ETag' => $contentsHash, 'Last-Modified' => date("D, d M Y H:i:s T", filemtime($documentPath)));
     return new StupidHttp_WebResponse(200, $headers, $contents);
 }
Exemplo n.º 2
0
 /**
  * For internal use only.
  */
 public function _preprocessRequest(\StupidHttp_WebRequest $request)
 {
     try {
         $documentPath = $this->bakeCacheDir . $request->getUriPath();
         if (is_file($documentPath) && isset($this->bakeCacheFiles[$documentPath])) {
             // Make sure this file is up-to-date.
             $this->prebake($request->getServerVariables(), $this->bakeCacheFiles[$documentPath]);
         } else {
             // Perhaps a new file? Re-bake and update our index.
             $bakedFiles = $this->prebake($request->getServerVariables());
             foreach ($bakedFiles as $f => $info) {
                 if ($info['was_baked']) {
                     foreach ($info['outputs'] as $out) {
                         $this->bakeCacheFiles[$out] = $f;
                     }
                 }
             }
         }
     } catch (Exception $e) {
         $this->logger->err($e->getMessage());
         $this->bakeError = $e;
     }
 }
Exemplo n.º 3
0
 /**
  * @dataProvider requestParsingDataProvider
  */
 public function testRequestParsing($raw, $headers)
 {
     $server = array();
     $request = new StupidHttp_WebRequest($server, explode('\\n', $raw));
     $this->assertEquals($headers, $request->getHeaders());
 }