/** * 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); }
/** * 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; } }
/** * @dataProvider requestParsingDataProvider */ public function testRequestParsing($raw, $headers) { $server = array(); $request = new StupidHttp_WebRequest($server, explode('\\n', $raw)); $this->assertEquals($headers, $request->getHeaders()); }