Commit f29f1e21 authored by alexpott's avatar alexpott
Browse files

Issue #2506533 by Jaesin, minnur, neclimdul, sdstyles, dawehner, Crell: Remove...

Issue #2506533 by Jaesin, minnur, neclimdul, sdstyles, dawehner, Crell: Remove ContentNegotiation and embed functionality in the middleware
parent 3a0a28e6
......@@ -630,12 +630,8 @@ services:
http_kernel.basic:
class: Symfony\Component\HttpKernel\HttpKernel
arguments: ['@event_dispatcher', '@controller_resolver', '@request_stack']
http_negotiation.format_negotiator:
class: Drupal\Core\ContentNegotiation
private: true
http_middleware.negotiation:
class: Drupal\Core\StackMiddleware\NegotiationMiddleware
arguments: ['@http_negotiation.format_negotiator']
tags:
- { name: http_middleware, priority: 400 }
http_middleware.reverse_proxy:
......
<?php
/**
* @file
* Contains \Drupal\Core\ContentNegotiation.
*/
namespace Drupal\Core;
use Symfony\Component\HttpFoundation\Request;
/**
* Provides content negotation based upon query parameters.
*/
class ContentNegotiation {
/**
* Gets the normalized type of a request.
*
* The normalized type is a short, lowercase version of the format, such as
* 'html', 'json' or 'atom'.
*
* @param \Symfony\Component\HttpFoundation\Request $request
* The request object from which to extract the content type.
*
* @return string
* The normalized type of a given request.
*/
public function getContentType(Request $request) {
// AJAX iframe uploads need special handling, because they contain a JSON
// response wrapped in <textarea>.
if ($request->get('ajax_iframe_upload', FALSE)) {
return 'iframeupload';
}
if ($request->query->has('_format')) {
return $request->query->get('_format');
}
// Do HTML last so that it always wins.
return 'html';
}
}
......@@ -7,8 +7,6 @@
namespace Drupal\Core\StackMiddleware;
use Drupal\Core\ContentNegotiation;
use Drupal\Core\ContentNegotiationInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
......@@ -26,13 +24,6 @@ class NegotiationMiddleware implements HttpKernelInterface {
*/
protected $app;
/**
* The content negotiator.
*
* @var \Drupal\Core\ContentNegotiation
*/
protected $negotiator;
/**
* Contains a hashmap of format as key and mimetype as value.
*
......@@ -45,12 +36,9 @@ class NegotiationMiddleware implements HttpKernelInterface {
*
* @param \Symfony\Component\HttpKernel\HttpKernelInterface $app
* The wrapper HTTP kernel
* @param \Drupal\Core\ContentNegotiation $negotiator
* The content negotiator.
*/
public function __construct(HttpKernelInterface $app, ContentNegotiation $negotiator) {
public function __construct(HttpKernelInterface $app) {
$this->app = $app;
$this->negotiator = $negotiator;
}
/**
......@@ -63,7 +51,7 @@ public function handle(Request $request, $type = self::MASTER_REQUEST, $catch =
}
// Determine the request format using the negotiator.
$request->setRequestFormat($this->negotiator->getContentType($request));
$request->setRequestFormat($this->getContentType($request));
return $this->app->handle($request, $type, $catch);
}
......@@ -82,4 +70,31 @@ public function registerFormat($format, $mime_type) {
return $this;
}
/**
* Gets the normalized type of a request.
*
* The normalized type is a short, lowercase version of the format, such as
* 'html', 'json' or 'atom'.
*
* @param \Symfony\Component\HttpFoundation\Request $request
* The request object from which to extract the content type.
*
* @return string
* The normalized type of a given request.
*/
protected function getContentType(Request $request) {
// AJAX iframe uploads need special handling, because they contain a JSON
// response wrapped in <textarea>.
if ($request->get('ajax_iframe_upload', FALSE)) {
return 'iframeupload';
}
if ($request->query->has('_format')) {
return $request->query->get('_format');
}
// Do HTML last so that it always wins.
return 'html';
}
}
......@@ -2,23 +2,30 @@
/**
* @file
* Contains \Drupal\Tests\Core\ContentNegotiationTest.
* Contains \Drupal\Tests\Core\StackMiddleware\NegotiationMiddlewareTest.
*/
namespace Drupal\Tests\Core;
namespace Drupal\Tests\Core\StackMiddleware;
use Drupal\Core\ContentNegotiation;
use Drupal\Core\StackMiddleware\NegotiationMiddleware;
use Drupal\Tests\UnitTestCase;
use Symfony\Component\HttpFoundation\ParameterBag;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
/**
* @coversDefaultClass \Drupal\Core\ContentNegotiation
* @group ContentNegotiation
* @coversDefaultClass \Drupal\Core\StackMiddleware\NegotiationMiddleware
* @group NegotiationMiddleware
*/
class ContentNegotiationTest extends UnitTestCase {
class NegotiationMiddlewareTest extends UnitTestCase {
/**
* @var \Drupal\Core\ContentNegotiation
* @var \Symfony\Component\HttpKernel\HttpKernelInterface
*/
protected $app;
/**
* @var \Drupal\Tests\Core\StackMiddleware\StubNegotiationMiddleware
*/
protected $contentNegotiation;
......@@ -28,7 +35,8 @@ class ContentNegotiationTest extends UnitTestCase {
protected function setUp() {
parent::setUp();
$this->contentNegotiation = new ContentNegotiation;
$this->app = $this->prophesize(HttpKernelInterface::class);
$this->contentNegotiation = new StubNegotiationMiddleware($this->app->reveal());
}
/**
......@@ -45,6 +53,8 @@ public function testAjaxIframeUpload() {
/**
* Tests the specifying a format via query parameters gets used.
*
* @covers ::getContentType
*/
public function testFormatViaQueryParameter() {
$request = new Request();
......@@ -76,4 +86,57 @@ public function testUnknowContentTypeButAjaxRequest() {
$this->assertSame('html', $this->contentNegotiation->getContentType($request));
}
/**
* Test that handle() correctly hands off to sub application.
*
* @covers ::handle
*/
public function testHandle() {
$request = $this->prophesize(Request::class);
// Default empty format list should not set any formats.
$request->setFormat()->shouldNotBeCalled();
// Request format will be set with default format.
$request->setRequestFormat('html')->shouldBeCalled();
// Some getContentType calls we don't really care about but have to mock.
$request->get('ajax_iframe_upload', false)->shouldBeCalled();
$request_mock = $request->reveal();
$request_mock->query = new ParameterBag([]);
// Calling kernel app with default arguments.
$this->app->handle($request_mock, HttpKernelInterface::MASTER_REQUEST, TRUE)
->shouldBeCalled();
$this->contentNegotiation->handle($request_mock);
// Calling kernel app with specified arguments.
$this->app->handle($request_mock, HttpKernelInterface::SUB_REQUEST, FALSE)
->shouldBeCalled();
$this->contentNegotiation->handle($request_mock, HttpKernelInterface::SUB_REQUEST, FALSE);
}
/**
* @covers ::registerFormat
*/
public function testSetFormat() {
$request = $this->prophesize(Request::class);
// Default empty format list should not set any formats.
$request->setFormat('david', 'geeky/david')->shouldBeCalled();
// Some calls we don't care about.
$request->setRequestFormat('html')->shouldBeCalled();
$request->get('ajax_iframe_upload', false)->shouldBeCalled();
$request_mock = $request->reveal();
$request_mock->query = new ParameterBag([]);
// Trigger handle.
$this->contentNegotiation->registerFormat('david', 'geeky/david');
$this->contentNegotiation->handle($request_mock);
}
}
class StubNegotiationMiddleware extends NegotiationMiddleware {
public function getContentType(Request $request) { return parent::getContentType($request); }
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment