/** * @return Input */ public function createInput() { $parser = null; $type = strtok($this->request->getHeader('Content-Type'), ';'); if ($type && isset($this->parsers[$type])) { $parser = $this->parsers[$type]; } return new Input($this->request, $parser); }
protected function setState() { $this->state = new ArrayHash(); if (!$this->myPresenter || !$this->httpRequest) { return; } $this->state = \Nette\Utils\Json::decode(base64_decode($this->httpRequest->getHeader('X-Nette-Pagestate', base64_encode('{}')))); $this->redrawControl(); }
/** * Sends chunked response to output. * * @param \MouseOver\Storage\IStorageFile $storageFile Storage file * @param \Nette\Http\IRequest $httpRequest HTTP request * @param \Nette\Http\IResponse $httpResponse HTTP response * * @return void */ protected function sendStorageFile($storageFile, Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $httpResponse) { $httpResponse->setHeader('Accept-Ranges', 'bytes'); $reader = $storageFile->getReader(); if (preg_match('#^bytes=(\\d*)-(\\d*)\\z#', $httpRequest->getHeader('Range'), $matches)) { list(, $start, $end) = $matches; if ($start === '') { $start = null; } if ($end === '') { $end = null; } try { $reader->setRange($start, $end); } catch (\InvalidArgumentException $invalidArgumentException) { $httpResponse->setCode(416); // requested range not satisfiable return; } $httpResponse->setCode(206); $httpResponse->setHeader('Content-Range', 'bytes ' . $reader->getRangeStart() . '-' . $reader->getRangeEnd() . '/' . $reader->getFileSize()); $reader->setRange($start, $end); $httpResponse->setHeader('Content-Length', $reader->getLength()); } else { $httpResponse->setHeader('Content-Range', 'bytes 0-' . ($reader->getFileSize() - 1) . '/' . $reader->getFileSize()); $httpResponse->setHeader('Content-Length', $reader->getLength()); } while ($reader->hasContent()) { echo $reader->read(); } }
/** * Terminates request and sends empty HTTP 304 response if * given date is less or equal to date send with If-Modified-Since header. * * Method takes date as a parameter. Callable returning DateTime is also * acceptable and recommended in cases when gathering of last modification date * is difficult. This way the callback will be invoked only if If-Modified-Since * is present. * * @param DateTime|callable * @throws AbortException */ public function terminateIfNoOlderThan($lastModificationDate) { if (!$lastModificationDate instanceof \DateTime && !is_callable($lastModificationDate)) { throw new Nette\InvalidArgumentException("Function accepts only DateTime or callable returning DateTime"); } $ifModifiedSince = $this->httpRequest->getHeader('If-Modified-Since'); if ($ifModifiedSince === NULL) { return; } $ifDate = vBuilder\Utils\Http::parseDateTime($ifModifiedSince); // RFC tell us to ignore invalid dates silently if (!$ifDate) { return; } $ifDate->setTimeZone(new \DateTimeZone(date_default_timezone_get())); if (is_callable($lastModificationDate)) { $lastModificationDate = $lastModificationDate(); if (!$lastModificationDate instanceof \DateTime) { throw new Nette\InvalidArgumentException("Callback has to return DateTime"); } } if ($ifDate >= $lastModificationDate) { $this->terminateWithCode(Nette\Http\IResponse::S304_NOT_MODIFIED); } }
/** * Parse request body if any * @return array|\Traversable * * @throws BadRequestException */ protected function parseRequestBody() { $requestBody = array(); $input = class_exists('Nette\\Framework') && Nette\Framework::VERSION_ID <= 20200 ? file_get_contents('php://input') : $this->httpRequest->getRawBody(); if ($input) { try { $this->mapper = $this->mapperContext->getMapper($this->httpRequest->getHeader('Content-Type')); $requestBody = $this->mapper->parse($input); } catch (InvalidStateException $e) { throw BadRequestException::unsupportedMediaType('No mapper defined for Content-Type ' . $this->httpRequest->getHeader('Content-Type'), $e); } catch (MappingException $e) { throw new BadRequestException($e->getMessage(), 400, $e); } } return $requestBody; }
/** * Detects mobile browser * * @author http://detectmobilebrowsers.com * @param IRequest $httpRequest * @return bool */ public function isMobile(IRequest $httpRequest) { $useragent = $httpRequest->getHeader("user-agent"); if (preg_match('/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i', $useragent) || preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i', substr($useragent, 0, 4))) { return TRUE; } return FALSE; }
/** * @param Http\IRequest $httpRequest * @return string */ private function detectHttpMethod(Http\IRequest $httpRequest) { $method = $httpRequest->getMethod(); if ($this->headerOverride && $method === Http\IRequest::POST) { $overriden = $httpRequest->getHeader($this->headerOverride); $method = $overriden ? strtoupper($overriden) : $method; } return $method; }
/** * Attempts to cache the sent entity by its last modification date. * @param string|int|\DateTime last modified time * @param string strong entity tag validator * @return bool */ public function isModified($lastModified = NULL, $etag = NULL) { if ($lastModified) { $this->response->setHeader('Last-Modified', $this->response->date($lastModified)); } if ($etag) { $this->response->setHeader('ETag', '"' . addslashes($etag) . '"'); } $ifNoneMatch = $this->request->getHeader('If-None-Match'); if ($ifNoneMatch === '*') { $match = TRUE; // match, check if-modified-since } elseif ($ifNoneMatch !== NULL) { $etag = $this->response->getHeader('ETag'); if ($etag == NULL || strpos(' ' . strtr($ifNoneMatch, ",\t", ' '), ' ' . $etag) === FALSE) { return TRUE; } else { $match = TRUE; // match, check if-modified-since } } $ifModifiedSince = $this->request->getHeader('If-Modified-Since'); if ($ifModifiedSince !== NULL) { $lastModified = $this->response->getHeader('Last-Modified'); if ($lastModified != NULL && strtotime($lastModified) <= strtotime($ifModifiedSince)) { $match = TRUE; } else { return TRUE; } } if (empty($match)) { return TRUE; } $this->response->setCode(IResponse::S304_NOT_MODIFIED); return FALSE; }
public static function register(\Nette\Http\IRequest $httpRequest, $storageDir, $expire = 3600) { if (static::$httpRequest) { throw new \Nette\InvalidStateException("Multiple file uploader allready registered"); } elseif (!file_exists($storageDir) || !is_writable($storageDir)) { throw new \Nette\InvalidStateException("Storage dir must be writable"); } static::$httpRequest = $httpRequest; static::$storageDir = $storageDir; static::$expire = $expire; // process uploaded file if ($httpRequest->getHeader('X-Nella-MFU-Token') && $httpRequest->getHeader('X-Uploader')) { $files = $httpRequest->files; if (isset($files['file']) && $files['file']->ok) { $token = $httpRequest->getHeader('X-Nella-MFU-Token'); $path = static::$storageDir . "/"; $path .= $token . "_" . time() . "_" . Strings::random(16); $path .= "." . pathinfo($files['file']->name, PATHINFO_EXTENSION); $path .= ".tmp"; $files['file']->move($path); } echo "{success:true}"; \Nette\Diagnostics\Debugger::$bar = NULL; exit; } // clean expired files $files = Finder::findFiles("*.tmp")->from(static::$storageDir); $expire = time() + static::$expire; foreach ($files as $file) { if ($file->getMTime() > $expire) { @unlink($file->getRealPath()); // prevents error } } }
/** * Sends response to output. * * @param \Nette\Http\IRequest $httpRequest * @param \Nette\Http\IResponse $httpResponse */ public function send(\Nette\Http\IRequest $httpRequest, \Nette\Http\IResponse $httpResponse) { if (strlen($this->etag)) { $httpResponse->setHeader('Etag', $this->etag); } $httpResponse->setExpiration(\Nette\Http\IResponse::PERMANENT); if (($inm = $httpRequest->getHeader('if-none-match')) && $inm == $this->etag) { $httpResponse->setCode(\Nette\Http\IResponse::S304_NOT_MODIFIED); return; } $httpResponse->setContentType($this->contentType); echo $this->content; }
/** * Get prederred method * @param IRequest $request * @return string */ protected function getPreferredMethod(IRequest $request) { $method = $request->getMethod(); $isPost = $method === IRequest::POST; $header = $request->getHeader(self::OVERRIDE_HEADER); $param = $request->getQuery(self::OVERRIDE_PARAM); if ($header && $isPost) { return $header; } if ($param && $isPost) { return $param; } return $request->getMethod(); }
/** * Sends response to output. * * @param Http\IRequest $httpRequest * @param Http\IResponse $httpResponse */ public function send(Http\IRequest $httpRequest, Http\IResponse $httpResponse) { $httpResponse->setExpiration(Http\IResponse::PERMANENT); if (($inm = $httpRequest->getHeader('if-none-match')) && $inm == $this->etag) { $httpResponse->setCode(Http\IResponse::S304_NOT_MODIFIED); return; } $httpResponse->setContentType(AssetsLoader\Files\MimeMapper::getMimeFromFilename($this->filePath)); $httpResponse->setHeader('Content-Transfer-Encoding', 'binary'); $httpResponse->setHeader('Content-Length', filesize($this->filePath)); $httpResponse->setHeader('Content-Disposition', 'attachment; filename="' . basename($this->filePath) . '"'); $httpResponse->setHeader('Access-Control-Allow-Origin', '*'); // Read the file readfile($this->filePath); }
/** * Handles incoming request and sets translations. */ private function processRequest() { if ($this->httpRequest->isMethod('post') && $this->httpRequest->isAjax() && $this->httpRequest->getHeader(self::XHR_HEADER)) { $data = json_decode(file_get_contents('php://input')); if ($data) { $this->translator->setCurrentLang($data->{self::LANGUAGE_KEY}); if ($data->{self::NAMESPACE_KEY}) { $this->translator->setNamespace($data->{self::NAMESPACE_KEY}); } unset($data->{self::LANGUAGE_KEY}, $data->{self::NAMESPACE_KEY}); foreach ($data as $string => $translated) { $this->translator->setTranslation($string, $translated); } } exit; } }
/** * Sends response to output. * @return void */ public function send(Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $httpResponse) { $httpResponse->setContentType($this->contentType); $httpResponse->setHeader('Content-Disposition', ($this->forceDownload ? 'attachment' : 'inline') . '; filename="' . $this->name . '"'); $output = NULL; if ($this->precalculateFileSize) { ob_start(); Nette\Utils\Callback::invokeArgs($this->outputGenerator); $output = ob_get_clean(); $filesize = $length = strlen($output); } if ($this->resuming && $this->precalculateFileSize) { $httpResponse->setHeader('Accept-Ranges', 'bytes'); if (preg_match('#^bytes=(\\d*)-(\\d*)\\z#', $httpRequest->getHeader('Range'), $matches)) { list(, $start, $end) = $matches; if ($start === '') { $start = max(0, $filesize - $end); $end = $filesize - 1; } elseif ($end === '' || $end > $filesize - 1) { $end = $filesize - 1; } if ($end < $start) { $httpResponse->setCode(416); // requested range not satisfiable return; } $httpResponse->setCode(206); $httpResponse->setHeader('Content-Range', 'bytes ' . $start . '-' . $end . '/' . $filesize); $length = $end - $start + 1; } else { $httpResponse->setHeader('Content-Range', 'bytes 0-' . ($filesize - 1) . '/' . $filesize); } } if ($this->precalculateFileSize) { $httpResponse->setHeader('Content-Length', $length); } if (isset($start)) { echo substr($output, $start, $length); } elseif (isset($output)) { echo $output; } else { Nette\Utils\Callback::invoke($this->outputGenerator); } }
/** * Create new api response * @param IResource $resource * @param string|null $contentType * @return IResponse * * @throws InvalidStateException */ public function create(IResource $resource, $contentType = NULL) { if ($contentType === NULL) { $contentType = $this->jsonp === FALSE || !$this->request->getQuery($this->jsonp) ? $this->getPreferredContentType($this->request->getHeader('Accept')) : IResource::JSONP; } if (!isset($this->responses[$contentType])) { throw new InvalidStateException('Unregistered API response for ' . $contentType); } if (!class_exists($this->responses[$contentType])) { throw new InvalidStateException('API response class does not exist.'); } if (!$resource->getData()) { $this->response->setCode(204); // No content } $responseClass = $this->responses[$contentType]; $response = new $responseClass($resource->getData(), $this->mapperContext->getMapper($contentType), $contentType); if ($response instanceof BaseResponse) { $response->setPrettyPrint($this->isPrettyPrint()); } return $response; }
/** * Sends response to output. * @return void */ public function send(Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $httpResponse) { $httpResponse->setContentType($this->contentType); $httpResponse->setHeader('Content-Disposition', 'attachment; filename="' . $this->name . '"'); $filesize = $length = filesize($this->file); $handle = fopen($this->file, 'r'); if ($this->resuming) { $httpResponse->setHeader('Accept-Ranges', 'bytes'); $range = $httpRequest->getHeader('Range'); if ($range !== NULL) { $range = substr($range, 6); // 6 == strlen('bytes=') list($start, $end) = explode('-', $range); if ($start == NULL) { $start = 0; } if ($end == NULL) { $end = $filesize - 1; } if ($start < 0 || $end <= $start || $end > $filesize - 1) { $httpResponse->setCode(416); // requested range not satisfiable return; } $httpResponse->setCode(206); $httpResponse->setHeader('Content-Range', 'bytes ' . $start . '-' . $end . '/' . $filesize); $length = $end - $start + 1; fseek($handle, $start); } else { $httpResponse->setHeader('Content-Range', 'bytes 0-' . ($filesize - 1) . '/' . $filesize); } } $httpResponse->setHeader('Content-Length', $length); while (!feof($handle)) { echo fread($handle, 4000000.0); } fclose($handle); }
/** * Sends response to output. * @return void */ public function send(Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $httpResponse) { $httpResponse->setContentType($this->contentType); $httpResponse->setHeader('Content-Disposition', ($this->forceDownload ? 'attachment' : 'inline') . '; filename="' . $this->name . '"' . '; filename*=utf-8\'\'' . rawurlencode($this->name)); $filesize = $length = filesize($this->file); $handle = fopen($this->file, 'r'); if ($this->resuming) { $httpResponse->setHeader('Accept-Ranges', 'bytes'); if (preg_match('#^bytes=(\\d*)-(\\d*)\\z#', $httpRequest->getHeader('Range'), $matches)) { list(, $start, $end) = $matches; if ($start === '') { $start = max(0, $filesize - $end); $end = $filesize - 1; } elseif ($end === '' || $end > $filesize - 1) { $end = $filesize - 1; } if ($end < $start) { $httpResponse->setCode(416); // requested range not satisfiable return; } $httpResponse->setCode(206); $httpResponse->setHeader('Content-Range', 'bytes ' . $start . '-' . $end . '/' . $filesize); $length = $end - $start + 1; fseek($handle, $start); } else { $httpResponse->setHeader('Content-Range', 'bytes 0-' . ($filesize - 1) . '/' . $filesize); } } $httpResponse->setHeader('Content-Length', $length); while (!feof($handle) && $length > 0) { echo $s = fread($handle, min(4000000.0, $length)); $length -= strlen($s); } fclose($handle); }
/** * @param Nette\Http\IRequest $request * @return string */ public function resolveMethod(Nette\Http\IRequest $request) { if (!empty($request->getHeader('X-HTTP-Method-Override'))) { return Strings::upper($request->getHeader('X-HTTP-Method-Override')); } if ($method = Strings::upper($request->getQuery('__apiRouteMethod'))) { if (isset($this->actions[$method])) { return $method; } } return Strings::upper($request->getMethod()); }
/** * Maps HTTP request to a Request object. * * @param IRequest $httpRequest * @return Request * @throws BadRequestException */ public function match(IRequest $httpRequest) { if ($httpRequest->getHeader('Content-type') != 'application/json') { throw new BadRequestException('You can use only JSON!', 415); } $url = $httpRequest->getUrl(); $basePath = str_replace('/', '\\/', $url->getBasePath()); $cleanPath = preg_replace("/^{$basePath}/", '', $url->getPath()); $path = str_replace('/', '\\/', $this->getPath()); $pathRexExp = empty($path) ? "/^.+\$/" : "/^{$path}\\/.*\$/"; if (!preg_match($pathRexExp, $cleanPath)) { return null; } $path = preg_replace('/^' . $path . '\\//', '', $cleanPath); $params = array(); $params['action'] = $this->detectAction($httpRequest); $frags = explode('/', $path); if (count($frags) % 2 === 0) { // Resource ID. $id = array_pop($frags); if (is_numeric($id)) { $params['id'] = $id; } else { $params['specific_action'] = $id; $params['action'] .= ucfirst($id); } } elseif (count($frags) === 3) { $id = array_pop($frags); if (is_numeric($id)) { $params['id'] = $id; $params['specific_action'] = array_pop($frags); $params['action'] .= ucfirst($params['specific_action']); } else { $frags[] = $id; } } if ($params['action'] == 'read' && !@$params['id']) { $params['action'] = 'readAll'; } $presenterName = ucfirst(array_pop($frags)); // Allow to use URLs like domain.tld/presenter.format. if (Strings::match($presenterName, "/.+\\.(json)\$/")) { list($presenterName, $format) = explode('.', $presenterName); } // Associations. $assoc = array(); if (count($frags) > 0 && count($frags) % 2 === 0) { foreach ($frags as $k => $f) { if ($k % 2 !== 0) { continue; } $assoc[$f] = $frags[$k + 1]; } } $params['associations'] = $assoc; $params['query'] = $httpRequest->getQuery(); $params['action'] = $this->path2action($params['action']); $presenterName = $this->path2presenter($presenterName); $presenterName = empty($this->module) ? $presenterName : $this->module . ':' . $presenterName; // Remember absolute URL for ::constructUrl(). It is one way route ;-). $this->requestUrl = $url->getAbsoluteUrl(); return new Request($presenterName, $httpRequest->getMethod(), $params); }
/** * Get authorization token from header - Authorization: Bearer * @return string */ public function getAuthorization() { $authorization = explode(' ', $this->request->getHeader('Authorization')); return isset($authorization[1]) ? $authorization[1] : NULL; }
private function isAmfRequest(Nette\Http\IRequest $request) { return $request->getHeader('Content-type') === 'application/x-amf'; }
/** * @param \Nette\Http\IRequest $request * @return string */ private function detectFormat(IRequest $request) { $header = $request->getHeader('Accept'); // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html foreach ($this->formats as $format => $fullFormatName) { $fullFormatName = Strings::replace($fullFormatName, '/\\//', '\\/'); if (Strings::match($header, "/{$fullFormatName}/")) { return $format; } } // Try retrieve fallback from URL. $path = $request->getUrl()->getPath(); $formats = array_keys($this->formats); $formats = implode('|', $formats); if (Strings::match($path, "/\\.({$formats})\$/")) { list($path, $format) = explode('.', $path); return $format; } return $this->defaultFormat; }
/** * @param MapperContext $mapper * @param IRequest $httpRequest */ public function __construct(MapperContext $mapperContext, IRequest $httpRequest) { $this->mapper = $mapperContext->getMapper($httpRequest->getHeader('content-type')); }
/** * @inheritdoc */ public function getHeader($header, $default = NULL) { return $this->current->getHeader($header, $default); }
/** * Sends response to output. * @return void */ public function send(Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $httpResponse) { $lastMTime = \filemtime($this->getFile()); // Pokud je povoleno cachovani, podrzim to po dobu 14ti dnu (nebo dokud se soubor zmeni) if ($this->isCachingAllowed()) { $httpResponse->setExpiration(time() + 60 * 60 * 24 * 14); $cachedTime = $httpRequest->getHeader('If-Modified-Since'); if ($cachedTime >= $lastMTime) { $httpResponse->setCode(304); return; } } if (!$this->dontSetContentType) { $httpResponse->setContentType($this->getContentType()); } $httpResponse->addHeader("Last-Modified", gmdate("U", $lastMTime)); $httpResponse->setHeader('Content-Disposition', $this->getContentDisposition() . '; filename="' . $this->getName() . '"'); $filesize = $length = filesize($this->getFile()); //$handle = fopen($this->getFile(), 'r'); if (false && $this->resuming) { $httpResponse->setHeader('Accept-Ranges', 'bytes'); $range = $httpRequest->getHeader('Range'); if ($range !== NULL) { $range = substr($range, 6); // 6 == strlen('bytes=') list($start, $end) = explode('-', $range); if ($start == NULL) { $start = 0; } if ($end == NULL) { $end = $filesize - 1; } if ($start < 0 || $end <= $start || $end > $filesize - 1) { $httpResponse->setCode(416); // requested range not satisfiable return; } $httpResponse->setCode(206); $httpResponse->setHeader('Content-Range', 'bytes ' . $start . '-' . $end . '/' . $filesize); $length = $end - $start + 1; fseek($handle, $start); } else { $httpResponse->setHeader('Content-Range', 'bytes 0-' . ($filesize - 1) . '/' . $filesize); } } $httpResponse->setHeader('Content-Length', $length); readfile($this->getFile()); //while(!feof($handle)) { // echo fread($handle, 4e6); //} //fclose($handle); }
/** * Get request hash * @return string */ protected function getRequestedHash() { return $this->request->getHeader(self::AUTH_HEADER); }
/** * Send headers and outputs PDF document to browser. * @throws InvalidStateException */ public function send(Http\IRequest $httpRequest, Http\IResponse $httpResponse) { $this->convert(); $output = fgets($this->pipes[1], 5); if ($output === '%PDF') { $httpResponse->setContentType('application/pdf'); if (strpos($httpRequest->getHeader('User-Agent'), 'MSIE') != FALSE) { $httpResponse->setHeader('Pragma', 'private'); $httpResponse->setHeader('Cache-control', 'private'); $httpResponse->setHeader('Accept-Ranges', 'bytes'); $httpResponse->setExpiration('- 5 years'); } echo $output; fpassthru($this->pipes[1]); } $this->close(); }