Skip to content

Commit

Permalink
Merge branch '2.1' into 2.2
Browse files Browse the repository at this point in the history
* 2.1:
  remove validation related headers when needed
  use while loop for iterating
  [Filesystem] copy() is not working when open_basedir is set

Conflicts:
	src/Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php
  • Loading branch information
fabpot committed May 1, 2013
2 parents 609df32 + 0306957 commit 9f02b05
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 19 deletions.
14 changes: 13 additions & 1 deletion src/Symfony/Component/Filesystem/Filesystem.php
Expand Up @@ -35,6 +35,10 @@ class Filesystem
*/
public function copy($originFile, $targetFile, $override = false)
{
if (!is_file($originFile)) {
throw new IOException(sprintf('Failed to copy %s because file not exists', $originFile));
}

$this->mkdir(dirname($targetFile));

if (!$override && is_file($targetFile)) {
Expand All @@ -44,7 +48,15 @@ public function copy($originFile, $targetFile, $override = false)
}

if ($doCopy) {
if (true !== @copy($originFile, $targetFile)) {
// https://bugs.php.net/bug.php?id=64634
$source = fopen($originFile, 'r');
$target = fopen($targetFile, 'w+');
stream_copy_to_stream($source, $target);
fclose($source);
fclose($target);
unset($source, $target);

if (!is_file($targetFile)) {
throw new IOException(sprintf('Failed to copy %s to %s', $originFile, $targetFile));
}
}
Expand Down
Expand Up @@ -29,13 +29,12 @@
class EsiResponseCacheStrategy implements EsiResponseCacheStrategyInterface
{
private $cacheable = true;
private $embeddedResponses = 0;
private $ttls = array();
private $maxAges = array();

/**
* Adds a Response.
*
* @param Response $response
* {@inheritdoc}
*/
public function add(Response $response)
{
Expand All @@ -45,26 +44,38 @@ public function add(Response $response)
$this->ttls[] = $response->getTtl();
$this->maxAges[] = $response->getMaxAge();
}

$this->embeddedResponses++;
}

/**
* Updates the Response HTTP headers based on the embedded Responses.
*
* @param Response $response
* {@inheritdoc}
*/
public function update(Response $response)
{
// if we only have one Response, do nothing
if (1 === count($this->ttls)) {
// if we have no embedded Response, do nothing
if (0 === $this->embeddedResponses) {
return;
}

// Remove validation related headers in order to avoid browsers using
// their own cache, because some of the response content comes from
// at least one embedded response (which likely has a different caching strategy).
if ($response->isValidateable()) {
$response->setEtag(null);
$response->setLastModified(null);
$this->cacheable = false;
}

if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');

return;
}

$this->ttls[] = $response->getTtl();
$this->maxAges[] = $response->getMaxAge();

if (null !== $maxAge = min($this->maxAges)) {
$response->setSharedMaxAge($maxAge);
$response->headers->set('Age', $maxAge - min($this->ttls));
Expand Down
4 changes: 2 additions & 2 deletions src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php
Expand Up @@ -205,10 +205,10 @@ public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQ
}

if (null !== $this->esi) {
$this->esiCacheStrategy->add($response);

if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
} else {
$this->esiCacheStrategy->add($response);
}
}

Expand Down
Expand Up @@ -60,14 +60,7 @@ public function find($ip, $url, $limit, $method, $start = null, $end = null)
fseek($file, 0, SEEK_END);

$result = array();

for (;$limit > 0; $limit--) {
$line = $this->readLineFromFile($file);

if (null === $line) {
break;
}

while (count($result) < $limit && $line = $this->readLineFromFile($file)) {
list($csvToken, $csvIp, $csvMethod, $csvUrl, $csvTime, $csvParent) = str_getcsv($line);

$csvTime = (int) $csvTime;
Expand Down
28 changes: 28 additions & 0 deletions src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php
Expand Up @@ -1075,4 +1075,32 @@ public function testXForwarderForHeaderForPassRequests()

$this->assertEquals('10.0.0.1', $this->kernel->getBackendRequest()->headers->get('X-Forwarded-For'));
}

public function testEsiCacheRemoveValidationHeadersIfEmbeddedResponses()
{
$time = new \DateTime;

$responses = array(
array(
'status' => 200,
'body' => '<esi:include src="/hey" />',
'headers' => array(
'Surrogate-Control' => 'content="ESI/1.0"',
'ETag' => 'hey',
'Last-Modified' => $time->format(DATE_RFC2822),
),
),
array(
'status' => 200,
'body' => 'Hey!',
'headers' => array(),
),
);

$this->setNextResponses($responses);

$this->request('GET', '/', array(), array(), true);
$this->assertNull($this->response->getETag());
$this->assertNull($this->response->getLastModified());
}
}
Expand Up @@ -189,6 +189,21 @@ public function testRetrieveByEmptyUrlAndIp()
$this->getStorage()->purge();
}

public function testRetrieveByMethodAndLimit()
{
foreach (array('POST', 'GET') as $method) {
for ($i = 0; $i < 5; $i++) {
$profile = new Profile('token_'.$i.$method);
$profile->setMethod($method);
$this->getStorage()->write($profile);
}
}

$this->assertCount(5, $this->getStorage()->find('', '', 5, 'POST'));

$this->getStorage()->purge();
}

public function testPurge()
{
$profile = new Profile('token1');
Expand Down

0 comments on commit 9f02b05

Please sign in to comment.