public function composeHeaders(RestException $e = null) { //only GET method should be cached if allowed by API developer $expires = $this->requestMethod == 'GET' ? Defaults::$headerExpires : 0; if (!is_array(Defaults::$headerCacheControl)) { Defaults::$headerCacheControl = array(Defaults::$headerCacheControl); } $cacheControl = Defaults::$headerCacheControl[0]; if ($expires > 0) { $cacheControl = $this->apiMethodInfo->accessLevel ? 'private, ' : 'public, '; $cacheControl .= end(Defaults::$headerCacheControl); $cacheControl = str_replace('{expires}', $expires, $cacheControl); $expires = gmdate('D, d M Y H:i:s \\G\\M\\T', time() + $expires); } @header('Cache-Control: ' . $cacheControl); @header('Expires: ' . $expires); @header('X-Powered-By: Luracast Restler v' . Restler::VERSION); if (Defaults::$crossOriginResourceSharing && isset($_SERVER['HTTP_ORIGIN'])) { header('Access-Control-Allow-Origin: ' . (Defaults::$accessControlAllowOrigin == '*' ? $_SERVER['HTTP_ORIGIN'] : Defaults::$accessControlAllowOrigin)); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Max-Age: 86400'); } $this->responseFormat->setCharset(Defaults::$charset); $charset = $this->responseFormat->getCharset() ?: Defaults::$charset; @header('Content-Type: ' . (Defaults::$useVendorMIMEVersioning ? 'application/vnd.' . Defaults::$apiVendor . "-v{$this->requestedApiVersion}" . '+' . $this->responseFormat->getExtension() : $this->responseFormat->getMIME()) . '; charset=' . $charset); @header('Content-Language: ' . Defaults::$language); if (isset($this->apiMethodInfo->metadata['header'])) { foreach ($this->apiMethodInfo->metadata['header'] as $header) { @header($header, true); } } $code = 200; if (!Defaults::$suppressResponseCode) { if ($e) { $code = $e->getCode(); } elseif (isset($this->apiMethodInfo->metadata['status'])) { $code = $this->apiMethodInfo->metadata['status']; } } $this->responseCode = $code; @header("{$_SERVER['SERVER_PROTOCOL']} {$code} " . (isset(RestException::$codes[$code]) ? RestException::$codes[$code] : '')); }
/** * Encodes the response in the preferred format and sends back. * * @param mixed $data array or scalar value or iValueObject or null * @param int $statusCode * @param string|null $statusMessage */ public function sendData($data, $statusCode = 0, $statusMessage = null) { //$this->log []= ob_get_clean (); //only GET method should be cached if allowed by API developer $expires = $this->requestMethod == 'GET' ? Defaults::$headerExpires : 0; $cacheControl = Defaults::$headerCacheControl[0]; if ($expires > 0) { $cacheControl = $this->apiMethodInfo->accessLevel ? 'private, ' : 'public, '; $cacheControl .= end(Defaults::$headerCacheControl); $cacheControl = str_replace('{expires}', $expires, $cacheControl); $expires = gmdate('D, d M Y H:i:s \\G\\M\\T', time() + $expires); } @header('Cache-Control: ' . $cacheControl); @header('Expires: ' . $expires); @header('X-Powered-By: Luracast Restler v' . Restler::VERSION); if (Defaults::$crossOriginResourceSharing && isset($_SERVER['HTTP_ORIGIN'])) { header('Access-Control-Allow-Origin: ' . (Defaults::$accessControlAllowOrigin == '*' ? $_SERVER['HTTP_ORIGIN'] : Defaults::$accessControlAllowOrigin)); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Max-Age: 86400'); } if (isset($this->apiMethodInfo->metadata['header'])) { foreach ($this->apiMethodInfo->metadata['header'] as $header) { @header($header, true); } } /** * * @var iRespond DefaultResponder */ $responder = Util::setProperties(Defaults::$responderClass, isset($this->apiMethodInfo->metadata) ? $this->apiMethodInfo->metadata : null); if ($statusCode == 0) { if (isset($this->apiMethodInfo->metadata['status'])) { $this->setStatus($this->apiMethodInfo->metadata['status']); } $data = $responder->formatResponse($data); $data = $this->responseFormat->encode($data, !$this->productionMode); $postProcess = '_' . $this->apiMethod . '_' . $this->responseFormat->getExtension(); if (isset($this->apiClassInstance) && method_exists($this->apiClassInstance, $postProcess)) { $data = call_user_func(array($this->apiClassInstance, $postProcess), $data); } } else { $message = RestException::$codes[$statusCode] . (empty($statusMessage) ? '' : ': ' . $statusMessage); $this->setStatus($statusCode); $data = $this->responseFormat->encode($responder->formatError($statusCode, $message), !$this->productionMode); } $this->responseFormat->setCharset(Defaults::$charset); $charset = $this->responseFormat->getCharset() ?: Defaults::$charset; @header('Content-Type: ' . (Defaults::$useVendorMIMEVersioning ? 'application/vnd.' . Defaults::$apiVendor . "-v{$this->requestedApiVersion}" . '+' . $this->responseFormat->getExtension() : $this->responseFormat->getMIME()) . '; charset=' . $charset); @header('Content-Language: ' . Defaults::$language); //handle throttling if (Defaults::$throttle) { $elapsed = time() - $this->startTime; if (Defaults::$throttle / 1000.0 > $elapsed) { usleep(1000000.0 * (Defaults::$throttle / 1000.0 - $elapsed)); } } die($data); }
public function composeHeaders(RestException $e = null) { //only GET method should be cached if allowed by API developer $expires = $this->requestMethod == 'GET' ? Defaults::$headerExpires : 0; if (!is_array(Defaults::$headerCacheControl)) { Defaults::$headerCacheControl = array(Defaults::$headerCacheControl); } $cacheControl = Defaults::$headerCacheControl[0]; if ($expires > 0) { $cacheControl = $this->apiMethodInfo->accessLevel ? 'private, ' : 'public, '; $cacheControl .= end(Defaults::$headerCacheControl); $cacheControl = str_replace('{expires}', $expires, $cacheControl); $expires = gmdate('D, d M Y H:i:s \\G\\M\\T', time() + $expires); } $this->headerData->set(new HeaderKey('Cache-Control', $cacheControl)); $this->headerData->set(new HeaderKey('Expires', $expires)); $this->headerData->set(new HeaderKey('X-Powered-By', 'Luracast Restler v' . Restler::VERSION)); $server_origin = null; if (is_null($this->requestFromObject)) { if (\array_key_exists('HTTP_ORIGIN', $_SERVER)) { $server_origin = $_SERVER['HTTP_ORIGIN']; } } else { $server_origin = $this->requestFromObject->getHeader()->get('Origin'); if (!is_null($server_origin)) { $server_origin = $server_origin->getValue(); } } if (Defaults::$crossOriginResourceSharing && !is_null($server_origin)) { $this->headerData->set(new HeaderKey('Access-Control-Allow-Origin', Defaults::$accessControlAllowOrigin == '*' ? $server_origin : Defaults::$accessControlAllowOrigin)); $this->headerData->set(new HeaderKey('Access-Control-Allow-Credentials', 'true')); $this->headerData->set(new HeaderKey('Access-Control-Max-Age', '86400')); } $this->responseFormat->setCharset(Defaults::$charset); $charset = $this->responseFormat->getCharset() ?: Defaults::$charset; $this->headerData->set(new HeaderKey('Content-Type', (Defaults::$useVendorMIMEVersioning ? 'application/vnd.' . Defaults::$apiVendor . "-v{$this->requestedApiVersion}" . '+' . $this->responseFormat->getExtension() : $this->responseFormat->getMIME()) . '; charset=' . $charset)); $this->headerData->set(new HeaderKey('Content-Language', Defaults::$language)); if (isset($this->apiMethodInfo->metadata['header'])) { foreach ($this->apiMethodInfo->metadata['header'] as $header) { if (strpos(':', $header) !== false) { $header = \explode(':', $header); $this->headerData->set(new HeaderKey($header[0], $header[1]), true); continue; } $this->headerData->set(new HeaderKey(null, $header), true); } } $code = 200; if (!Defaults::$suppressResponseCode) { if ($e) { $code = $e->getCode(); } elseif (isset($this->apiMethodInfo->metadata['status'])) { $code = $this->apiMethodInfo->metadata['status']; } } $this->responseCode = $code; if (is_null($this->requestFromObject)) { $this->headerData->setVersion($_SERVER['SERVER_PROTOCOL']); } else { $this->headerData->setVersion($this->requestFromObject->getVersion()); } $this->headerData->setStatusCode($code); }