/** * Parses the header retrieved from the cURL response into * our Response object. * * @param array $headers */ protected function setResponseHeaders(array $headers = []) { foreach ($headers as $header) { if (($pos = strpos($header, ':')) !== false) { $title = substr($header, 0, $pos); $value = substr($header, $pos + 1); $this->response->setHeader($title, $value); } else { if (substr($header, 0, 4) == 'HTTP') { preg_match('#^HTTP\\/([12]\\.[01]) ([0-9]+) (.+)#', $header, $matches); if (isset($matches[1])) { $this->response->setProtocolVersion($matches[1]); } if (isset($matches[2])) { $this->response->setStatusCode($matches[2], isset($matches[3]) ? $matches[3] : null); } } } } }
/** * Adds a directive and it's options to the appropriate header. The $values * array might have options that are geared toward either the regular or the * reportOnly header, since it's viable to have both simultaneously. * * @param string $name * @param array|string|null $values * @param ResponseInterface $response */ protected function addToHeader(string $name, $values = null, ResponseInterface &$response) { if (empty($values)) { // It's possible that directives like 'sandbox' will not // have any values passed in, so add them to the main policy. $response->appendHeader('Content-Security-Policy', $name); return; } if (is_string($values)) { $values = [$values => 0]; } $sources = []; $reportSources = []; foreach ($values as $value => $reportOnly) { if (is_numeric($value) && is_string($reportOnly) && !empty($reportOnly)) { $value = $reportOnly; $reportOnly = 0; } if ($reportOnly === true) { $reportSources[] = in_array($value, $this->validSources) ? "'{$value}'" : $value; } else { if (strpos($value, 'nonce-') === 0) { $sources[] = "'{$value}'"; } else { $sources[] = in_array($value, $this->validSources) ? "'{$value}'" : $value; } } } if (count($sources)) { $response->appendHeader('Content-Security-Policy', $name . ' ' . implode(' ', $sources)); } if (count($reportSources)) { $response->appendHeader('Content-Security-Policy-Report-Only', $name . ' ' . implode(' ', $reportSources)); } }