-
Notifications
You must be signed in to change notification settings - Fork 0
/
Server.php
60 lines (55 loc) · 1.55 KB
/
Server.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
declare(strict_types=1);
namespace DAIA;
/**
* DAIA Server boilerplate.
*
* A Server derived from this class must implement method `queryHandler`.
* This method should return a DAIA Response or throw a DAIA Error. A Server
* can be queried via method `query`.
*
* ~~~php
* use DAIA\Request;
* use DAIA\Response;
*
* class MyDAIAServer extends \DAIA\Server {
* public function queryHandler(Request $request): Response {
* if (...) throw new \DAIA\Error(...);
* return new Response(...);
* }
* }
*
* $server = new MyDAIAServer();
* $response = $server->query($request);
* ~~~
*
* @package DAIA
*/
abstract class Server
{
public abstract function queryHandler(Request $request): Response;
protected function exceptionHandler($context) { }
public function query(Request $request): ResponseData
{
if ($request->method == 'OPTIONS') {
return new OptionsResponse();
}
try {
if (array_search($request->method, ['GET','HEAD','OPTIONS']) === false) {
throw new Error(405, 'Unexpected HTTP verb');
}
return $this->queryHandler($request);
} catch(Error $e) {
return $e->response;
} catch(\Throwable $e) {
if ($this->exceptionHandler([
'request' => $request,
'server' => $this,
'exception' => $e
])) {
throw $e;
}
return new ErrorResponse(500, 'Unexpected internal server error');
}
}
}