Merge pull request #1221 from nextcloud/proper_204_304_response
No body or content-length for 204 and 304 responses
This commit is contained in:
commit
7ffed2deae
|
@ -30,6 +30,7 @@ namespace OC\AppFramework;
|
||||||
use OC\AppFramework\Http\Dispatcher;
|
use OC\AppFramework\Http\Dispatcher;
|
||||||
use OC_App;
|
use OC_App;
|
||||||
use OC\AppFramework\DependencyInjection\DIContainer;
|
use OC\AppFramework\DependencyInjection\DIContainer;
|
||||||
|
use OCP\AppFramework\Http;
|
||||||
use OCP\AppFramework\QueryException;
|
use OCP\AppFramework\QueryException;
|
||||||
use OCP\AppFramework\Http\ICallbackResponse;
|
use OCP\AppFramework\Http\ICallbackResponse;
|
||||||
|
|
||||||
|
@ -142,11 +143,19 @@ class App {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($response instanceof ICallbackResponse) {
|
/*
|
||||||
$response->callback($io);
|
* Status 204 does not have a body and no Content Length
|
||||||
} else if(!is_null($output)) {
|
* Status 304 does not have a body and does not need a Content Length
|
||||||
$io->setHeader('Content-Length: ' . strlen($output));
|
* https://tools.ietf.org/html/rfc7230#section-3.3
|
||||||
$io->setOutput($output);
|
* https://tools.ietf.org/html/rfc7230#section-3.3.2
|
||||||
|
*/
|
||||||
|
if ($httpHeaders !== Http::STATUS_NO_CONTENT && $httpHeaders !== Http::STATUS_NOT_MODIFIED) {
|
||||||
|
if ($response instanceof ICallbackResponse) {
|
||||||
|
$response->callback($io);
|
||||||
|
} else if (!is_null($output)) {
|
||||||
|
$io->setHeader('Content-Length: ' . strlen($output));
|
||||||
|
$io->setOutput($output);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
namespace Test\AppFramework;
|
namespace Test\AppFramework;
|
||||||
|
|
||||||
use OC\AppFramework\App;
|
use OC\AppFramework\App;
|
||||||
|
use OCP\AppFramework\Http;
|
||||||
use OCP\AppFramework\Http\Response;
|
use OCP\AppFramework\Http\Response;
|
||||||
|
|
||||||
|
|
||||||
|
@ -134,7 +135,7 @@ class AppTest extends \Test\TestCase {
|
||||||
|
|
||||||
|
|
||||||
public function testOutputIsPrinted(){
|
public function testOutputIsPrinted(){
|
||||||
$return = [null, [], [], $this->output, new Response()];
|
$return = [Http::STATUS_OK, [], [], $this->output, new Response()];
|
||||||
$this->dispatcher->expects($this->once())
|
$this->dispatcher->expects($this->once())
|
||||||
->method('dispatch')
|
->method('dispatch')
|
||||||
->with($this->equalTo($this->controller),
|
->with($this->equalTo($this->controller),
|
||||||
|
@ -146,6 +147,32 @@ class AppTest extends \Test\TestCase {
|
||||||
App::main($this->controllerName, $this->controllerMethod, $this->container, []);
|
App::main($this->controllerName, $this->controllerMethod, $this->container, []);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function dataNoOutput() {
|
||||||
|
return [
|
||||||
|
[Http::STATUS_NO_CONTENT],
|
||||||
|
[Http::STATUS_NOT_MODIFIED],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider dataNoOutput
|
||||||
|
* @param int $statusCode
|
||||||
|
*/
|
||||||
|
public function testNoOutput($statusCode) {
|
||||||
|
$return = [$statusCode, [], [], $this->output, new Response()];
|
||||||
|
$this->dispatcher->expects($this->once())
|
||||||
|
->method('dispatch')
|
||||||
|
->with($this->equalTo($this->controller),
|
||||||
|
$this->equalTo($this->controllerMethod))
|
||||||
|
->will($this->returnValue($return));
|
||||||
|
$this->io->expects($this->once())
|
||||||
|
->method('setHeader')
|
||||||
|
->with($this->equalTo($statusCode));
|
||||||
|
$this->io->expects($this->never())
|
||||||
|
->method('setOutput');
|
||||||
|
App::main($this->controllerName, $this->controllerMethod, $this->container, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public function testCallbackIsCalled(){
|
public function testCallbackIsCalled(){
|
||||||
$mock = $this->getMockBuilder('OCP\AppFramework\Http\ICallbackResponse')
|
$mock = $this->getMockBuilder('OCP\AppFramework\Http\ICallbackResponse')
|
||||||
|
|
Loading…
Reference in New Issue