public function serve($app) { $fileType = $app->request()->format(); $filePath = null; $filename = (string) $app->parameters()->path . ($fileType ? '.' . $fileType : ''); if ($fileType == 'css' || $fileType == 'js') { $data = $app->getService('assets')->compileFile($filename, !(bool) $app->parameters()->body); if ($data) { $filePath = $data['tempFilePath']; } } else { $file = $app->getService('assets')->findFile($filename); if ($file) { $filePath = $file->originalFilePath(); } } $response = $app->response(); if ($filePath) { $mtime = filemtime($filePath); $etag = md5($filePath . $mtime); if ($this->notModified($filePath, $etag)) { $this->setNotModifiedHeaders($response); return; } $response->addHeader('Last-Modified', date('D, d M Y H:i:s T'))->addHeader('ETag', $etag)->addHeader('Cache-control', 'public, must-revalidate')->setBody(file_get_contents($filePath))->setContentType(MimeTypes::getMimeType($fileType)); } else { $response->setStatus(404); } }
protected function setDefaultContentType($controller) { if (!$controller->response()->contentType()) { $controller->response()->setContentType(MimeTypes::getMimeType($controller->request()->format())); } }
/** * Attempts to serialize $var according to $format, setting the * proper content type and returning the serialization. * TODO: improve content type. * * @return string */ public function renderSerialized($var, $format) { if (is_string($var)) { $serialized = $var; } elseif (is_object($var)) { $toMethod = 'to' . ucFirst($format); if ($var instanceof \Rails\ActiveRecord\Relation) { $serialized = $var->records()->{$toMethod}(); } else { if (is_callable([$var, $toMethod])) { $serialized = $var->{$toMethod}(); } } } elseif (is_array($var)) { if ($format == 'json') { $serialized = json_encode($var); } } if (!isset($serialized)) { if (is_object($var)) { $message = sprintf("Can't serialize object of class %s to format %s", get_class($var), $format); } else { $message = sprintf("Can't serialize variable of type %s to format %s", gettype($var), $format); } throw new Exception\RuntimeException($message); } $this->controller->response()->setContentType(MimeTypes::getMimeType($format)); return $serialized; }