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);
|
|
|
|
}
|
|
|
|
}
|