Skip to content

Commit

Permalink
add dataresponse
Browse files Browse the repository at this point in the history
fix docstrings

adjust copyright date

another copyright date update

another header update

implement third headers argument, fix indention, fix docstrings

fix docstrings
  • Loading branch information
Bernhard Posselt committed Oct 29, 2014
1 parent c93ddf7 commit 0696099
Show file tree
Hide file tree
Showing 8 changed files with 292 additions and 29 deletions.
5 changes: 3 additions & 2 deletions lib/private/appframework/http/dispatcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@

use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Http\DataResponse;
use OCP\IRequest;


Expand Down Expand Up @@ -154,8 +155,8 @@ private function executeController($controller, $methodName) {

$response = call_user_func_array(array($controller, $methodName), $arguments);

// format response if not of type response
if(!($response instanceof Response)) {
// format response
if($response instanceof DataResponse || !($response instanceof Response)) {

// get format from the url format or request format parameter
$format = $this->request->getParam('format');
Expand Down
14 changes: 12 additions & 2 deletions lib/public/appframework/controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\DataResponse;
use OCP\IRequest;


Expand Down Expand Up @@ -63,8 +64,17 @@ public function __construct($appName,

// default responders
$this->responders = array(
'json' => function ($response) {
return new JSONResponse($response);
'json' => function ($data) {
if ($data instanceof DataResponse) {
$response = new JSONResponse(
$data->getData(),
$data->getStatus()
);
$response->setHeaders($data->getHeaders());
return $response;
} else {
return new JSONResponse($data);
}
}
);
}
Expand Down
79 changes: 79 additions & 0 deletions lib/public/appframework/http/dataresponse.php
Original file line number Diff line number Diff line change
@@ -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;
}


}
14 changes: 13 additions & 1 deletion lib/public/appframework/http/response.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public function cacheFor($cacheSeconds) {
*/
public function addHeader($name, $value) {
$name = trim($name); // always remove leading and trailing whitespace
// to be able to reliably check for security
// to be able to reliably check for security
// headers

if(is_null($value)) {
Expand All @@ -106,6 +106,18 @@ public function addHeader($name, $value) {
}


/**
* 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
* @return array the headers
Expand Down
22 changes: 22 additions & 0 deletions tests/lib/appframework/controller/ControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
use OC\AppFramework\Http\Request;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\DataResponse;


class ChildController extends Controller {
Expand All @@ -45,6 +46,12 @@ public function custom($in) {

return $in;
}

public function customDataResponse($in) {
$response = new DataResponse($in, 300);
$response->addHeader('test', 'something');
return $response;
}
};

class ControllerTest extends \PHPUnit_Framework_TestCase {
Expand Down Expand Up @@ -161,6 +168,21 @@ public function testFormat() {
}


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() {
$response = $this->controller->custom('hi');
$response = $this->controller->buildResponse($response, 'json');
Expand Down
87 changes: 87 additions & 0 deletions tests/lib/appframework/http/DataResponseTest.php
Original file line number Diff line number Diff line change
@@ -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());
}


}
Loading

0 comments on commit 0696099

Please sign in to comment.