diff --git a/src/Symfony/Component/HttpFoundation/Request.php b/src/Symfony/Component/HttpFoundation/Request.php index a950b0a159a1..4c5260520857 100644 --- a/src/Symfony/Component/HttpFoundation/Request.php +++ b/src/Symfony/Component/HttpFoundation/Request.php @@ -1347,6 +1347,8 @@ public function setFormat($format, $mimeTypes) * * _format request attribute * * $default * + * @see getPreferredFormat + * * @param string|null $default The default format * * @return string|null The request format @@ -1563,22 +1565,27 @@ public function isNoCache() return $this->headers->hasCacheControlDirective('no-cache') || 'no-cache' == $this->headers->get('Pragma'); } + /** + * Gets the preferred format for the response by inspecting, in the following order: + * * the request format set using setRequestFormat + * * the values of the Accept HTTP header + * * the content type of the body of the request. + */ public function getPreferredFormat(?string $default = 'html'): ?string { if (null !== $this->preferredFormat) { return $this->preferredFormat; } - $this->preferredFormat = $this->getRequestFormat($this->getContentType()); - - if (null === $this->preferredFormat) { - foreach ($this->getAcceptableContentTypes() as $contentType) { - if (null !== $this->preferredFormat = $this->getFormat($contentType)) { - break; - } + $preferredFormat = null; + foreach ($this->getAcceptableContentTypes() as $contentType) { + if ($preferredFormat = $this->getFormat($contentType)) { + break; } } + $this->preferredFormat = $this->getRequestFormat($preferredFormat ?: $this->getContentType()); + return $this->preferredFormat ?: $default; } diff --git a/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php b/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php index 6573da078572..500d590f7857 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php @@ -407,14 +407,14 @@ public function testGetPreferredFormat() $this->assertSame('json', $request->getPreferredFormat('json')); $request->setRequestFormat('atom'); - $request->headers->set('Content-Type', 'application/json'); - $request->headers->set('Accept', 'application/xml'); + $request->headers->set('Accept', 'application/ld+json'); + $request->headers->set('Content-Type', 'application/merge-patch+json'); $this->assertSame('atom', $request->getPreferredFormat()); $request = new Request(); - $request->headers->set('Content-Type', 'application/json'); $request->headers->set('Accept', 'application/xml'); - $this->assertSame('json', $request->getPreferredFormat()); + $request->headers->set('Content-Type', 'application/json'); + $this->assertSame('xml', $request->getPreferredFormat()); $request = new Request(); $request->headers->set('Accept', 'application/xml'); diff --git a/src/Symfony/Component/HttpFoundation/Tests/ResponseTest.php b/src/Symfony/Component/HttpFoundation/Tests/ResponseTest.php index 7856a77c038b..550d7ce0b071 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/ResponseTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/ResponseTest.php @@ -504,6 +504,7 @@ public function testPrepareSetContentType() $response = new Response('foo'); $request = Request::create('/'); $request->setRequestFormat('json'); + $request->headers->remove('accept'); $response->prepare($request);