add dataresponse
fix docstrings adjust copyright date another copyright date update another header update implement third headers argument, fix indention, fix docstrings fix docstrings
This commit is contained in:
parent
c93ddf77b9
commit
0696099bad
|
@ -30,6 +30,7 @@ use \OC\AppFramework\Utility\ControllerMethodReflector;
|
||||||
|
|
||||||
use OCP\AppFramework\Controller;
|
use OCP\AppFramework\Controller;
|
||||||
use OCP\AppFramework\Http\Response;
|
use OCP\AppFramework\Http\Response;
|
||||||
|
use OCP\AppFramework\Http\DataResponse;
|
||||||
use OCP\IRequest;
|
use OCP\IRequest;
|
||||||
|
|
||||||
|
|
||||||
|
@ -154,8 +155,8 @@ class Dispatcher {
|
||||||
|
|
||||||
$response = call_user_func_array(array($controller, $methodName), $arguments);
|
$response = call_user_func_array(array($controller, $methodName), $arguments);
|
||||||
|
|
||||||
// format response if not of type response
|
// format response
|
||||||
if(!($response instanceof Response)) {
|
if($response instanceof DataResponse || !($response instanceof Response)) {
|
||||||
|
|
||||||
// get format from the url format or request format parameter
|
// get format from the url format or request format parameter
|
||||||
$format = $this->request->getParam('format');
|
$format = $this->request->getParam('format');
|
||||||
|
|
|
@ -29,6 +29,7 @@ namespace OCP\AppFramework;
|
||||||
|
|
||||||
use OCP\AppFramework\Http\TemplateResponse;
|
use OCP\AppFramework\Http\TemplateResponse;
|
||||||
use OCP\AppFramework\Http\JSONResponse;
|
use OCP\AppFramework\Http\JSONResponse;
|
||||||
|
use OCP\AppFramework\Http\DataResponse;
|
||||||
use OCP\IRequest;
|
use OCP\IRequest;
|
||||||
|
|
||||||
|
|
||||||
|
@ -63,8 +64,17 @@ abstract class Controller {
|
||||||
|
|
||||||
// default responders
|
// default responders
|
||||||
$this->responders = array(
|
$this->responders = array(
|
||||||
'json' => function ($response) {
|
'json' => function ($data) {
|
||||||
return new JSONResponse($response);
|
if ($data instanceof DataResponse) {
|
||||||
|
$response = new JSONResponse(
|
||||||
|
$data->getData(),
|
||||||
|
$data->getStatus()
|
||||||
|
);
|
||||||
|
$response->setHeaders($data->getHeaders());
|
||||||
|
return $response;
|
||||||
|
} else {
|
||||||
|
return new JSONResponse($data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* ownCloud - App Framework
|
||||||
|
*
|
||||||
|
* @author Bernhard Posselt
|
||||||
|
* @copyright 2014 Bernhard Posselt <dev@bernhard-posselt.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public
|
||||||
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public interface of ownCloud for apps to use.
|
||||||
|
* AppFramework\HTTP\DataResponse class
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace OCP\AppFramework\Http;
|
||||||
|
|
||||||
|
use OCP\AppFramework\Http;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A generic DataResponse class that is used to return generic data responses
|
||||||
|
* for responders to transform
|
||||||
|
*/
|
||||||
|
class DataResponse extends Response {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* response data
|
||||||
|
* @var array|object
|
||||||
|
*/
|
||||||
|
protected $data;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array|object $data the object or array that should be transformed
|
||||||
|
* @param int $statusCode the Http status code, defaults to 200
|
||||||
|
* @param array $headers additional key value based headers
|
||||||
|
*/
|
||||||
|
public function __construct($data=array(), $statusCode=Http::STATUS_OK,
|
||||||
|
array $headers=array()) {
|
||||||
|
$this->data = $data;
|
||||||
|
$this->setStatus($statusCode);
|
||||||
|
$this->setHeaders(array_merge($this->getHeaders(), $headers));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets values in the data json array
|
||||||
|
* @param array|object $data an array or object which will be transformed
|
||||||
|
* @return DataResponse Reference to this object
|
||||||
|
*/
|
||||||
|
public function setData($data){
|
||||||
|
$this->data = $data;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to get the set parameters
|
||||||
|
* @return array the data
|
||||||
|
*/
|
||||||
|
public function getData(){
|
||||||
|
return $this->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -106,6 +106,18 @@ class Response {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the headers
|
||||||
|
* @param array key value header pairs
|
||||||
|
* @return Response Reference to this object
|
||||||
|
*/
|
||||||
|
public function setHeaders($headers) {
|
||||||
|
$this->headers = $headers;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the set headers
|
* Returns the set headers
|
||||||
* @return array the headers
|
* @return array the headers
|
||||||
|
|
|
@ -27,6 +27,7 @@ namespace OCP\AppFramework;
|
||||||
use OC\AppFramework\Http\Request;
|
use OC\AppFramework\Http\Request;
|
||||||
use OCP\AppFramework\Http\TemplateResponse;
|
use OCP\AppFramework\Http\TemplateResponse;
|
||||||
use OCP\AppFramework\Http\JSONResponse;
|
use OCP\AppFramework\Http\JSONResponse;
|
||||||
|
use OCP\AppFramework\Http\DataResponse;
|
||||||
|
|
||||||
|
|
||||||
class ChildController extends Controller {
|
class ChildController extends Controller {
|
||||||
|
@ -45,6 +46,12 @@ class ChildController extends Controller {
|
||||||
|
|
||||||
return $in;
|
return $in;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function customDataResponse($in) {
|
||||||
|
$response = new DataResponse($in, 300);
|
||||||
|
$response->addHeader('test', 'something');
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class ControllerTest extends \PHPUnit_Framework_TestCase {
|
class ControllerTest extends \PHPUnit_Framework_TestCase {
|
||||||
|
@ -161,6 +168,21 @@ class ControllerTest extends \PHPUnit_Framework_TestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testFormatDataResponseJSON() {
|
||||||
|
$expectedHeaders = array(
|
||||||
|
'test' => 'something',
|
||||||
|
'Cache-Control' => 'no-cache, must-revalidate'
|
||||||
|
);
|
||||||
|
|
||||||
|
$response = $this->controller->customDataResponse(array('hi'));
|
||||||
|
$response = $this->controller->buildResponse($response, 'json');
|
||||||
|
|
||||||
|
$this->assertEquals(array('hi'), $response->getData());
|
||||||
|
$this->assertEquals(300, $response->getStatus());
|
||||||
|
$this->assertEquals($expectedHeaders, $response->getHeaders());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public function testCustomFormatter() {
|
public function testCustomFormatter() {
|
||||||
$response = $this->controller->custom('hi');
|
$response = $this->controller->custom('hi');
|
||||||
$response = $this->controller->buildResponse($response, 'json');
|
$response = $this->controller->buildResponse($response, 'json');
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ownCloud - App Framework
|
||||||
|
*
|
||||||
|
* @author Bernhard Posselt
|
||||||
|
* @copyright 2014 Bernhard Posselt <dev@bernhard-posselt.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public
|
||||||
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace OC\AppFramework\Http;
|
||||||
|
|
||||||
|
|
||||||
|
use OCP\AppFramework\Http\DataResponse;
|
||||||
|
use OCP\AppFramework\Http;
|
||||||
|
|
||||||
|
|
||||||
|
class DataResponseTest extends \PHPUnit_Framework_TestCase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var DataResponse
|
||||||
|
*/
|
||||||
|
private $response;
|
||||||
|
|
||||||
|
protected function setUp() {
|
||||||
|
$this->response = new DataResponse();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testSetData() {
|
||||||
|
$params = array('hi', 'yo');
|
||||||
|
$this->response->setData($params);
|
||||||
|
|
||||||
|
$this->assertEquals(array('hi', 'yo'), $this->response->getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testConstructorAllowsToSetData() {
|
||||||
|
$data = array('hi');
|
||||||
|
$code = 300;
|
||||||
|
$response = new DataResponse($data, $code);
|
||||||
|
|
||||||
|
$this->assertEquals($data, $response->getData());
|
||||||
|
$this->assertEquals($code, $response->getStatus());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testConstructorAllowsToSetHeaders() {
|
||||||
|
$data = array('hi');
|
||||||
|
$code = 300;
|
||||||
|
$headers = array('test' => 'something');
|
||||||
|
$response = new DataResponse($data, $code, $headers);
|
||||||
|
|
||||||
|
$expectedHeaders = array('Cache-Control' => 'no-cache, must-revalidate');
|
||||||
|
$expectedHeaders = array_merge($expectedHeaders, $headers);
|
||||||
|
|
||||||
|
$this->assertEquals($data, $response->getData());
|
||||||
|
$this->assertEquals($code, $response->getStatus());
|
||||||
|
$this->assertEquals($expectedHeaders, $response->getHeaders());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testChainability() {
|
||||||
|
$params = array('hi', 'yo');
|
||||||
|
$this->response->setData($params)
|
||||||
|
->setStatus(Http::STATUS_NOT_FOUND);
|
||||||
|
|
||||||
|
$this->assertEquals(Http::STATUS_NOT_FOUND, $this->response->getStatus());
|
||||||
|
$this->assertEquals(array('hi', 'yo'), $this->response->getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -28,6 +28,7 @@ use OC\AppFramework\Middleware\MiddlewareDispatcher;
|
||||||
use OC\AppFramework\Utility\ControllerMethodReflector;
|
use OC\AppFramework\Utility\ControllerMethodReflector;
|
||||||
use OCP\AppFramework\Http;
|
use OCP\AppFramework\Http;
|
||||||
use OCP\AppFramework\Http\JSONResponse;
|
use OCP\AppFramework\Http\JSONResponse;
|
||||||
|
use OCP\AppFramework\Http\DataResponse;
|
||||||
use OCP\AppFramework\Controller;
|
use OCP\AppFramework\Controller;
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,6 +47,18 @@ class TestController extends Controller {
|
||||||
});
|
});
|
||||||
return array($int, $bool, $test, $test2);
|
return array($int, $bool, $test, $test2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $int
|
||||||
|
* @param bool $bool
|
||||||
|
*/
|
||||||
|
public function execDataResponse($int, $bool, $test=4, $test2=1) {
|
||||||
|
return new DataResponse(array(
|
||||||
|
'text' => array($int, $bool, $test, $test2)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -342,6 +355,31 @@ class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testResponseTransformsDataResponse() {
|
||||||
|
$this->request = new Request(array(
|
||||||
|
'post' => array(
|
||||||
|
'int' => '3',
|
||||||
|
'bool' => 'false'
|
||||||
|
),
|
||||||
|
'urlParams' => array(
|
||||||
|
'format' => 'json'
|
||||||
|
),
|
||||||
|
'method' => 'GET'
|
||||||
|
));
|
||||||
|
$this->dispatcher = new Dispatcher(
|
||||||
|
$this->http, $this->middlewareDispatcher, $this->reflector,
|
||||||
|
$this->request
|
||||||
|
);
|
||||||
|
$controller = new TestController('app', $this->request);
|
||||||
|
|
||||||
|
// reflector is supposed to be called once
|
||||||
|
$this->dispatcherPassthrough();
|
||||||
|
$response = $this->dispatcher->dispatch($controller, 'execDataResponse');
|
||||||
|
|
||||||
|
$this->assertEquals('{"text":[3,false,4,1]}', $response[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public function testResponseTransformedByAcceptHeader() {
|
public function testResponseTransformedByAcceptHeader() {
|
||||||
$this->request = new Request(array(
|
$this->request = new Request(array(
|
||||||
'post' => array(
|
'post' => array(
|
||||||
|
|
|
@ -48,6 +48,20 @@ class ResponseTest extends \PHPUnit_Framework_TestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function testSetHeaders(){
|
||||||
|
$expected = array(
|
||||||
|
'Last-Modified' => 1,
|
||||||
|
'ETag' => 3,
|
||||||
|
'Something-Else' => 'hi'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->childResponse->setHeaders($expected);
|
||||||
|
$headers = $this->childResponse->getHeaders();
|
||||||
|
|
||||||
|
$this->assertEquals($expected, $headers);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public function testAddHeaderValueNullDeletesIt(){
|
public function testAddHeaderValueNullDeletesIt(){
|
||||||
$this->childResponse->addHeader('hello', 'world');
|
$this->childResponse->addHeader('hello', 'world');
|
||||||
$this->childResponse->addHeader('hello', null);
|
$this->childResponse->addHeader('hello', null);
|
||||||
|
|
Loading…
Reference in New Issue