Adding ocs/v2.php with status code mapper
This commit is contained in:
parent
af7bcb43b1
commit
bacf1603ff
|
@ -1,4 +1,7 @@
|
|||
<?php
|
||||
use OCP\API;
|
||||
use OCP\AppFramework\Http;
|
||||
|
||||
/**
|
||||
* @author Bart Visscher <bartv@thisnet.nl>
|
||||
* @author Bernhard Posselt <dev@bernhard-posselt.com>
|
||||
|
@ -82,7 +85,7 @@ class OC_API {
|
|||
* @param array $requirements
|
||||
*/
|
||||
public static function register($method, $url, $action, $app,
|
||||
$authLevel = \OCP\API::USER_AUTH,
|
||||
$authLevel = API::USER_AUTH,
|
||||
$defaults = array(),
|
||||
$requirements = array()) {
|
||||
$name = strtolower($method).$url;
|
||||
|
@ -123,7 +126,7 @@ class OC_API {
|
|||
if(!self::isAuthorised($action)) {
|
||||
$responses[] = array(
|
||||
'app' => $action['app'],
|
||||
'response' => new OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED, 'Unauthorised'),
|
||||
'response' => new OC_OCS_Result(null, API::RESPOND_UNAUTHORISED, 'Unauthorised'),
|
||||
'shipped' => OC_App::isShipped($action['app']),
|
||||
);
|
||||
continue;
|
||||
|
@ -131,7 +134,7 @@ class OC_API {
|
|||
if(!is_callable($action['action'])) {
|
||||
$responses[] = array(
|
||||
'app' => $action['app'],
|
||||
'response' => new OC_OCS_Result(null, \OCP\API::RESPOND_NOT_FOUND, 'Api method not found'),
|
||||
'response' => new OC_OCS_Result(null, API::RESPOND_NOT_FOUND, 'Api method not found'),
|
||||
'shipped' => OC_App::isShipped($action['app']),
|
||||
);
|
||||
continue;
|
||||
|
@ -252,15 +255,15 @@ class OC_API {
|
|||
private static function isAuthorised($action) {
|
||||
$level = $action['authlevel'];
|
||||
switch($level) {
|
||||
case \OCP\API::GUEST_AUTH:
|
||||
case API::GUEST_AUTH:
|
||||
// Anyone can access
|
||||
return true;
|
||||
break;
|
||||
case \OCP\API::USER_AUTH:
|
||||
case API::USER_AUTH:
|
||||
// User required
|
||||
return self::loginUser();
|
||||
break;
|
||||
case \OCP\API::SUBADMIN_AUTH:
|
||||
case API::SUBADMIN_AUTH:
|
||||
// Check for subadmin
|
||||
$user = self::loginUser();
|
||||
if(!$user) {
|
||||
|
@ -275,7 +278,7 @@ class OC_API {
|
|||
}
|
||||
}
|
||||
break;
|
||||
case \OCP\API::ADMIN_AUTH:
|
||||
case API::ADMIN_AUTH:
|
||||
// Check for admin
|
||||
$user = self::loginUser();
|
||||
if(!$user) {
|
||||
|
@ -342,10 +345,18 @@ class OC_API {
|
|||
*/
|
||||
public static function respond($result, $format='xml') {
|
||||
// Send 401 headers if unauthorised
|
||||
if($result->getStatusCode() === \OCP\API::RESPOND_UNAUTHORISED) {
|
||||
if($result->getStatusCode() === API::RESPOND_UNAUTHORISED) {
|
||||
header('WWW-Authenticate: Basic realm="Authorisation Required"');
|
||||
header('HTTP/1.0 401 Unauthorized');
|
||||
}
|
||||
|
||||
if (self::isV2()) {
|
||||
$statusCode = self::mapStatusCodes($result->getStatusCode());
|
||||
if (!is_null($statusCode)) {
|
||||
OC_Response::setStatus($statusCode);
|
||||
}
|
||||
}
|
||||
|
||||
$response = array(
|
||||
'ocs' => array(
|
||||
'meta' => $result->getMeta(),
|
||||
|
@ -415,5 +426,42 @@ class OC_API {
|
|||
header('Content-Type: application/octet-stream; charset=utf-8');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return boolean
|
||||
*/
|
||||
private static function isV2() {
|
||||
$request = \OC::$server->getRequest();
|
||||
$script = $request->getScriptName();
|
||||
|
||||
return $script === '/ocs/v2.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param integer $sc
|
||||
*/
|
||||
public static function mapStatusCodes($sc) {
|
||||
switch ($sc) {
|
||||
case API::RESPOND_NOT_FOUND:
|
||||
return Http::STATUS_NOT_FOUND;
|
||||
case API::RESPOND_SERVER_ERROR:
|
||||
return Http::STATUS_INTERNAL_SERVER_ERROR;
|
||||
case API::RESPOND_UNKNOWN_ERROR:
|
||||
return Http::STATUS_INTERNAL_SERVER_ERROR;
|
||||
case API::RESPOND_UNAUTHORISED:
|
||||
// already handled for v1
|
||||
return null;
|
||||
case 100:
|
||||
return Http::STATUS_OK;
|
||||
}
|
||||
// any 2xx, 4xx and 5xx will be used as is
|
||||
if ($sc >= 200 && $sc < 600) {
|
||||
return $sc;
|
||||
}
|
||||
|
||||
// any error codes > 100 are treated as client errors
|
||||
if ($sc > 100 && $sc < 200) {
|
||||
return Http::STATUS_BAD_REQUEST;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
*
|
||||
* @copyright Copyright (c) 2015, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program 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, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
require_once 'v1.php';
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
use OCP\AppFramework\Http;
|
||||
|
||||
/**
|
||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
*
|
||||
* @copyright Copyright (c) 2015, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program 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, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
class OcsResponseTest extends \Test\TestCase {
|
||||
|
||||
/**
|
||||
* @dataProvider providesStatusCodes
|
||||
*/
|
||||
public function testStatusCodeMapper($expected, $sc) {
|
||||
$result = OC_API::mapStatusCodes($sc);
|
||||
$this->assertEquals($expected, $result);
|
||||
}
|
||||
|
||||
public function providesStatusCodes() {
|
||||
return [
|
||||
[Http::STATUS_OK, 100],
|
||||
[Http::STATUS_BAD_REQUEST, 104],
|
||||
];
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue