1*4a64e381SAndroid Build Coastguard Worker /*
2*4a64e381SAndroid Build Coastguard Worker * Copyright (c) 2017, The OpenThread Authors.
3*4a64e381SAndroid Build Coastguard Worker * All rights reserved.
4*4a64e381SAndroid Build Coastguard Worker *
5*4a64e381SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*4a64e381SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
7*4a64e381SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
8*4a64e381SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
9*4a64e381SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
10*4a64e381SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
11*4a64e381SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
12*4a64e381SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the
13*4a64e381SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products
14*4a64e381SAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
15*4a64e381SAndroid Build Coastguard Worker *
16*4a64e381SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*4a64e381SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*4a64e381SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*4a64e381SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*4a64e381SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*4a64e381SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*4a64e381SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*4a64e381SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*4a64e381SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*4a64e381SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*4a64e381SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
27*4a64e381SAndroid Build Coastguard Worker */
28*4a64e381SAndroid Build Coastguard Worker
29*4a64e381SAndroid Build Coastguard Worker /**
30*4a64e381SAndroid Build Coastguard Worker * @file
31*4a64e381SAndroid Build Coastguard Worker * This file implements the web server of border router
32*4a64e381SAndroid Build Coastguard Worker */
33*4a64e381SAndroid Build Coastguard Worker
34*4a64e381SAndroid Build Coastguard Worker #define OTBR_LOG_TAG "WEB"
35*4a64e381SAndroid Build Coastguard Worker
36*4a64e381SAndroid Build Coastguard Worker #include "web/web-service/web_server.hpp"
37*4a64e381SAndroid Build Coastguard Worker
38*4a64e381SAndroid Build Coastguard Worker #define BOOST_NO_CXX11_SCOPED_ENUMS
39*4a64e381SAndroid Build Coastguard Worker #include <boost/filesystem.hpp>
40*4a64e381SAndroid Build Coastguard Worker #undef BOOST_NO_CXX11_SCOPED_ENUMS
41*4a64e381SAndroid Build Coastguard Worker
42*4a64e381SAndroid Build Coastguard Worker #include <server_http.hpp>
43*4a64e381SAndroid Build Coastguard Worker
44*4a64e381SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
45*4a64e381SAndroid Build Coastguard Worker #include "common/logging.hpp"
46*4a64e381SAndroid Build Coastguard Worker
47*4a64e381SAndroid Build Coastguard Worker #define OT_ADD_PREFIX_PATH "^/add_prefix"
48*4a64e381SAndroid Build Coastguard Worker #define OT_AVAILABLE_NETWORK_PATH "^/available_network$"
49*4a64e381SAndroid Build Coastguard Worker #define OT_DELETE_PREFIX_PATH "^/delete_prefix"
50*4a64e381SAndroid Build Coastguard Worker #define OT_FORM_NETWORK_PATH "^/form_network$"
51*4a64e381SAndroid Build Coastguard Worker #define OT_GET_NETWORK_PATH "^/get_properties$"
52*4a64e381SAndroid Build Coastguard Worker #define OT_JOIN_NETWORK_PATH "^/join_network$"
53*4a64e381SAndroid Build Coastguard Worker #define OT_GET_QRCODE_PATH "^/get_qrcode$"
54*4a64e381SAndroid Build Coastguard Worker #define OT_SET_NETWORK_PATH "^/settings$"
55*4a64e381SAndroid Build Coastguard Worker #define OT_COMMISSIONER_START_PATH "^/commission$"
56*4a64e381SAndroid Build Coastguard Worker #define OT_REQUEST_METHOD_GET "GET"
57*4a64e381SAndroid Build Coastguard Worker #define OT_REQUEST_METHOD_POST "POST"
58*4a64e381SAndroid Build Coastguard Worker #define OT_RESPONSE_SUCCESS_STATUS "HTTP/1.1 200 OK\r\n"
59*4a64e381SAndroid Build Coastguard Worker #define OT_RESPONSE_HEADER_LENGTH "Content-Length: "
60*4a64e381SAndroid Build Coastguard Worker #define OT_RESPONSE_HEADER_CSS_TYPE "\r\nContent-Type: text/css"
61*4a64e381SAndroid Build Coastguard Worker #define OT_RESPONSE_HEADER_TEXT_HTML_TYPE "\r\nContent-Type: text/html; charset=utf-8"
62*4a64e381SAndroid Build Coastguard Worker #define OT_RESPONSE_HEADER_TYPE "Content-Type: application/json\r\n charset=utf-8"
63*4a64e381SAndroid Build Coastguard Worker #define OT_RESPONSE_PLACEHOLD "\r\n\r\n"
64*4a64e381SAndroid Build Coastguard Worker #define OT_RESPONSE_FAILURE_STATUS "HTTP/1.1 400 Bad Request\r\n"
65*4a64e381SAndroid Build Coastguard Worker #define OT_BUFFER_SIZE 1024
66*4a64e381SAndroid Build Coastguard Worker
67*4a64e381SAndroid Build Coastguard Worker namespace otbr {
68*4a64e381SAndroid Build Coastguard Worker namespace Web {
69*4a64e381SAndroid Build Coastguard Worker
EscapeHtml(std::string & content)70*4a64e381SAndroid Build Coastguard Worker static void EscapeHtml(std::string &content)
71*4a64e381SAndroid Build Coastguard Worker {
72*4a64e381SAndroid Build Coastguard Worker std::string output;
73*4a64e381SAndroid Build Coastguard Worker
74*4a64e381SAndroid Build Coastguard Worker output.reserve(content.size());
75*4a64e381SAndroid Build Coastguard Worker for (char c : content)
76*4a64e381SAndroid Build Coastguard Worker {
77*4a64e381SAndroid Build Coastguard Worker switch (c)
78*4a64e381SAndroid Build Coastguard Worker {
79*4a64e381SAndroid Build Coastguard Worker case '&':
80*4a64e381SAndroid Build Coastguard Worker output.append("&");
81*4a64e381SAndroid Build Coastguard Worker break;
82*4a64e381SAndroid Build Coastguard Worker case '<':
83*4a64e381SAndroid Build Coastguard Worker output.append("<");
84*4a64e381SAndroid Build Coastguard Worker break;
85*4a64e381SAndroid Build Coastguard Worker case '>':
86*4a64e381SAndroid Build Coastguard Worker output.append(">");
87*4a64e381SAndroid Build Coastguard Worker break;
88*4a64e381SAndroid Build Coastguard Worker case '"':
89*4a64e381SAndroid Build Coastguard Worker output.append(""");
90*4a64e381SAndroid Build Coastguard Worker break;
91*4a64e381SAndroid Build Coastguard Worker case '\'':
92*4a64e381SAndroid Build Coastguard Worker output.append("'");
93*4a64e381SAndroid Build Coastguard Worker break;
94*4a64e381SAndroid Build Coastguard Worker default:
95*4a64e381SAndroid Build Coastguard Worker output.push_back(c);
96*4a64e381SAndroid Build Coastguard Worker break;
97*4a64e381SAndroid Build Coastguard Worker }
98*4a64e381SAndroid Build Coastguard Worker }
99*4a64e381SAndroid Build Coastguard Worker
100*4a64e381SAndroid Build Coastguard Worker output.swap(content);
101*4a64e381SAndroid Build Coastguard Worker }
102*4a64e381SAndroid Build Coastguard Worker
WebServer(void)103*4a64e381SAndroid Build Coastguard Worker WebServer::WebServer(void)
104*4a64e381SAndroid Build Coastguard Worker : mServer(new HttpServer())
105*4a64e381SAndroid Build Coastguard Worker {
106*4a64e381SAndroid Build Coastguard Worker }
107*4a64e381SAndroid Build Coastguard Worker
~WebServer(void)108*4a64e381SAndroid Build Coastguard Worker WebServer::~WebServer(void)
109*4a64e381SAndroid Build Coastguard Worker {
110*4a64e381SAndroid Build Coastguard Worker delete mServer;
111*4a64e381SAndroid Build Coastguard Worker }
112*4a64e381SAndroid Build Coastguard Worker
Init()113*4a64e381SAndroid Build Coastguard Worker void WebServer::Init()
114*4a64e381SAndroid Build Coastguard Worker {
115*4a64e381SAndroid Build Coastguard Worker std::string networkName, extPanId;
116*4a64e381SAndroid Build Coastguard Worker
117*4a64e381SAndroid Build Coastguard Worker if (mWpanService.GetWpanServiceStatus(networkName, extPanId) > 0)
118*4a64e381SAndroid Build Coastguard Worker {
119*4a64e381SAndroid Build Coastguard Worker return;
120*4a64e381SAndroid Build Coastguard Worker }
121*4a64e381SAndroid Build Coastguard Worker }
122*4a64e381SAndroid Build Coastguard Worker
StartWebServer(const char * aIfName,const char * aListenAddr,uint16_t aPort)123*4a64e381SAndroid Build Coastguard Worker void WebServer::StartWebServer(const char *aIfName, const char *aListenAddr, uint16_t aPort)
124*4a64e381SAndroid Build Coastguard Worker {
125*4a64e381SAndroid Build Coastguard Worker if (aListenAddr != nullptr)
126*4a64e381SAndroid Build Coastguard Worker {
127*4a64e381SAndroid Build Coastguard Worker mServer->config.address = aListenAddr;
128*4a64e381SAndroid Build Coastguard Worker }
129*4a64e381SAndroid Build Coastguard Worker mServer->config.port = aPort;
130*4a64e381SAndroid Build Coastguard Worker mWpanService.SetInterfaceName(aIfName);
131*4a64e381SAndroid Build Coastguard Worker Init();
132*4a64e381SAndroid Build Coastguard Worker ResponseGetQRCode();
133*4a64e381SAndroid Build Coastguard Worker ResponseJoinNetwork();
134*4a64e381SAndroid Build Coastguard Worker ResponseFormNetwork();
135*4a64e381SAndroid Build Coastguard Worker ResponseAddOnMeshPrefix();
136*4a64e381SAndroid Build Coastguard Worker ResponseDeleteOnMeshPrefix();
137*4a64e381SAndroid Build Coastguard Worker ResponseGetStatus();
138*4a64e381SAndroid Build Coastguard Worker ResponseGetAvailableNetwork();
139*4a64e381SAndroid Build Coastguard Worker ResponseCommission();
140*4a64e381SAndroid Build Coastguard Worker DefaultHttpResponse();
141*4a64e381SAndroid Build Coastguard Worker
142*4a64e381SAndroid Build Coastguard Worker try
143*4a64e381SAndroid Build Coastguard Worker {
144*4a64e381SAndroid Build Coastguard Worker mServer->start();
145*4a64e381SAndroid Build Coastguard Worker } catch (const std::exception &e)
146*4a64e381SAndroid Build Coastguard Worker {
147*4a64e381SAndroid Build Coastguard Worker otbrLogCrit("failed to start web server: %s", e.what());
148*4a64e381SAndroid Build Coastguard Worker abort();
149*4a64e381SAndroid Build Coastguard Worker }
150*4a64e381SAndroid Build Coastguard Worker }
151*4a64e381SAndroid Build Coastguard Worker
StopWebServer(void)152*4a64e381SAndroid Build Coastguard Worker void WebServer::StopWebServer(void)
153*4a64e381SAndroid Build Coastguard Worker {
154*4a64e381SAndroid Build Coastguard Worker try
155*4a64e381SAndroid Build Coastguard Worker {
156*4a64e381SAndroid Build Coastguard Worker mServer->stop();
157*4a64e381SAndroid Build Coastguard Worker } catch (const std::exception &e)
158*4a64e381SAndroid Build Coastguard Worker {
159*4a64e381SAndroid Build Coastguard Worker otbrLogCrit("failed to stop web server: %s", e.what());
160*4a64e381SAndroid Build Coastguard Worker }
161*4a64e381SAndroid Build Coastguard Worker }
162*4a64e381SAndroid Build Coastguard Worker
HandleHttpRequest(const char * aUrl,const char * aMethod,HttpRequestCallback aCallback)163*4a64e381SAndroid Build Coastguard Worker void WebServer::HandleHttpRequest(const char *aUrl, const char *aMethod, HttpRequestCallback aCallback)
164*4a64e381SAndroid Build Coastguard Worker {
165*4a64e381SAndroid Build Coastguard Worker mServer->resource[aUrl][aMethod] = [aCallback, this](std::shared_ptr<HttpServer::Response> response,
166*4a64e381SAndroid Build Coastguard Worker std::shared_ptr<HttpServer::Request> request) {
167*4a64e381SAndroid Build Coastguard Worker try
168*4a64e381SAndroid Build Coastguard Worker {
169*4a64e381SAndroid Build Coastguard Worker std::string httpResponse;
170*4a64e381SAndroid Build Coastguard Worker if (aCallback != nullptr)
171*4a64e381SAndroid Build Coastguard Worker {
172*4a64e381SAndroid Build Coastguard Worker httpResponse = aCallback(request->content.string(), this);
173*4a64e381SAndroid Build Coastguard Worker }
174*4a64e381SAndroid Build Coastguard Worker
175*4a64e381SAndroid Build Coastguard Worker *response << OT_RESPONSE_SUCCESS_STATUS << OT_RESPONSE_HEADER_LENGTH << httpResponse.length()
176*4a64e381SAndroid Build Coastguard Worker << OT_RESPONSE_PLACEHOLD << httpResponse;
177*4a64e381SAndroid Build Coastguard Worker } catch (std::exception &e)
178*4a64e381SAndroid Build Coastguard Worker {
179*4a64e381SAndroid Build Coastguard Worker std::string content = e.what();
180*4a64e381SAndroid Build Coastguard Worker EscapeHtml(content);
181*4a64e381SAndroid Build Coastguard Worker *response << OT_RESPONSE_FAILURE_STATUS << OT_RESPONSE_HEADER_LENGTH << strlen(e.what())
182*4a64e381SAndroid Build Coastguard Worker << OT_RESPONSE_PLACEHOLD << content;
183*4a64e381SAndroid Build Coastguard Worker }
184*4a64e381SAndroid Build Coastguard Worker };
185*4a64e381SAndroid Build Coastguard Worker }
186*4a64e381SAndroid Build Coastguard Worker
DefaultResourceSend(const HttpServer & aServer,const std::shared_ptr<HttpServer::Response> & aResponse,const std::shared_ptr<std::ifstream> & aIfStream)187*4a64e381SAndroid Build Coastguard Worker void DefaultResourceSend(const HttpServer &aServer,
188*4a64e381SAndroid Build Coastguard Worker const std::shared_ptr<HttpServer::Response> &aResponse,
189*4a64e381SAndroid Build Coastguard Worker const std::shared_ptr<std::ifstream> &aIfStream)
190*4a64e381SAndroid Build Coastguard Worker {
191*4a64e381SAndroid Build Coastguard Worker static std::vector<char> buffer(OT_BUFFER_SIZE); // Safe when server is running on one thread
192*4a64e381SAndroid Build Coastguard Worker
193*4a64e381SAndroid Build Coastguard Worker std::streamsize readLength;
194*4a64e381SAndroid Build Coastguard Worker
195*4a64e381SAndroid Build Coastguard Worker if ((readLength = aIfStream->read(&buffer[0], buffer.size()).gcount()) > 0)
196*4a64e381SAndroid Build Coastguard Worker {
197*4a64e381SAndroid Build Coastguard Worker aResponse->write(&buffer[0], readLength);
198*4a64e381SAndroid Build Coastguard Worker if (readLength == static_cast<std::streamsize>(buffer.size()))
199*4a64e381SAndroid Build Coastguard Worker {
200*4a64e381SAndroid Build Coastguard Worker aResponse->send([&aServer, aResponse, aIfStream](const boost::system::error_code &ec) {
201*4a64e381SAndroid Build Coastguard Worker if (!ec)
202*4a64e381SAndroid Build Coastguard Worker {
203*4a64e381SAndroid Build Coastguard Worker DefaultResourceSend(aServer, aResponse, aIfStream);
204*4a64e381SAndroid Build Coastguard Worker }
205*4a64e381SAndroid Build Coastguard Worker else
206*4a64e381SAndroid Build Coastguard Worker {
207*4a64e381SAndroid Build Coastguard Worker std::cerr << "Connection interrupted" << std::endl;
208*4a64e381SAndroid Build Coastguard Worker }
209*4a64e381SAndroid Build Coastguard Worker });
210*4a64e381SAndroid Build Coastguard Worker }
211*4a64e381SAndroid Build Coastguard Worker }
212*4a64e381SAndroid Build Coastguard Worker }
213*4a64e381SAndroid Build Coastguard Worker
DefaultHttpResponse(void)214*4a64e381SAndroid Build Coastguard Worker void WebServer::DefaultHttpResponse(void)
215*4a64e381SAndroid Build Coastguard Worker {
216*4a64e381SAndroid Build Coastguard Worker mServer->default_resource[OT_REQUEST_METHOD_GET] = [this](std::shared_ptr<HttpServer::Response> response,
217*4a64e381SAndroid Build Coastguard Worker std::shared_ptr<HttpServer::Request> request) {
218*4a64e381SAndroid Build Coastguard Worker try
219*4a64e381SAndroid Build Coastguard Worker {
220*4a64e381SAndroid Build Coastguard Worker auto webRootPath = boost::filesystem::canonical(WEB_FILE_PATH);
221*4a64e381SAndroid Build Coastguard Worker auto path = boost::filesystem::canonical(webRootPath / request->path);
222*4a64e381SAndroid Build Coastguard Worker
223*4a64e381SAndroid Build Coastguard Worker // Check if path is within webRootPath
224*4a64e381SAndroid Build Coastguard Worker if (std::distance(webRootPath.begin(), webRootPath.end()) > std::distance(path.begin(), path.end()) ||
225*4a64e381SAndroid Build Coastguard Worker !std::equal(webRootPath.begin(), webRootPath.end(), path.begin()))
226*4a64e381SAndroid Build Coastguard Worker {
227*4a64e381SAndroid Build Coastguard Worker throw std::invalid_argument("path must be within root path");
228*4a64e381SAndroid Build Coastguard Worker }
229*4a64e381SAndroid Build Coastguard Worker if (boost::filesystem::is_directory(path))
230*4a64e381SAndroid Build Coastguard Worker {
231*4a64e381SAndroid Build Coastguard Worker path /= "index.html";
232*4a64e381SAndroid Build Coastguard Worker }
233*4a64e381SAndroid Build Coastguard Worker if (!(boost::filesystem::exists(path) && boost::filesystem::is_regular_file(path)))
234*4a64e381SAndroid Build Coastguard Worker {
235*4a64e381SAndroid Build Coastguard Worker throw std::invalid_argument("file does not exist");
236*4a64e381SAndroid Build Coastguard Worker }
237*4a64e381SAndroid Build Coastguard Worker
238*4a64e381SAndroid Build Coastguard Worker std::string cacheControl, etag;
239*4a64e381SAndroid Build Coastguard Worker
240*4a64e381SAndroid Build Coastguard Worker auto ifs = std::make_shared<std::ifstream>();
241*4a64e381SAndroid Build Coastguard Worker ifs->open(path.string(), std::ifstream::in | std::ios::binary | std::ios::ate);
242*4a64e381SAndroid Build Coastguard Worker std::string extension = path.extension().string();
243*4a64e381SAndroid Build Coastguard Worker std::string header = "";
244*4a64e381SAndroid Build Coastguard Worker if (extension == ".css")
245*4a64e381SAndroid Build Coastguard Worker {
246*4a64e381SAndroid Build Coastguard Worker header = OT_RESPONSE_HEADER_CSS_TYPE;
247*4a64e381SAndroid Build Coastguard Worker }
248*4a64e381SAndroid Build Coastguard Worker else if (extension == ".html")
249*4a64e381SAndroid Build Coastguard Worker {
250*4a64e381SAndroid Build Coastguard Worker header = OT_RESPONSE_HEADER_TEXT_HTML_TYPE;
251*4a64e381SAndroid Build Coastguard Worker }
252*4a64e381SAndroid Build Coastguard Worker
253*4a64e381SAndroid Build Coastguard Worker if (*ifs)
254*4a64e381SAndroid Build Coastguard Worker {
255*4a64e381SAndroid Build Coastguard Worker auto length = ifs->tellg();
256*4a64e381SAndroid Build Coastguard Worker ifs->seekg(0, std::ios::beg);
257*4a64e381SAndroid Build Coastguard Worker
258*4a64e381SAndroid Build Coastguard Worker *response << OT_RESPONSE_SUCCESS_STATUS << cacheControl << etag << OT_RESPONSE_HEADER_LENGTH << length
259*4a64e381SAndroid Build Coastguard Worker << header << OT_RESPONSE_PLACEHOLD;
260*4a64e381SAndroid Build Coastguard Worker
261*4a64e381SAndroid Build Coastguard Worker DefaultResourceSend(*mServer, response, ifs);
262*4a64e381SAndroid Build Coastguard Worker }
263*4a64e381SAndroid Build Coastguard Worker else
264*4a64e381SAndroid Build Coastguard Worker {
265*4a64e381SAndroid Build Coastguard Worker throw std::invalid_argument("could not read file");
266*4a64e381SAndroid Build Coastguard Worker }
267*4a64e381SAndroid Build Coastguard Worker
268*4a64e381SAndroid Build Coastguard Worker } catch (const std::exception &e)
269*4a64e381SAndroid Build Coastguard Worker {
270*4a64e381SAndroid Build Coastguard Worker std::string content = "Could not open path `" + request->path + "`: " + e.what();
271*4a64e381SAndroid Build Coastguard Worker EscapeHtml(content);
272*4a64e381SAndroid Build Coastguard Worker *response << OT_RESPONSE_FAILURE_STATUS << OT_RESPONSE_HEADER_LENGTH << content.length()
273*4a64e381SAndroid Build Coastguard Worker << OT_RESPONSE_PLACEHOLD << content;
274*4a64e381SAndroid Build Coastguard Worker }
275*4a64e381SAndroid Build Coastguard Worker };
276*4a64e381SAndroid Build Coastguard Worker }
277*4a64e381SAndroid Build Coastguard Worker
HandleJoinNetworkRequest(const std::string & aJoinRequest,void * aUserData)278*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleJoinNetworkRequest(const std::string &aJoinRequest, void *aUserData)
279*4a64e381SAndroid Build Coastguard Worker {
280*4a64e381SAndroid Build Coastguard Worker WebServer *webServer = static_cast<WebServer *>(aUserData);
281*4a64e381SAndroid Build Coastguard Worker
282*4a64e381SAndroid Build Coastguard Worker return webServer->HandleJoinNetworkRequest(aJoinRequest);
283*4a64e381SAndroid Build Coastguard Worker }
284*4a64e381SAndroid Build Coastguard Worker
HandleGetQRCodeRequest(const std::string & aGetQRCodeRequest,void * aUserData)285*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleGetQRCodeRequest(const std::string &aGetQRCodeRequest, void *aUserData)
286*4a64e381SAndroid Build Coastguard Worker {
287*4a64e381SAndroid Build Coastguard Worker WebServer *webServer = static_cast<WebServer *>(aUserData);
288*4a64e381SAndroid Build Coastguard Worker
289*4a64e381SAndroid Build Coastguard Worker return webServer->HandleGetQRCodeRequest(aGetQRCodeRequest);
290*4a64e381SAndroid Build Coastguard Worker }
291*4a64e381SAndroid Build Coastguard Worker
HandleFormNetworkRequest(const std::string & aFormRequest,void * aUserData)292*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleFormNetworkRequest(const std::string &aFormRequest, void *aUserData)
293*4a64e381SAndroid Build Coastguard Worker {
294*4a64e381SAndroid Build Coastguard Worker WebServer *webServer = static_cast<WebServer *>(aUserData);
295*4a64e381SAndroid Build Coastguard Worker
296*4a64e381SAndroid Build Coastguard Worker return webServer->HandleFormNetworkRequest(aFormRequest);
297*4a64e381SAndroid Build Coastguard Worker }
298*4a64e381SAndroid Build Coastguard Worker
HandleAddPrefixRequest(const std::string & aAddPrefixRequest,void * aUserData)299*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleAddPrefixRequest(const std::string &aAddPrefixRequest, void *aUserData)
300*4a64e381SAndroid Build Coastguard Worker {
301*4a64e381SAndroid Build Coastguard Worker WebServer *webServer = static_cast<WebServer *>(aUserData);
302*4a64e381SAndroid Build Coastguard Worker
303*4a64e381SAndroid Build Coastguard Worker return webServer->HandleAddPrefixRequest(aAddPrefixRequest);
304*4a64e381SAndroid Build Coastguard Worker }
305*4a64e381SAndroid Build Coastguard Worker
HandleDeletePrefixRequest(const std::string & aDeletePrefixRequest,void * aUserData)306*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleDeletePrefixRequest(const std::string &aDeletePrefixRequest, void *aUserData)
307*4a64e381SAndroid Build Coastguard Worker {
308*4a64e381SAndroid Build Coastguard Worker WebServer *webServer = static_cast<WebServer *>(aUserData);
309*4a64e381SAndroid Build Coastguard Worker
310*4a64e381SAndroid Build Coastguard Worker return webServer->HandleDeletePrefixRequest(aDeletePrefixRequest);
311*4a64e381SAndroid Build Coastguard Worker }
312*4a64e381SAndroid Build Coastguard Worker
HandleGetStatusRequest(const std::string & aGetStatusRequest,void * aUserData)313*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleGetStatusRequest(const std::string &aGetStatusRequest, void *aUserData)
314*4a64e381SAndroid Build Coastguard Worker {
315*4a64e381SAndroid Build Coastguard Worker WebServer *webServer = static_cast<WebServer *>(aUserData);
316*4a64e381SAndroid Build Coastguard Worker
317*4a64e381SAndroid Build Coastguard Worker return webServer->HandleGetStatusRequest(aGetStatusRequest);
318*4a64e381SAndroid Build Coastguard Worker }
319*4a64e381SAndroid Build Coastguard Worker
HandleGetAvailableNetworkResponse(const std::string & aGetAvailableNetworkRequest,void * aUserData)320*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleGetAvailableNetworkResponse(const std::string &aGetAvailableNetworkRequest,
321*4a64e381SAndroid Build Coastguard Worker void *aUserData)
322*4a64e381SAndroid Build Coastguard Worker {
323*4a64e381SAndroid Build Coastguard Worker WebServer *webServer = static_cast<WebServer *>(aUserData);
324*4a64e381SAndroid Build Coastguard Worker
325*4a64e381SAndroid Build Coastguard Worker return webServer->HandleGetAvailableNetworkResponse(aGetAvailableNetworkRequest);
326*4a64e381SAndroid Build Coastguard Worker }
327*4a64e381SAndroid Build Coastguard Worker
HandleCommission(const std::string & aCommissionRequest,void * aUserData)328*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleCommission(const std::string &aCommissionRequest, void *aUserData)
329*4a64e381SAndroid Build Coastguard Worker {
330*4a64e381SAndroid Build Coastguard Worker WebServer *webServer = static_cast<WebServer *>(aUserData);
331*4a64e381SAndroid Build Coastguard Worker
332*4a64e381SAndroid Build Coastguard Worker return webServer->HandleCommission(aCommissionRequest);
333*4a64e381SAndroid Build Coastguard Worker }
334*4a64e381SAndroid Build Coastguard Worker
ResponseJoinNetwork(void)335*4a64e381SAndroid Build Coastguard Worker void WebServer::ResponseJoinNetwork(void)
336*4a64e381SAndroid Build Coastguard Worker {
337*4a64e381SAndroid Build Coastguard Worker HandleHttpRequest(OT_JOIN_NETWORK_PATH, OT_REQUEST_METHOD_POST, HandleJoinNetworkRequest);
338*4a64e381SAndroid Build Coastguard Worker }
339*4a64e381SAndroid Build Coastguard Worker
ResponseGetQRCode(void)340*4a64e381SAndroid Build Coastguard Worker void WebServer::ResponseGetQRCode(void)
341*4a64e381SAndroid Build Coastguard Worker {
342*4a64e381SAndroid Build Coastguard Worker HandleHttpRequest(OT_GET_QRCODE_PATH, OT_REQUEST_METHOD_GET, HandleGetQRCodeRequest);
343*4a64e381SAndroid Build Coastguard Worker }
344*4a64e381SAndroid Build Coastguard Worker
ResponseFormNetwork(void)345*4a64e381SAndroid Build Coastguard Worker void WebServer::ResponseFormNetwork(void)
346*4a64e381SAndroid Build Coastguard Worker {
347*4a64e381SAndroid Build Coastguard Worker HandleHttpRequest(OT_FORM_NETWORK_PATH, OT_REQUEST_METHOD_POST, HandleFormNetworkRequest);
348*4a64e381SAndroid Build Coastguard Worker }
349*4a64e381SAndroid Build Coastguard Worker
ResponseAddOnMeshPrefix(void)350*4a64e381SAndroid Build Coastguard Worker void WebServer::ResponseAddOnMeshPrefix(void)
351*4a64e381SAndroid Build Coastguard Worker {
352*4a64e381SAndroid Build Coastguard Worker HandleHttpRequest(OT_ADD_PREFIX_PATH, OT_REQUEST_METHOD_POST, HandleAddPrefixRequest);
353*4a64e381SAndroid Build Coastguard Worker }
354*4a64e381SAndroid Build Coastguard Worker
ResponseDeleteOnMeshPrefix(void)355*4a64e381SAndroid Build Coastguard Worker void WebServer::ResponseDeleteOnMeshPrefix(void)
356*4a64e381SAndroid Build Coastguard Worker {
357*4a64e381SAndroid Build Coastguard Worker HandleHttpRequest(OT_DELETE_PREFIX_PATH, OT_REQUEST_METHOD_POST, HandleDeletePrefixRequest);
358*4a64e381SAndroid Build Coastguard Worker }
359*4a64e381SAndroid Build Coastguard Worker
ResponseGetStatus(void)360*4a64e381SAndroid Build Coastguard Worker void WebServer::ResponseGetStatus(void)
361*4a64e381SAndroid Build Coastguard Worker {
362*4a64e381SAndroid Build Coastguard Worker HandleHttpRequest(OT_GET_NETWORK_PATH, OT_REQUEST_METHOD_GET, HandleGetStatusRequest);
363*4a64e381SAndroid Build Coastguard Worker }
364*4a64e381SAndroid Build Coastguard Worker
ResponseGetAvailableNetwork(void)365*4a64e381SAndroid Build Coastguard Worker void WebServer::ResponseGetAvailableNetwork(void)
366*4a64e381SAndroid Build Coastguard Worker {
367*4a64e381SAndroid Build Coastguard Worker HandleHttpRequest(OT_AVAILABLE_NETWORK_PATH, OT_REQUEST_METHOD_GET, HandleGetAvailableNetworkResponse);
368*4a64e381SAndroid Build Coastguard Worker }
369*4a64e381SAndroid Build Coastguard Worker
ResponseCommission(void)370*4a64e381SAndroid Build Coastguard Worker void WebServer::ResponseCommission(void)
371*4a64e381SAndroid Build Coastguard Worker {
372*4a64e381SAndroid Build Coastguard Worker HandleHttpRequest(OT_COMMISSIONER_START_PATH, OT_REQUEST_METHOD_POST, HandleCommission);
373*4a64e381SAndroid Build Coastguard Worker }
374*4a64e381SAndroid Build Coastguard Worker
HandleJoinNetworkRequest(const std::string & aJoinRequest)375*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleJoinNetworkRequest(const std::string &aJoinRequest)
376*4a64e381SAndroid Build Coastguard Worker {
377*4a64e381SAndroid Build Coastguard Worker return mWpanService.HandleJoinNetworkRequest(aJoinRequest);
378*4a64e381SAndroid Build Coastguard Worker }
379*4a64e381SAndroid Build Coastguard Worker
HandleGetQRCodeRequest(const std::string & aGetQRCodeRequest)380*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleGetQRCodeRequest(const std::string &aGetQRCodeRequest)
381*4a64e381SAndroid Build Coastguard Worker {
382*4a64e381SAndroid Build Coastguard Worker OTBR_UNUSED_VARIABLE(aGetQRCodeRequest);
383*4a64e381SAndroid Build Coastguard Worker return mWpanService.HandleGetQRCodeRequest();
384*4a64e381SAndroid Build Coastguard Worker }
385*4a64e381SAndroid Build Coastguard Worker
HandleFormNetworkRequest(const std::string & aFormRequest)386*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleFormNetworkRequest(const std::string &aFormRequest)
387*4a64e381SAndroid Build Coastguard Worker {
388*4a64e381SAndroid Build Coastguard Worker return mWpanService.HandleFormNetworkRequest(aFormRequest);
389*4a64e381SAndroid Build Coastguard Worker }
390*4a64e381SAndroid Build Coastguard Worker
HandleAddPrefixRequest(const std::string & aAddPrefixRequest)391*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleAddPrefixRequest(const std::string &aAddPrefixRequest)
392*4a64e381SAndroid Build Coastguard Worker {
393*4a64e381SAndroid Build Coastguard Worker return mWpanService.HandleAddPrefixRequest(aAddPrefixRequest);
394*4a64e381SAndroid Build Coastguard Worker }
395*4a64e381SAndroid Build Coastguard Worker
HandleDeletePrefixRequest(const std::string & aDeletePrefixRequest)396*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleDeletePrefixRequest(const std::string &aDeletePrefixRequest)
397*4a64e381SAndroid Build Coastguard Worker {
398*4a64e381SAndroid Build Coastguard Worker return mWpanService.HandleDeletePrefixRequest(aDeletePrefixRequest);
399*4a64e381SAndroid Build Coastguard Worker }
400*4a64e381SAndroid Build Coastguard Worker
HandleGetStatusRequest(const std::string & aGetStatusRequest)401*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleGetStatusRequest(const std::string &aGetStatusRequest)
402*4a64e381SAndroid Build Coastguard Worker {
403*4a64e381SAndroid Build Coastguard Worker OTBR_UNUSED_VARIABLE(aGetStatusRequest);
404*4a64e381SAndroid Build Coastguard Worker return mWpanService.HandleStatusRequest();
405*4a64e381SAndroid Build Coastguard Worker }
406*4a64e381SAndroid Build Coastguard Worker
HandleGetAvailableNetworkResponse(const std::string & aGetAvailableNetworkRequest)407*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleGetAvailableNetworkResponse(const std::string &aGetAvailableNetworkRequest)
408*4a64e381SAndroid Build Coastguard Worker {
409*4a64e381SAndroid Build Coastguard Worker OTBR_UNUSED_VARIABLE(aGetAvailableNetworkRequest);
410*4a64e381SAndroid Build Coastguard Worker return mWpanService.HandleAvailableNetworkRequest();
411*4a64e381SAndroid Build Coastguard Worker }
412*4a64e381SAndroid Build Coastguard Worker
HandleCommission(const std::string & aCommissionRequest)413*4a64e381SAndroid Build Coastguard Worker std::string WebServer::HandleCommission(const std::string &aCommissionRequest)
414*4a64e381SAndroid Build Coastguard Worker {
415*4a64e381SAndroid Build Coastguard Worker return mWpanService.HandleCommission(aCommissionRequest);
416*4a64e381SAndroid Build Coastguard Worker }
417*4a64e381SAndroid Build Coastguard Worker
418*4a64e381SAndroid Build Coastguard Worker } // namespace Web
419*4a64e381SAndroid Build Coastguard Worker } // namespace otbr
420