Вход Регистрация
Файл: monst/Xsolla/Symfony/Component/HttpFoundation/ResponseHeaderBag.php
Строк: 318
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentHttpFoundation;

/**
 * ResponseHeaderBag is a container for Response HTTP headers.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ResponseHeaderBag extends HeaderBag
{
    const 
COOKIES_FLAT 'flat';
    const 
COOKIES_ARRAY 'array';

    const 
DISPOSITION_ATTACHMENT 'attachment';
    const 
DISPOSITION_INLINE 'inline';

    
/**
     * @var array
     */
    
protected $computedCacheControl = array();

    
/**
     * @var array
     */
    
protected $cookies = array();

    
/**
     * @var array
     */
    
protected $headerNames = array();

    
/**
     * Constructor.
     *
     * @param array $headers An array of HTTP headers
     */
    
public function __construct(array $headers = array())
    {
        
parent::__construct($headers);

        if (!isset(
$this->headers['cache-control'])) {
            
$this->set('Cache-Control''');
        }
    }

    
/**
     * Returns the headers, with original capitalizations.
     *
     * @return array An array of headers
     */
    
public function allPreserveCase()
    {
        
$headers = array();
        foreach (
$this->all() as $name => $value) {
            
$headers[isset($this->headerNames[$name]) ? $this->headerNames[$name] : $name] = $value;
        }

        return 
$headers;
    }

    public function 
allPreserveCaseWithoutCookies()
    {
        
$headers $this->allPreserveCase();
        if (isset(
$this->headerNames['set-cookie'])) {
            unset(
$headers[$this->headerNames['set-cookie']]);
        }

        return 
$headers;
    }

    
/**
     * {@inheritdoc}
     */
    
public function replace(array $headers = array())
    {
        
$this->headerNames = array();

        
parent::replace($headers);

        if (!isset(
$this->headers['cache-control'])) {
            
$this->set('Cache-Control''');
        }
    }

    
/**
     * {@inheritdoc}
     */
    
public function all()
    {
        
$headers parent::all();
        foreach (
$this->getCookies() as $cookie) {
            
$headers['set-cookie'][] = (string) $cookie;
        }

        return 
$headers;
    }

    
/**
     * {@inheritdoc}
     */
    
public function set($key$values$replace true)
    {
        
$uniqueKey str_replace('_''-'strtolower($key));

        if (
'set-cookie' === $uniqueKey) {
            if (
$replace) {
                
$this->cookies = array();
            }
            foreach ((array) 
$values as $cookie) {
                
$this->setCookie(Cookie::fromString($cookie));
            }
            
$this->headerNames[$uniqueKey] = $key;

            return;
        }

        
$this->headerNames[$uniqueKey] = $key;

        
parent::set($key$values$replace);

        
// ensure the cache-control header has sensible defaults
        
if (in_array($uniqueKey, array('cache-control''etag''last-modified''expires'))) {
            
$computed $this->computeCacheControlValue();
            
$this->headers['cache-control'] = array($computed);
            
$this->headerNames['cache-control'] = 'Cache-Control';
            
$this->computedCacheControl $this->parseCacheControl($computed);
        }
    }

    
/**
     * {@inheritdoc}
     */
    
public function remove($key)
    {
        
$uniqueKey str_replace('_''-'strtolower($key));
        unset(
$this->headerNames[$uniqueKey]);

        if (
'set-cookie' === $uniqueKey) {
            
$this->cookies = array();

            return;
        }

        
parent::remove($key);

        if (
'cache-control' === $uniqueKey) {
            
$this->computedCacheControl = array();
        }
    }

    
/**
     * {@inheritdoc}
     */
    
public function hasCacheControlDirective($key)
    {
        return 
array_key_exists($key$this->computedCacheControl);
    }

    
/**
     * {@inheritdoc}
     */
    
public function getCacheControlDirective($key)
    {
        return 
array_key_exists($key$this->computedCacheControl) ? $this->computedCacheControl[$key] : null;
    }

    
/**
     * Sets a cookie.
     *
     * @param Cookie $cookie
     */
    
public function setCookie(Cookie $cookie)
    {
        
$this->cookies[$cookie->getDomain()][$cookie->getPath()][$cookie->getName()] = $cookie;
        
$this->headerNames['set-cookie'] = 'Set-Cookie';
    }

    
/**
     * Removes a cookie from the array, but does not unset it in the browser.
     *
     * @param string $name
     * @param string $path
     * @param string $domain
     */
    
public function removeCookie($name$path '/'$domain null)
    {
        if (
null === $path) {
            
$path '/';
        }

        unset(
$this->cookies[$domain][$path][$name]);

        if (empty(
$this->cookies[$domain][$path])) {
            unset(
$this->cookies[$domain][$path]);

            if (empty(
$this->cookies[$domain])) {
                unset(
$this->cookies[$domain]);
            }
        }

        if (empty(
$this->cookies)) {
            unset(
$this->headerNames['set-cookie']);
        }
    }

    
/**
     * Returns an array with all cookies.
     *
     * @param string $format
     *
     * @return array
     *
     * @throws InvalidArgumentException When the $format is invalid
     */
    
public function getCookies($format self::COOKIES_FLAT)
    {
        if (!
in_array($format, array(self::COOKIES_FLATself::COOKIES_ARRAY))) {
            throw new 
InvalidArgumentException(sprintf('Format "%s" invalid (%s).'$formatimplode(', ', array(self::COOKIES_FLATself::COOKIES_ARRAY))));
        }

        if (
self::COOKIES_ARRAY === $format) {
            return 
$this->cookies;
        }

        
$flattenedCookies = array();
        foreach (
$this->cookies as $path) {
            foreach (
$path as $cookies) {
                foreach (
$cookies as $cookie) {
                    
$flattenedCookies[] = $cookie;
                }
            }
        }

        return 
$flattenedCookies;
    }

    
/**
     * Clears a cookie in the browser.
     *
     * @param string $name
     * @param string $path
     * @param string $domain
     * @param bool   $secure
     * @param bool   $httpOnly
     */
    
public function clearCookie($name$path '/'$domain null$secure false$httpOnly true)
    {
        
$this->setCookie(new Cookie($namenull1$path$domain$secure$httpOnly));
    }

    
/**
     * Generates a HTTP Content-Disposition field-value.
     *
     * @param string $disposition      One of "inline" or "attachment"
     * @param string $filename         A unicode string
     * @param string $filenameFallback A string containing only ASCII characters that
     *                                 is semantically equivalent to $filename. If the filename is already ASCII,
     *                                 it can be omitted, or just copied from $filename
     *
     * @return string A string suitable for use as a Content-Disposition field-value
     *
     * @throws InvalidArgumentException
     *
     * @see RFC 6266
     */
    
public function makeDisposition($disposition$filename$filenameFallback '')
    {
        if (!
in_array($disposition, array(self::DISPOSITION_ATTACHMENTself::DISPOSITION_INLINE))) {
            throw new 
InvalidArgumentException(sprintf('The disposition must be either "%s" or "%s".'self::DISPOSITION_ATTACHMENTself::DISPOSITION_INLINE));
        }

        if (
'' == $filenameFallback) {
            
$filenameFallback $filename;
        }

        
// filenameFallback is not ASCII.
        
if (!preg_match('/^[x20-x7e]*$/'$filenameFallback)) {
            throw new 
InvalidArgumentException('The filename fallback must only contain ASCII characters.');
        }

        
// percent characters aren't safe in fallback.
        
if (false !== strpos($filenameFallback'%')) {
            throw new 
InvalidArgumentException('The filename fallback cannot contain the "%" character.');
        }

        
// path separators aren't allowed in either.
        
if (false !== strpos($filename'/') || false !== strpos($filename'\') || false !== strpos($filenameFallback, '/') || false !== strpos($filenameFallback, '\')) {
            throw new InvalidArgumentException('
The filename and the fallback cannot contain the "/" and "\" characters.');
        }

        
$output = sprintf('%s; filename="%s"', $disposition, str_replace('"', '\"', $filenameFallback));

        if (
$filename !== $filenameFallback) {
            
$output .= sprintf("filename*=utf-8''%s", rawurlencode($filename));
        }

        return 
$output;
    }

    /**
     * Returns the calculated value of the cache-control header.
     *
     * This considers several other headers and calculates or modifies the
     * cache-control header to a sensible, conservative value.
     *
     * @return string
     */
    protected function computeCacheControlValue()
    {
        if (!
$this->cacheControl && !$this->has('ETag') && !$this->has('Last-Modified') && !$this->has('Expires')) {
            return 'no-cache, private';
        }

        if (!
$this->cacheControl) {
            // conservative by default
            return 'private, must-revalidate';
        }

        
$header = $this->getCacheControlHeader();
        if (isset(
$this->cacheControl['public']) || isset($this->cacheControl['private'])) {
            return 
$header;
        }

        // public if s-maxage is defined, private otherwise
        if (!isset(
$this->cacheControl['s-maxage'])) {
            return 
$header.', private';
        }

        return 
$header;
    }
}
Онлайн: 1
Реклама