Procházet zdrojové kódy

[HttpKernel] removed Response content when Request method is HEAD as per RFC2616

Fabien Potencier před 14 roky
rodič
revize
7780c4deda

+ 7 - 3
src/Symfony/Component/HttpKernel/EventListener/ResponseListener.php

@@ -36,12 +36,17 @@ class ResponseListener
      */
     public function onCoreResponse(FilterResponseEvent $event)
     {
+        $request = $event->getRequest();
+        $response = $event->getResponse();
+
+        if ('HEAD' === $request->getMethod()) {
+            $response->setContent('');
+        }
+
         if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
             return;
         }
 
-        $response = $event->getResponse();
-
         if (null === $response->getCharset()) {
             $response->setCharset($this->charset);
         }
@@ -50,7 +55,6 @@ class ResponseListener
             return;
         }
 
-        $request = $event->getRequest();
         $format = $request->getRequestFormat();
         if ((null !== $format) && $mimeType = $request->getMimeType($format)) {
             $response->headers->set('Content-Type', $mimeType);

+ 11 - 0
tests/Symfony/Tests/Component/HttpKernel/EventListener/ResponseListenerTest.php

@@ -76,4 +76,15 @@ class ResponseListenerTest extends \PHPUnit_Framework_TestCase
 
         $this->assertEquals('application/json', $event->getResponse()->headers->get('content-type'));
     }
+
+    public function testFilterRemovesContentForHeadRequests()
+    {
+        $response = new Response('foo');
+        $request = Request::create('/', 'HEAD');
+
+        $event = new FilterResponseEvent($this->kernel, $request, HttpKernelInterface::MASTER_REQUEST, $response);
+        $this->dispatcher->dispatch(CoreEvents::RESPONSE, $event);
+
+        $this->assertEquals('', $response->getContent());
+    }
 }