lodfe/app/Http/Middleware/ContentNegotiatorMiddleware.php

80 lines
2.3 KiB
PHP
Raw Normal View History

2020-01-19 21:24:54 +09:00
<?php
namespace App\Http\Middleware;
use Closure;
class ContentNegotiatorMiddleware
{
public $defaultType = 'text/html';
2020-01-20 01:09:35 +09:00
public static $acceptableTypes = [
2020-01-19 21:24:54 +09:00
'text/html' => 'html',
'application/xhtml+xml' => 'html',
'text/n3' => 'data',
'text/turtle' => 'data',
'application/n-triples' => 'data',
'application/rdf+xml' => 'data',
2020-01-20 01:09:35 +09:00
'application/json' => 'data',
'application/ld+json' => 'data',
2020-01-19 21:24:54 +09:00
];
2020-01-20 01:09:35 +09:00
public static $fileExtensions = [
2020-01-19 21:24:54 +09:00
'text/html' => '.html',
'application/xhtml+xml' => '.html',
'text/turtle' => '.ttl',
'application/n-triples' => '.nt',
'application/rdf+xml' => '.rdf',
2020-01-20 01:09:35 +09:00
'application/json' => '.json',
'application/ld+json' => '.jsonld',
2020-01-19 21:24:54 +09:00
];
2020-01-20 01:09:35 +09:00
public static function mimetypeFromExtension($ext)
{
$extensionToMimetype = array_flip(self::$fileExtensions);
return array_key_exists($ext, $extensionToMimetype)
? $extensionToMimetype[$ext] : null;
}
2020-01-19 21:24:54 +09:00
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$datasetName = explode('.', $request->route()[1]['as'])[1];
// parse HTTP "Accept" header
$accepts = [];
foreach (explode(',', $request->header('accept')) as $accept) {
$accept = explode(';', $accept);
if (count($accept) === 2 && preg_match('/q=([\d\.]+)/', $accept[1], $m)) {
$accepts[trim($accept[0])] = (float)$m[1];
} elseif (count($accept) !== 2) {
$accepts[trim($accept[0])] = 1.0;
}
}
arsort($accepts);
// 303 redirect
$id = $request->route('id');
$negotiatedType = $this->defaultType;
foreach ($accepts as $mime => $q) {
2020-01-20 01:09:35 +09:00
if (array_key_exists($mime, self::$acceptableTypes)) {
2020-01-19 21:24:54 +09:00
$negotiatedType = $mime;
}
}
2020-01-20 01:09:35 +09:00
$redirectTo = self::$acceptableTypes[$negotiatedType] . '.' . $datasetName;
2020-01-19 21:24:54 +09:00
$params = ['id' => $id];
if (substr($redirectTo, 0, 4) === 'data') {
2020-01-20 01:09:35 +09:00
$params['ext'] = self::$fileExtensions[$negotiatedType];
2020-01-19 21:24:54 +09:00
}
return redirect()->route($redirectTo, $params, 303);
}
}