aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorBernhard Posselt <dev@bernhard-posselt.com>2014-06-11 00:54:25 +0200
committerBernhard Posselt <dev@bernhard-posselt.com>2014-06-11 00:54:25 +0200
commit1002281dae6650684ba06d21abeba8ff8ba070d9 (patch)
treea817c33678ccf52526c15e0027f16836a293b968 /lib
parent077a542d59ea5c992ebb1b3ac0e6117f6289582c (diff)
downloadnextcloud-server-1002281dae6650684ba06d21abeba8ff8ba070d9.tar.gz
nextcloud-server-1002281dae6650684ba06d21abeba8ff8ba070d9.zip
handle http accept headers more gracefully
Diffstat (limited to 'lib')
-rw-r--r--lib/private/appframework/http/dispatcher.php29
-rw-r--r--lib/public/appframework/controller.php24
2 files changed, 35 insertions, 18 deletions
diff --git a/lib/private/appframework/http/dispatcher.php b/lib/private/appframework/http/dispatcher.php
index 442e33ee726..c5ec345489a 100644
--- a/lib/private/appframework/http/dispatcher.php
+++ b/lib/private/appframework/http/dispatcher.php
@@ -75,7 +75,7 @@ class Dispatcher {
$out = array(null, array(), null);
try {
- // prefill reflector with everything thats needed for the
+ // prefill reflector with everything thats needed for the
// middlewares
$this->reflector->reflect($controller, $methodName);
@@ -132,14 +132,14 @@ class Dispatcher {
// it to the type annotated in the @param annotation
$value = $this->request->getParam($param, $default);
$type = $this->reflector->getType($param);
-
- // if this is submitted using GET or a POST form, 'false' should be
+
+ // if this is submitted using GET or a POST form, 'false' should be
// converted to false
if(($type === 'bool' || $type === 'boolean') &&
- $value === 'false' &&
+ $value === 'false' &&
(
$this->request->method === 'GET' ||
- strpos($this->request->getHeader('Content-Type'),
+ strpos($this->request->getHeader('Content-Type'),
'application/x-www-form-urlencoded') !== false
)
) {
@@ -148,7 +148,7 @@ class Dispatcher {
} elseif(in_array($type, $types)) {
settype($value, $type);
}
-
+
$arguments[] = $value;
}
@@ -156,22 +156,15 @@ class Dispatcher {
// format response if not of type response
if(!($response instanceof Response)) {
-
+
// get format from the url format or request format parameter
$format = $this->request->getParam('format');
-
+
// if none is given try the first Accept header
if($format === null) {
- $header = $this->request->getHeader('Accept');
- $formats = explode(',', $header);
-
- if($header !== null && count($formats) > 0) {
- $accept = strtolower(trim($formats[0]));
- $format = str_replace('application/', '', $accept);
- } else {
- $format = 'json';
- }
- }
+ $headers = $this->request->getHeader('Accept');
+ $format = $controller->getResponderByHTTPHeader($headers);
+ }
$response = $controller->buildResponse($response, $format);
}
diff --git a/lib/public/appframework/controller.php b/lib/public/appframework/controller.php
index 79491902bfd..b3bff5e05f5 100644
--- a/lib/public/appframework/controller.php
+++ b/lib/public/appframework/controller.php
@@ -70,6 +70,30 @@ abstract class Controller {
}
+ /**
+ * Parses an HTTP accept header and returns the supported responder type
+ * @param string $acceptHeader
+ * @return string the responder type
+ */
+ public function getResponderByHTTPHeader($acceptHeader) {
+ $headers = explode(',', $acceptHeader);
+
+ // return the first matching responder
+ foreach ($headers as $header) {
+ $header = trim($header);
+
+ $responder = str_replace('application/', '', $header);
+
+ if (array_key_exists($responder, $this->responders)) {
+ return $responder;
+ }
+ }
+
+ // no matching header defaults to json
+ return 'json';
+ }
+
+
/**
* Registers a formatter for a type
* @param string $format