/** * Return a new JSON response from the application. * Inject some headers * * @param string|array $data * @param int $status * @param array $headers * @return \Illuminate\Http\JsonResponse */ public static function json($data = array(), $status = 200, array $headers = array(), $options = 0) { $etagMatch = false; $headersToExpose = array(); if (array_key_exists('ETag', $headers)) { $headersToExpose[] = 'ETag'; // Empty the data if If-None-Match header match with ETag value $requestEtags = IlluminateRequest::getETags(); if (!empty($requestEtags)) { foreach ($requestEtags as $etag) { if ($headers['ETag'] == $etag) { $etagMatch = true; $data = array(); break; } } } unset($requestEtags); } if (array_key_exists('Link', $headers)) { $headersToExpose[] = 'Link'; } if (array_key_exists('X-Rate-Limit-Limit', $headers)) { $headersToExpose[] = 'X-Rate-Limit-Limit'; } if (array_key_exists('X-Rate-Limit-Remaining', $headers)) { $headersToExpose[] = 'X-Rate-Limit-Remaining'; } if (array_key_exists('X-Rate-Limit-Reset', $headers)) { $headersToExpose[] = 'X-Rate-Limit-Reset'; } $headers['Access-Control-Expose-Headers'] = implode(', ', $headersToExpose); if ($etagMatch) { $response = parent::make('', 304, $headers); } else { $response = parent::json($data, $status, $headers); } $response->setCharset('utf-8'); if (array_key_exists('ETag', $headers)) { $response->setCache(array('etag' => $headers['ETag'])); } return $response; }