renamed RequestBag to ParameterBag, added HeaderBag, changed the Response to use the new HeaderBag, added a class to manage the Cache-Control header

This commit is contained in:
Fabien Potencier 2010-05-03 11:40:23 +02:00
parent b3a6c6f346
commit c34da5d6c4
14 changed files with 598 additions and 221 deletions

View File

@ -0,0 +1,277 @@
<?php
namespace Symfony\Components\RequestHandler;
/*
* This file is part of the Symfony framework.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
/**
* CacheControl is a wrapper for the Cache-Control HTTP header.
*
* This class knows about allowed attributes
* (and those that only apply to requests or responses).
*
* @package Symfony
* @subpackage Components_RequestHandler
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
class CacheControl
{
protected $bag;
protected $attributes;
protected $type;
/**
* Constructor.
*
* @param Symfony\Components\RequestHandler\HeaderBag $bag A HeaderBag instance
* @param string $header The value of the Cache-Control HTTP header
* @param string $type The type (null, request, or response)
*/
public function __construct(HeaderBag $bag, $header, $type = null)
{
$this->bag = $bag;
$this->attributes = $this->parse($header);
if (null !== $type && !in_array($type, array('request', 'response')))
{
throw new \InvalidArgumentException(sprintf('The "%s" type is not supported by the CacheControl constructor.', $type));
}
$this->type = $type;
}
public function __toString()
{
$parts = array();
ksort($this->attributes);
foreach ($this->attributes as $key => $value)
{
if (true === $value)
{
$parts[] = $key;
}
else
{
if (preg_match('#[^a-zA-Z0-9._-]#', $value))
{
$value = '"'.$value.'"';
}
$parts[] = "$key=$value";
}
}
return implode(',', $parts);
}
public function getMaxStale()
{
$this->checkAttribute('max-stale', 'request');
return array_key_exists('max-stale', $this->attributes) ? $this->attributes['max-stale'] : false;
}
public function setMaxStale($value)
{
$this->checkAttribute('max-stale', 'request');
$this->setValue('max-stale', $value);
}
public function getMinFresh()
{
$this->checkAttribute('min-fresh', 'request');
return array_key_exists('min-fresh', $this->attributes) ? $this->attributes['min-fresh'] : false;
}
public function setMinFresh($value)
{
$this->checkAttribute('min-fresh', 'request');
$this->setValue('min-fresh', $value);
}
public function isOnlyIfCached()
{
$this->checkAttribute('only-if-cached', 'request');
return array_key_exists('only-if-cached', $this->attributes);
}
public function setOnlyIfCached($value)
{
$this->checkAttribute('only-if-cached', 'request');
$this->setValue('only-if-cached', $value, true);
}
public function isPublic()
{
$this->checkAttribute('public', 'response');
return array_key_exists('public', $this->attributes);
}
public function setPublic($value)
{
$this->checkAttribute('public', 'response');
$this->setValue('public', $value, true);
}
public function isPrivate()
{
$this->checkAttribute('private', 'response');
return array_key_exists('private', $this->attributes);
}
public function getPrivate()
{
$this->checkAttribute('private', 'response');
return array_key_exists('private', $this->attributes) ? $this->attributes['private'] : false;
}
public function setPrivate($value)
{
$this->checkAttribute('private', 'response');
$this->setValue('private', $value, true);
}
public function isNoCache()
{
return array_key_exists('no-cache', $this->attributes);
}
public function getNoCache()
{
return array_key_exists('no-cache', $this->attributes) ? $this->attributes['no-cache'] : false;
}
public function setNoCache($value)
{
$this->setValue('no-cache', $value, true);
}
public function isNoStore()
{
return array_key_exists('no-store', $this->attributes);
}
public function setNoStore($value)
{
$this->setValue('no-store', $value, true);
}
public function isNoTransform()
{
return array_key_exists('no-tranform', $this->attributes);
}
public function setNoTransform($value)
{
$this->setValue('no-transform', $value, true);
}
public function getMaxAge()
{
return array_key_exists('max-age', $this->attributes) ? $this->attributes['max-age'] : null;
}
public function setMaxAge($age)
{
$this->setValue('max-age', (integer) $age);
}
public function getSharedMaxAge()
{
$this->checkAttribute('s-maxage', 'response');
return array_key_exists('s-maxage', $this->attributes) ? $this->attributes['s-maxage'] : null;
}
public function setSharedMaxAge($age)
{
$this->checkAttribute('s-maxage', 'response');
$this->setValue('s-maxage', (integer) $age);
}
public function mustRevalidate()
{
$this->checkAttribute('must-revalidate', 'response');
return array_key_exists('must-revalidate', $this->attributes);
}
public function setMustRevalidate($value)
{
$this->checkAttribute('must-revalidate', 'response');
$this->setValue('must-revalidate', $value);
}
public function mustProxyRevalidate()
{
$this->checkAttribute('proxy-revalidate', 'response');
return array_key_exists('proxy-revalidate', $this->attributes);
}
public function setProxyRevalidate($value)
{
$this->checkAttribute('proxy-revalidate', 'response');
$this->setValue('proxy-revalidate', $value);
}
/**
* Parses a Cache-Control HTTP header.
*
* @param string $header The value of the Cache-Control HTTP header
*
* @param array An array representing the attribute values
*/
protected function parse($header)
{
$attributes = array();
preg_match_all('#([a-zA-Z][a-zA-Z_-]*)\s*(?:=(?:"([^"]*)"|([^ \t",;]*)))?#', $header, $matches, PREG_SET_ORDER);
foreach ($matches as $match)
{
$attributes[strtolower($match[1])] = isset($match[2]) && $match[2] ? $match[2] : (isset($match[3]) ? $match[3] : true);
}
return $attributes;
}
protected function setValue($key, $value, $isBoolean = false)
{
if (false === $value)
{
unset($this->attributes[$key]);
}
else
{
$this->attributes[$key] = $isBoolean ? true : $value;
}
$this->bag->set('Cache-Control', (string) $this);
}
protected function checkAttribute($name, $expected)
{
if (null !== $this->type && $expected !== $this->type)
{
throw new \LogicException(sprintf("The property %s only applies to the %s Cache-Control.", $name, $expected));
}
}
}

View File

@ -0,0 +1,134 @@
<?php
namespace Symfony\Components\RequestHandler;
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/**
* HeaderBag is a ParameterBag optimized to hold header HTTP headers.
*
* @package Symfony
* @subpackage Components_RequestHandler
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
class HeaderBag extends ParameterBag
{
protected $cacheControl;
protected $type;
/**
* Replaces the current HTTP headers by a new set.
*
* @param array $parameters An array of HTTP headers
* @param string $type The type (null, request, or response)
*/
public function replace(array $parameters = array(), $type = null)
{
$this->cacheControl = null;
$this->parameters = array();
foreach ($parameters as $key => $value)
{
$this->parameters[strtr(strtolower($key), '_', '-')] = $value;
}
if (null !== $type && !in_array($type, array('request', 'response')))
{
throw new \InvalidArgumentException(sprintf('The "%s" type is not supported by the HeaderBag constructor.', $type));
}
$this->type = $type;
}
/**
* Returns a header value by name.
*
* @param string $key The key
* @param mixed $default The default value
*/
public function get($key, $default = null)
{
$key = strtr(strtolower($key), '_', '-');
return array_key_exists($key, $this->parameters) ? $this->parameters[$key] : $default;
}
/**
* Sets a header by name.
*
* @param string $key The key
* @param mixed $value The value
* @param Boolean $replace Whether to replace the actual value of not (true by default)
*/
public function set($key, $value, $replace = true)
{
$key = strtr(strtolower($key), '_', '-');
if (false === $replace)
{
$current = $this->get($key, '');
$value = ($current ? $current.', ' : '').$value;
}
$this->parameters[$key] = $value;
if ('cache-control' == $key)
{
$this->cacheControl = null;
}
}
/**
* Returns true if the HTTP header is defined.
*
* @param string $key The HTTP header
*
* @return Boolean true if the parameter exists, false otherwise
*/
public function has($key)
{
return array_key_exists(strtr(strtolower($key), '_', '-'), $this->parameters);
}
/**
* Deletes a header.
*
* @param string $key The HTTP header name
*/
public function delete($key)
{
unset($this->parameters[strtr(strtolower($key), '_', '-')]);
}
/**
* Returns an instance able to manage the Cache-Control header.
*
* @return Symfony\Components\RequestHandler\Cache\CacheControl A CacheControl instance
*/
public function getCacheControl()
{
if (null === $this->cacheControl)
{
$this->cacheControl = new CacheControl($this, $this->get('Cache-Control'), $this->type);
}
return $this->cacheControl;
}
/**
* Normalizes a HTTP header name.
*
* @param string $key The HTTP header name
*
* @return string The normalized HTTP header name
*/
static public function normalizeHeaderName($key)
{
return strtr(strtolower($key), '_', '-');
}
}

View File

@ -12,34 +12,44 @@ namespace Symfony\Components\RequestHandler;
*/ */
/** /**
* RequestBag is a container for key/value pairs. * ParameterBag is a container for key/value pairs.
* *
* @package Symfony * @package Symfony
* @subpackage Components_RequestHandler * @subpackage Components_RequestHandler
* @author Fabien Potencier <fabien.potencier@symfony-project.com> * @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/ */
class RequestBag class ParameterBag
{ {
protected $input; protected $parameters;
public function __construct($input) /**
* Constructor.
*
* @param array $parameters An array of parameters
*/
public function __construct(array $parameters = array())
{ {
$this->replace($input); $this->replace($parameters);
} }
/** /**
* Returns the input. * Returns the parameters.
* *
* @return array An array of input * @return array An array of parameters
*/ */
public function all() public function all()
{ {
return $this->input; return $this->parameters;
} }
public function replace($input) /**
* Replaces the current parameters by a new set.
*
* @param array $parameters An array of parameters
*/
public function replace(array $parameters = array())
{ {
$this->input = $input; $this->parameters = $parameters;
} }
/** /**
@ -50,7 +60,7 @@ class RequestBag
*/ */
public function get($key, $default = null) public function get($key, $default = null)
{ {
return array_key_exists($key, $this->input) ? $this->input[$key] : $default; return array_key_exists($key, $this->parameters) ? $this->parameters[$key] : $default;
} }
/** /**
@ -59,14 +69,21 @@ class RequestBag
* @param string $key The key * @param string $key The key
* @param mixed $value The value * @param mixed $value The value
*/ */
public function set($key, $value) public function set($key, $value, $replace = true)
{ {
$this->input[$key] = $value; $this->parameters[$key] = $value;
} }
/**
* Returns true if the parameter is defined.
*
* @param string $key The key
*
* @return Boolean true if the parameter exists, false otherwise
*/
public function has($key) public function has($key)
{ {
return array_key_exists($key, $this->input); return array_key_exists($key, $this->parameters);
} }
/** /**
@ -76,7 +93,7 @@ class RequestBag
*/ */
public function delete($key) public function delete($key)
{ {
unset($this->input[$key]); unset($this->parameters[$key]);
} }
/** /**
@ -130,4 +147,19 @@ class RequestBag
{ {
return (int) $this->get($key, $default); return (int) $this->get($key, $default);
} }
public function getDate($key, \DateTime $default = null)
{
if (null === $value = $this->get($key))
{
return $default;
}
if (false === $date = \DateTime::createFromFormat(DATE_RFC2822, $value))
{
throw new \RuntimeException(sprintf('The %s HTTP header is not parseable (%s).', $key, $value));
}
return $date;
}
} }

View File

@ -12,12 +12,7 @@ namespace Symfony\Components\RequestHandler;
*/ */
/** /**
* Request is the base implementation of a user request. * Request represents an HTTP request.
*
* After initialization, the request is read-only. The only writable
* values are the query ones (mostly by the router).
*
* You can reinitialize the request by calling the initialize() method.
* *
* @package Symfony * @package Symfony
* @subpackage Components_RequestHandler * @subpackage Components_RequestHandler
@ -75,13 +70,13 @@ class Request
*/ */
public function initialize(array $query = null, array $request = null, array $path = null, array $cookies = null, array $files = null, array $server = null) public function initialize(array $query = null, array $request = null, array $path = null, array $cookies = null, array $files = null, array $server = null)
{ {
$this->request = new RequestBag(null !== $request ? $request : $_POST); $this->request = new ParameterBag(null !== $request ? $request : $_POST);
$this->query = new RequestBag(null !== $query ? $query : $_GET); $this->query = new ParameterBag(null !== $query ? $query : $_GET);
$this->path = new RequestBag(null !== $path ? $path : array()); $this->path = new ParameterBag(null !== $path ? $path : array());
$this->cookies = new RequestBag(null !== $cookies ? $cookies : $_COOKIE); $this->cookies = new ParameterBag(null !== $cookies ? $cookies : $_COOKIE);
$this->files = new RequestBag($this->convertFileInformation(null !== $files ? $files : $_FILES)); $this->files = new ParameterBag($this->convertFileInformation(null !== $files ? $files : $_FILES));
$this->server = new RequestBag(null !== $server ? $server : $_SERVER); $this->server = new HeaderBag(null !== $server ? $server : $_SERVER, 'request');
$this->headers = new RequestBag($this->initializeHeaders()); $this->headers = new HeaderBag($this->initializeHeaders(), 'request');
$this->languages = null; $this->languages = null;
$this->charsets = null; $this->charsets = null;
@ -107,12 +102,26 @@ class Request
* *
* @return Request A Request instance * @return Request A Request instance
*/ */
static public function createFromUri($uri, $method = 'get', $parameters = array(), $cookies = array(), $files = array(), $server = array()) static public function create($uri, $method = 'get', $parameters = array(), $cookies = array(), $files = array(), $server = array())
{ {
if (in_array($method, array('post', 'put', 'delete'))) $defaults = array(
'SERVER_NAME' => 'localhost',
'SERVER_PORT' => 80,
'HTTP_HOST' => 'localhost',
'HTTP_USER_AGENT' => 'Symfony/X.X',
'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5',
'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'REMOTE_ADDR' => '127.0.0.1',
'SCRIPT_NAME' => '',
'SCRIPT_FILENAME' => '',
);
if (in_array(strtolower($method), array('post', 'put', 'delete')))
{ {
$request = $parameters; $request = $parameters;
$query = array(); $query = array();
$defaults['CONTENT_TYPE'] = 'application/x-www-form-urlencoded';
} }
else else
{ {
@ -127,18 +136,7 @@ class Request
$query = array_replace($qs, $query); $query = array_replace($qs, $query);
} }
$server = array_replace(array( $server = array_replace($defaults, $server, array(
'SERVER_NAME' => 'localhost',
'SERVER_PORT' => 80,
'HTTP_HOST' => 'localhost',
'HTTP_USER_AGENT' => 'Symfony/X.X',
'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5',
'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'REMOTE_ADDR' => '127.0.0.1',
'SCRIPT_NAME' => '',
'SCRIPT_FILENAME' => '',
), $server, array(
'REQUEST_METHOD' => strtoupper($method), 'REQUEST_METHOD' => strtoupper($method),
'PATH_INFO' => '', 'PATH_INFO' => '',
'REQUEST_URI' => $uri, 'REQUEST_URI' => $uri,
@ -426,6 +424,16 @@ class Request
return $this->format; return $this->format;
} }
public function isMethodSafe()
{
return in_array(strtolower($this->getMethod()), array('get', 'head'));
}
public function isNoCache()
{
return $this->headers->getCacheControl()->isNoCache() || 'no-cache' == $this->headers->get('Pragma');
}
/** /**
* Returns the preferred language. * Returns the preferred language.
* *
@ -464,7 +472,7 @@ class Request
return $this->languages; return $this->languages;
} }
$languages = $this->splitHttpAcceptHeader($this->headers->get('ACCEPT_LANGUAGE')); $languages = $this->splitHttpAcceptHeader($this->headers->get('Accept-Language'));
foreach ($languages as $lang) foreach ($languages as $lang)
{ {
if (strstr($lang, '-')) if (strstr($lang, '-'))
@ -514,7 +522,7 @@ class Request
return $this->charsets; return $this->charsets;
} }
return $this->charsets = $this->splitHttpAcceptHeader($this->headers->get('ACCEPT_CHARSET')); return $this->charsets = $this->splitHttpAcceptHeader($this->headers->get('Accept-Charset'));
} }
/** /**
@ -529,7 +537,7 @@ class Request
return $this->acceptableContentTypes; return $this->acceptableContentTypes;
} }
return $this->acceptableContentTypes = $this->splitHttpAcceptHeader($this->headers->get('ACCEPT')); return $this->acceptableContentTypes = $this->splitHttpAcceptHeader($this->headers->get('Accept'));
} }
/** /**
@ -542,7 +550,7 @@ class Request
*/ */
public function isXmlHttpRequest() public function isXmlHttpRequest()
{ {
return 'XMLHttpRequest' == $this->headers->get('X_REQUESTED_WITH'); return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
} }
/** /**
@ -785,9 +793,9 @@ class Request
$headers = array(); $headers = array();
foreach ($this->server->all() as $key => $value) foreach ($this->server->all() as $key => $value)
{ {
if ('http_' === strtolower(substr($key, 0, 5))) if ('http-' === strtolower(substr($key, 0, 5)))
{ {
$headers[strtoupper(strtr(substr($key, 5), '-', '_'))] = $value; $headers[substr($key, 5)] = $value;
} }
} }

View File

@ -20,11 +20,12 @@ namespace Symfony\Components\RequestHandler;
*/ */
class Response class Response
{ {
public $headers;
protected $content; protected $content;
protected $version; protected $version;
protected $statusCode; protected $statusCode;
protected $statusText; protected $statusText;
protected $headers;
protected $cookies; protected $cookies;
static public $statusTexts = array( static public $statusTexts = array(
@ -82,11 +83,7 @@ class Response
$this->setContent($content); $this->setContent($content);
$this->setStatusCode($status); $this->setStatusCode($status);
$this->setProtocolVersion('1.0'); $this->setProtocolVersion('1.0');
$this->headers = array(); $this->headers = new HeaderBag($headers, 'response');
foreach ($headers as $name => $value)
{
$this->setHeader($name, $value);
}
$this->cookies = array(); $this->cookies = array();
} }
@ -102,6 +99,57 @@ class Response
return (string) $this->getContent(); return (string) $this->getContent();
} }
/**
* Clones the current Response instance.
*/
public function __clone()
{
$this->headers = clone $this->headers;
}
/**
* Sends HTTP headers, including cookies.
*/
public function sendHeaders()
{
if (!$this->headers->has('Content-Type'))
{
$this->headers->set('Content-Type', 'text/html');
}
// status
header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText));
// headers
foreach ($this->headers->all() as $name => $value)
{
header($name.': '.$value);
}
// cookies
foreach ($this->cookies as $cookie)
{
setrawcookie($cookie['name'], $cookie['value'], $cookie['expire'], $cookie['path'], $cookie['domain'], $cookie['secure'], $cookie['httpOnly']);
}
}
/**
* Sends content for the current web response.
*/
public function sendContent()
{
echo $this->content;
}
/**
* Sends HTTP headers and content.
*/
public function send()
{
$this->sendHeaders();
$this->sendContent();
}
/** /**
* Sets the response content * Sets the response content
* *
@ -222,126 +270,4 @@ class Response
{ {
return $this->statusCode; return $this->statusCode;
} }
/**
* Sets a HTTP header.
*
* @param string $name HTTP header name
* @param string $value Value (if null, remove the HTTP header)
* @param bool $replace Replace for the value
*
*/
public function setHeader($name, $value, $replace = true)
{
$name = $this->normalizeHeaderName($name);
if (null === $value)
{
unset($this->headers[$name]);
return;
}
if (!$replace)
{
$current = isset($this->headers[$name]) ? $this->headers[$name] : '';
$value = ($current ? $current.', ' : '').$value;
}
$this->headers[$name] = $value;
return $this;
}
/**
* Gets HTTP header current value.
*
* @param string $name HTTP header name
* @param string $default Default value returned if named HTTP header is not found
*
* @return array
*/
public function getHeader($name, $default = null)
{
$name = $this->normalizeHeaderName($name);
return isset($this->headers[$name]) ? $this->headers[$name] : $default;
}
/**
* Checks if the response has given HTTP header.
*
* @param string $name HTTP header name
*
* @return bool
*/
public function hasHeader($name)
{
return array_key_exists($this->normalizeHeaderName($name), $this->headers);
}
/**
* Retrieves HTTP headers from the current web response.
*
* @return string HTTP headers
*/
public function getHeaders()
{
return $this->headers;
}
/**
* Sends HTTP headers, including cookies.
*/
public function sendHeaders()
{
if (!$this->hasHeader('Content-Type'))
{
$this->setHeader('Content-Type', 'text/html');
}
// status
header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText));
// headers
foreach ($this->headers as $name => $value)
{
header($name.': '.$value);
}
// cookies
foreach ($this->cookies as $cookie)
{
setrawcookie($cookie['name'], $cookie['value'], $cookie['expire'], $cookie['path'], $cookie['domain'], $cookie['secure'], $cookie['httpOnly']);
}
}
/**
* Sends content for the current web response.
*/
public function sendContent()
{
echo $this->content;
}
/**
* Sends HTTP headers and content.
*/
public function send()
{
$this->sendHeaders();
$this->sendContent();
}
/**
* Normalizes a HTTP header name.
*
* @param string $name The HTTP header name
*
* @return string The normalized HTTP header name
*/
protected function normalizeHeaderName($name)
{
return strtr(strtolower($name), '_', '-');
}
} }

View File

@ -156,7 +156,7 @@ EOF;
$uri = '/'.$matches[2]; $uri = '/'.$matches[2];
} }
return Request::createFromUri($uri, $request->getMethod(), $request->getParameters(), $request->getFiles(), $request->getCookies(), $request->getServer()); return Request::create($uri, $request->getMethod(), $request->getParameters(), $request->getFiles(), $request->getCookies(), $request->getServer());
} }
/** /**
@ -168,7 +168,7 @@ EOF;
*/ */
protected function filterResponse($response) protected function filterResponse($response)
{ {
return new DomResponse($response->getContent(), $response->getStatusCode(), $response->getHeaders(), $response->getCookies()); return new DomResponse($response->getContent(), $response->getStatusCode(), $response->headers, $response->getCookies());
} }
/** /**

View File

@ -38,7 +38,7 @@ class ResponseTester extends Tester
if (class_exists('Symfony\Components\DomCrawler\Crawler')) if (class_exists('Symfony\Components\DomCrawler\Crawler'))
{ {
$this->crawler = new Crawler(); $this->crawler = new Crawler();
$this->crawler->addContent($this->response->getContent(), $this->response->getHeader('Content-Type')); $this->crawler->addContent($this->response->getContent(), $this->response->headers->get('Content-Type'));
} }
} }
@ -121,16 +121,16 @@ class ResponseTester extends Tester
*/ */
public function assertHeaderEquals($key, $value) public function assertHeaderEquals($key, $value)
{ {
$headers = explode(', ', $this->response->getHeader($key)); $headers = explode(', ', $this->response->headers->get($key));
foreach ($headers as $header) foreach ($headers as $header)
{ {
if ($header == $value) if ($header == $value)
{ {
return $this->test->pass(sprintf('Response header "%s" is "%s" (%s)', $key, $value, $this->response->getHeader($key))); return $this->test->pass(sprintf('Response header "%s" is "%s" (%s)', $key, $value, $this->response->headers->get($key)));
} }
} }
$this->test->fail(sprintf('Response header "%s" matches "%s" (%s)', $key, $value, $this->response->getHeader($key))); $this->test->fail(sprintf('Response header "%s" matches "%s" (%s)', $key, $value, $this->response->headers->get($key)));
} }
/** /**
@ -141,16 +141,16 @@ class ResponseTester extends Tester
*/ */
public function assertNotHeaderEquals($key, $value) public function assertNotHeaderEquals($key, $value)
{ {
$headers = explode(', ', $this->response->getHeader($key)); $headers = explode(', ', $this->response->headers->get($key));
foreach ($headers as $header) foreach ($headers as $header)
{ {
if ($header == $value) if ($header == $value)
{ {
return $this->test->fail(sprintf('Response header "%s" is not "%s" (%s)', $key, $value, $this->response->getHeader($key))); return $this->test->fail(sprintf('Response header "%s" is not "%s" (%s)', $key, $value, $this->response->headers->get($key)));
} }
} }
$this->test->pass(sprintf('Response header "%s" does not match "%s" (%s)', $key, $value, $this->response->getHeader($key))); $this->test->pass(sprintf('Response header "%s" does not match "%s" (%s)', $key, $value, $this->response->headers->get($key)));
} }
/** /**
@ -161,16 +161,16 @@ class ResponseTester extends Tester
*/ */
public function assertHeaderRegExp($key, $regex) public function assertHeaderRegExp($key, $regex)
{ {
$headers = explode(', ', $this->response->getHeader($key)); $headers = explode(', ', $this->response->headers->get($key));
foreach ($headers as $header) foreach ($headers as $header)
{ {
if (preg_match($regex, $header)) if (preg_match($regex, $header))
{ {
return $this->test->pass(sprintf('Response header "%s" matches "%s" (%s)', $key, $value, $this->response->getHeader($key))); return $this->test->pass(sprintf('Response header "%s" matches "%s" (%s)', $key, $value, $this->response->headers->get($key)));
} }
} }
return $this->test->fail(sprintf('Response header "%s" matches "%s" (%s)', $key, $value, $this->response->getHeader($key))); return $this->test->fail(sprintf('Response header "%s" matches "%s" (%s)', $key, $value, $this->response->headers->get($key)));
} }
/** /**
@ -181,16 +181,16 @@ class ResponseTester extends Tester
*/ */
public function assertNotHeaderRegExp($key, $regex) public function assertNotHeaderRegExp($key, $regex)
{ {
$headers = explode(', ', $this->response->getHeader($key)); $headers = explode(', ', $this->response->headers->get($key));
foreach ($headers as $header) foreach ($headers as $header)
{ {
if (!preg_match($regex, $header)) if (!preg_match($regex, $header))
{ {
return $this->test->pass(sprintf('Response header "%s" matches "%s" (%s)', $key, $value, $this->response->getHeader($key))); return $this->test->pass(sprintf('Response header "%s" matches "%s" (%s)', $key, $value, $this->response->headers->get($key)));
} }
} }
return $this->test->fail(sprintf('Response header "%s" matches "%s" (%s)', $key, $value, $this->response->getHeader($key))); return $this->test->fail(sprintf('Response header "%s" matches "%s" (%s)', $key, $value, $this->response->headers->get($key)));
} }
/** /**
@ -337,7 +337,7 @@ class ResponseTester extends Tester
if (null !== $location) if (null !== $location)
{ {
$this->test->assertEquals($location, $this->response->getHeader('Location'), sprintf('Page redirected to "%s"', $location)); $this->test->assertEquals($location, $this->response->headers->get('Location'), sprintf('Page redirected to "%s"', $location));
} }
} }

View File

@ -27,7 +27,7 @@ class AppDataCollector extends DataCollector
return array( return array(
'route' => $request->path->get('_route') ? $request->path->get('_route') : '<span style="color: #a33">NONE</span>', 'route' => $request->path->get('_route') ? $request->path->get('_route') : '<span style="color: #a33">NONE</span>',
'format' => $request->getRequestFormat(), 'format' => $request->getRequestFormat(),
'content_type' => $this->manager->getResponse()->getHeader('Content-Type') ? $this->manager->getResponse()->getHeader('Content-Type') : 'text/html', 'content_type' => $this->manager->getResponse()->headers->get('Content-Type') ? $this->manager->getResponse()->headers->get('Content-Type') : 'text/html',
'code' => $this->manager->getResponse()->getStatusCode(), 'code' => $this->manager->getResponse()->getStatusCode(),
); );
} }

View File

@ -51,7 +51,7 @@ class WebDebugToolbar
if ( if (
'3' === substr($response->getStatusCode(), 0, 1) '3' === substr($response->getStatusCode(), 0, 1)
|| ||
($response->hasHeader('Content-Type') && false === strpos($response->getHeader('Content-Type'), 'html')) ($response->headers->has('Content-Type') && false === strpos($response->headers->get('Content-Type'), 'html'))
|| ||
'html' !== $request->getRequestFormat() 'html' !== $request->getRequestFormat()
|| ||

View File

@ -64,7 +64,7 @@ class Controller
$response->setStatusCode($status); $response->setStatusCode($status);
foreach ($headers as $name => $value) foreach ($headers as $name => $value)
{ {
$response->setHeader($name, $value); $response->headers->set($name, $value);
} }
return $response; return $response;
@ -96,7 +96,7 @@ class Controller
{ {
$response = $this->container->getResponseService(); $response = $this->container->getResponseService();
$response->setStatusCode($status); $response->setStatusCode($status);
$response->setHeader('Location', $url); $response->headers->set('Location', $url);
return $response; return $response;
} }

View File

@ -72,7 +72,7 @@ class ControllerLoader
$controller[0]->setRequest($request); $controller[0]->setRequest($request);
$r = new \ReflectionObject($controller[0]); $r = new \ReflectionObject($controller[0]);
$arguments = $this->getMethodArguments($r->getMethod($controller[1]), $event->getParameter('request')->path->all(), sprintf('%s::%s()', get_class($controller[0]), $controller[1])); $arguments = $this->getMethodArguments($r->getMethod($controller[1]), $request->path->all(), sprintf('%s::%s()', get_class($controller[0]), $controller[1]));
$event->setReturnValue(array($controller, $arguments)); $event->setReturnValue(array($controller, $arguments));

View File

@ -39,7 +39,7 @@ class ResponseFilter
public function filter(Event $event, Response $response) public function filter(Event $event, Response $response)
{ {
if (!$event->getParameter('main_request') || $response->hasHeader('Content-Type')) if (!$event->getParameter('main_request') || $response->headers->has('Content-Type'))
{ {
return $response; return $response;
} }
@ -48,7 +48,7 @@ class ResponseFilter
$format = $request->getRequestFormat(); $format = $request->getRequestFormat();
if ((null !== $format) && $mimeType = $request->getMimeType($format)) if ((null !== $format) && $mimeType = $request->getMimeType($format))
{ {
$response->setHeader('Content-Type', $mimeType); $response->headers->set('Content-Type', $mimeType);
} }
return $response; return $response;

View File

@ -11,12 +11,12 @@
namespace Symfony\Tests\Components\RequestHandler; namespace Symfony\Tests\Components\RequestHandler;
use Symfony\Components\RequestHandler\RequestBag; use Symfony\Components\RequestHandler\ParameterBag;
class RequestBagTest extends \PHPUnit_Framework_TestCase class ParameterBagTest extends \PHPUnit_Framework_TestCase
{ {
/** /**
* @covers Symfony\Components\RequestHandler\RequestBag::__construct * @covers Symfony\Components\RequestHandler\ParameterBag::__construct
*/ */
public function testConstructor() public function testConstructor()
{ {
@ -24,20 +24,20 @@ class RequestBagTest extends \PHPUnit_Framework_TestCase
} }
/** /**
* @covers Symfony\Components\RequestHandler\RequestBag::all * @covers Symfony\Components\RequestHandler\ParameterBag::all
*/ */
public function testAll() public function testAll()
{ {
$bag = new RequestBag(array('foo' => 'bar')); $bag = new ParameterBag(array('foo' => 'bar'));
$this->assertEquals(array('foo' => 'bar'), $bag->all(), '->all() gets all the input'); $this->assertEquals(array('foo' => 'bar'), $bag->all(), '->all() gets all the input');
} }
/** /**
* @covers Symfony\Components\RequestHandler\RequestBag::replace * @covers Symfony\Components\RequestHandler\ParameterBag::replace
*/ */
public function testReplace() public function testReplace()
{ {
$bag = new RequestBag(array('foo' => 'bar')); $bag = new ParameterBag(array('foo' => 'bar'));
$bag->replace(array('FOO' => 'BAR')); $bag->replace(array('FOO' => 'BAR'));
$this->assertEquals(array('FOO' => 'BAR'), $bag->all(), '->replace() replaces the input with the argument'); $this->assertEquals(array('FOO' => 'BAR'), $bag->all(), '->replace() replaces the input with the argument');
@ -45,11 +45,11 @@ class RequestBagTest extends \PHPUnit_Framework_TestCase
} }
/** /**
* @covers Symfony\Components\RequestHandler\RequestBag::get * @covers Symfony\Components\RequestHandler\ParameterBag::get
*/ */
public function testGet() public function testGet()
{ {
$bag = new RequestBag(array('foo' => 'bar', 'null' => null)); $bag = new ParameterBag(array('foo' => 'bar', 'null' => null));
$this->assertEquals('bar', $bag->get('foo'), '->get() gets the value of a parameter'); $this->assertEquals('bar', $bag->get('foo'), '->get() gets the value of a parameter');
$this->assertEquals('default', $bag->get('unknown', 'default'), '->get() returns second argument as default if a parameter is not defined'); $this->assertEquals('default', $bag->get('unknown', 'default'), '->get() returns second argument as default if a parameter is not defined');
@ -57,11 +57,11 @@ class RequestBagTest extends \PHPUnit_Framework_TestCase
} }
/** /**
* @covers Symfony\Components\RequestHandler\RequestBag::set * @covers Symfony\Components\RequestHandler\ParameterBag::set
*/ */
public function testSet() public function testSet()
{ {
$bag = new RequestBag(array()); $bag = new ParameterBag(array());
$bag->set('foo', 'bar'); $bag->set('foo', 'bar');
$this->assertEquals('bar', $bag->get('foo'), '->set() sets the value of parameter'); $this->assertEquals('bar', $bag->get('foo'), '->set() sets the value of parameter');
@ -71,55 +71,55 @@ class RequestBagTest extends \PHPUnit_Framework_TestCase
} }
/** /**
* @covers Symfony\Components\RequestHandler\RequestBag::has * @covers Symfony\Components\RequestHandler\ParameterBag::has
*/ */
public function testHas() public function testHas()
{ {
$bag = new RequestBag(array('foo' => 'bar')); $bag = new ParameterBag(array('foo' => 'bar'));
$this->assertTrue($bag->has('foo'), '->has() returns true if a parameter is defined'); $this->assertTrue($bag->has('foo'), '->has() returns true if a parameter is defined');
$this->assertFalse($bag->has('unknown'), '->has() return false if a parameter is not defined'); $this->assertFalse($bag->has('unknown'), '->has() return false if a parameter is not defined');
} }
/** /**
* @covers Symfony\Components\RequestHandler\RequestBag::getAlpha * @covers Symfony\Components\RequestHandler\ParameterBag::getAlpha
*/ */
public function testGetAlpha() public function testGetAlpha()
{ {
$bag = new RequestBag(array('word' => 'foo_BAR_012')); $bag = new ParameterBag(array('word' => 'foo_BAR_012'));
$this->assertEquals('fooBAR', $bag->getAlpha('word'), '->getAlpha() gets only alphabetic characters'); $this->assertEquals('fooBAR', $bag->getAlpha('word'), '->getAlpha() gets only alphabetic characters');
$this->assertEquals('', $bag->getAlpha('unknown'), '->getAlpha() returns empty string if a parameter is not defined'); $this->assertEquals('', $bag->getAlpha('unknown'), '->getAlpha() returns empty string if a parameter is not defined');
} }
/** /**
* @covers Symfony\Components\RequestHandler\RequestBag::getAlnum * @covers Symfony\Components\RequestHandler\ParameterBag::getAlnum
*/ */
public function testGetAlnum() public function testGetAlnum()
{ {
$bag = new RequestBag(array('word' => 'foo_BAR_012')); $bag = new ParameterBag(array('word' => 'foo_BAR_012'));
$this->assertEquals('fooBAR012', $bag->getAlnum('word'), '->getAlnum() gets only alphanumeric characters'); $this->assertEquals('fooBAR012', $bag->getAlnum('word'), '->getAlnum() gets only alphanumeric characters');
$this->assertEquals('', $bag->getAlnum('unknown'), '->getAlnum() returns empty string if a parameter is not defined'); $this->assertEquals('', $bag->getAlnum('unknown'), '->getAlnum() returns empty string if a parameter is not defined');
} }
/** /**
* @covers Symfony\Components\RequestHandler\RequestBag::getDigits * @covers Symfony\Components\RequestHandler\ParameterBag::getDigits
*/ */
public function testGetDigits() public function testGetDigits()
{ {
$bag = new RequestBag(array('word' => 'foo_BAR_012')); $bag = new ParameterBag(array('word' => 'foo_BAR_012'));
$this->assertEquals('012', $bag->getDigits('word'), '->getDigits() gets only digits as string'); $this->assertEquals('012', $bag->getDigits('word'), '->getDigits() gets only digits as string');
$this->assertEquals('', $bag->getDigits('unknown'), '->getDigits() returns empty string if a parameter is not defined'); $this->assertEquals('', $bag->getDigits('unknown'), '->getDigits() returns empty string if a parameter is not defined');
} }
/** /**
* @covers Symfony\Components\RequestHandler\RequestBag::getInt * @covers Symfony\Components\RequestHandler\ParameterBag::getInt
*/ */
public function testGetInt() public function testGetInt()
{ {
$bag = new RequestBag(array('digits' => '0123')); $bag = new ParameterBag(array('digits' => '0123'));
$this->assertEquals(123, $bag->getInt('digits'), '->getInt() gets a value of parameter as integer'); $this->assertEquals(123, $bag->getInt('digits'), '->getInt() gets a value of parameter as integer');
$this->assertEquals(0, $bag->getInt('unknown'), '->getInt() returns zero if a parameter is not defined'); $this->assertEquals(0, $bag->getInt('unknown'), '->getInt() returns zero if a parameter is not defined');

View File

@ -61,7 +61,7 @@ class RequestTest extends \PHPUnit_Framework_TestCase
$this->assertEquals(array('foo' => 'foobar'), $dup->query->all(), '->duplicate() overrides the query parameters if provided'); $this->assertEquals(array('foo' => 'foobar'), $dup->query->all(), '->duplicate() overrides the query parameters if provided');
$this->assertEquals(array('foo' => 'foobar'), $dup->request->all(), '->duplicate() overrides the request parameters if provided'); $this->assertEquals(array('foo' => 'foobar'), $dup->request->all(), '->duplicate() overrides the request parameters if provided');
$this->assertEquals(array('foo' => 'foobar'), $dup->path->all(), '->duplicate() overrides the path parameters if provided'); $this->assertEquals(array('foo' => 'foobar'), $dup->path->all(), '->duplicate() overrides the path parameters if provided');
$this->assertEquals(array('FOO' => 'foobar'), $dup->headers->all(), '->duplicate() overrides the HTTP header if provided'); $this->assertEquals(array('foo' => 'foobar'), $dup->headers->all(), '->duplicate() overrides the HTTP header if provided');
} }
/** /**