blob: c05d8e774a0c4d408031bf6a993afdb304fc2e2a (
plain) (
blame)
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
<?php
namespace MediaWiki\Rest;
abstract class Handler {
/** @var Router */
private $router;
/** @var RequestInterface */
private $request;
/** @var array */
private $config;
/** @var ResponseFactory */
private $responseFactory;
/**
* Initialise with dependencies from the Router. This is called after construction.
* @internal
*/
public function init( Router $router, RequestInterface $request, array $config,
ResponseFactory $responseFactory
) {
$this->router = $router;
$this->request = $request;
$this->config = $config;
$this->responseFactory = $responseFactory;
}
/**
* Get the Router. The return type declaration causes it to raise
* a fatal error if init() has not yet been called.
*/
protected function getRouter(): Router {
return $this->router;
}
/**
* Get the current request. The return type declaration causes it to raise
* a fatal error if init() has not yet been called.
*
* @return RequestInterface
*/
public function getRequest(): RequestInterface {
return $this->request;
}
/**
* Get the configuration array for the current route. The return type
* declaration causes it to raise a fatal error if init() has not
* been called.
*
* @return array
*/
public function getConfig(): array {
return $this->config;
}
/**
* Get the ResponseFactory which can be used to generate Response objects.
* This will raise a fatal error if init() has not been
* called.
*
* @return ResponseFactory
*/
public function getResponseFactory(): ResponseFactory {
return $this->responseFactory;
}
/**
* The subclass should override this to provide the maximum last modified
* timestamp for the current request. This is called before execute() in
* order to decide whether to send a 304.
*
* The timestamp can be in any format accepted by ConvertibleTimestamp, or
* null to indicate that the timestamp is unknown.
*
* @return bool|string|int|float|\DateTime|null
*/
protected function getLastModified() {
return null;
}
/**
* The subclass should override this to provide an ETag for the current
* request. This is called before execute() in order to decide whether to
* send a 304.
*
* See RFC 7232 § 2.3 for semantics.
*
* @return string|null
*/
protected function getETag() {
return null;
}
/**
* Indicates whether this route requires read rights.
*
* The handler should override this if it does not need to read from the
* wiki. This is uncommon, but may be useful for login and other account
* management APIs.
*
* @return bool
*/
public function needsReadAccess() {
return true;
}
/**
* Indicates whether this route requires write access.
*
* The handler should override this if the route does not need to write to
* the database.
*
* This should return true for routes that may require synchronous database writes.
* Modules that do not need such writes should also not rely on master database access,
* since only read queries are needed and each master DB is a single point of failure.
*
* @return bool
*/
public function needsWriteAccess() {
return true;
}
/**
* Execute the handler. This is called after parameter validation. The
* return value can either be a Response or any type accepted by
* ResponseFactory::createFromReturnValue().
*
* To automatically construct an error response, execute() should throw a
* RestException. Such exceptions will not be logged like a normal exception.
*
* If execute() throws any other kind of exception, the exception will be
* logged and a generic 500 error page will be shown.
*
* @return mixed
*/
abstract public function execute();
}
|