/** * Detect and set the output format and mimetype * * This method bases it's detection on the ACCEPT header passed * to the API. * * @return array of mimetype, outputFormat and params */ public function detectOutputFormat() { $mimetypes = Frapi_Output::getMimeTypeMap(); if ($mimetypes) { $this->mimeMaps = $mimetypes; } $types = $this->parseAcceptHeader(); $return = array('outputFormat' => false, 'mimetype' => false, 'params' => array()); if (!empty($types)) { $mimetypes = $this->parseMimeTypes(); foreach ($types as $type) { if (isset($this->mimeMaps[$type['mimetype']])) { $return['outputFormat'] = $this->mimeMaps[$type['mimetype']]; $return['mimetype'] = $type['mimetype']; $return['params'] = isset($type['params']) ? $type['params'] : array(); break; } else { foreach ($mimetypes as $mimetype) { $matches = array(); if (preg_match($mimetype['pattern'], $type['mimetype'], $matches)) { $return['mimetype'] = $type['mimetype']; $return['params'] = isset($type['params']) ? $type['params'] : array(); if ($mimetype['output_format'][0] == ':') { $format = substr($mimetype['output_format'], 1); if (!empty($matches[$format]) && Frapi_Rules::validateOutputType($matches[$format])) { $return['outputFormat'] = $matches[$format]; } } else { $return['outputFormat'] = $mimetype['output_format']; } foreach ($mimetype['params'] as $param) { $return['params'][$param] = $matches[$param]; } break 2; } } } } } // Final catch-all (for cases like Accept: */*) if (!$return['outputFormat']) { $return['outputFormat'] = $this->getDefaultFormatFromConfiguration(); $return['mimetype'] = Frapi_Output::getMimeTypeByFormat($return['outputFormat']); } $this->setOutputFormat($return['outputFormat']); return $return; }
/** * reads the Content-Type header; sets request body format if a valid mime type exists * * @return void */ public function setInputFormat() { $contentType = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : null; $mimetypes = Frapi_Output::getMimeTypeMap(); if ($mimetypes) { $this->mimeMaps = $mimetypes; } if (!empty($contentType) && isset($this->mimeMaps[$contentType]) && in_array($this->mimeMaps[$contentType], $this->allowedInputTypes)) { $this->inputFormat = $this->mimeMaps[$contentType]; } }