xref: /aosp_15_r20/external/skia/tools/skiaserve/Response.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2016 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "tools/skiaserve/Response.h"
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "tools/skiaserve/Request.h"
11*c8dee2aaSAndroid Build Coastguard Worker 
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "tools/flags/CommandLineFlags.h"
15*c8dee2aaSAndroid Build Coastguard Worker 
16*c8dee2aaSAndroid Build Coastguard Worker #include "microhttpd.h"
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker static DEFINE_string(source, "https://debugger-assets.skia.org", "Where to load the web UI from.");
19*c8dee2aaSAndroid Build Coastguard Worker 
generate_template(SkString source)20*c8dee2aaSAndroid Build Coastguard Worker static SkString generate_template(SkString source) {
21*c8dee2aaSAndroid Build Coastguard Worker     SkString debuggerTemplate;
22*c8dee2aaSAndroid Build Coastguard Worker     debuggerTemplate.appendf(
23*c8dee2aaSAndroid Build Coastguard Worker         "<!DOCTYPE html>\n"
24*c8dee2aaSAndroid Build Coastguard Worker         "<html>\n"
25*c8dee2aaSAndroid Build Coastguard Worker         "<head>\n"
26*c8dee2aaSAndroid Build Coastguard Worker         "    <title>SkDebugger</title>\n"
27*c8dee2aaSAndroid Build Coastguard Worker         "    <meta charset='utf-8' />\n"
28*c8dee2aaSAndroid Build Coastguard Worker         "    <meta http-equiv='X-UA-Compatible' content='IE=edge'>\n"
29*c8dee2aaSAndroid Build Coastguard Worker         "    <meta name='viewport' content='width=device-width, initial-scale=1.0'>\n"
30*c8dee2aaSAndroid Build Coastguard Worker         "    <script src='%s/res/js/core.js' type='text/javascript' charset='utf-8'></script>\n"
31*c8dee2aaSAndroid Build Coastguard Worker         "    <link href='%s/res/vul/elements.html' rel='import' />\n"
32*c8dee2aaSAndroid Build Coastguard Worker         "    <link rel='shortcut icon' href='%s/res/img/favicon.ico' type='image/x-icon'/ >"
33*c8dee2aaSAndroid Build Coastguard Worker         "</head>\n"
34*c8dee2aaSAndroid Build Coastguard Worker         "<body class='fullbleed layout vertical'>\n"
35*c8dee2aaSAndroid Build Coastguard Worker             "  <debugger-app-sk>This is the app."
36*c8dee2aaSAndroid Build Coastguard Worker             "  </debugger-app-sk>\n"
37*c8dee2aaSAndroid Build Coastguard Worker         "</body>\n"
38*c8dee2aaSAndroid Build Coastguard Worker         "</html>", source.c_str(), source.c_str(), source.c_str());
39*c8dee2aaSAndroid Build Coastguard Worker     return debuggerTemplate;
40*c8dee2aaSAndroid Build Coastguard Worker }
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker namespace Response {
43*c8dee2aaSAndroid Build Coastguard Worker // SendOK just sends an empty response with a 200 OK status code.
SendOK(MHD_Connection * connection)44*c8dee2aaSAndroid Build Coastguard Worker int SendOK(MHD_Connection* connection) {
45*c8dee2aaSAndroid Build Coastguard Worker     const char* data = "";
46*c8dee2aaSAndroid Build Coastguard Worker 
47*c8dee2aaSAndroid Build Coastguard Worker     MHD_Response* response = MHD_create_response_from_buffer(strlen(data),
48*c8dee2aaSAndroid Build Coastguard Worker                                                              (void*)data,
49*c8dee2aaSAndroid Build Coastguard Worker                                                              MHD_RESPMEM_PERSISTENT);
50*c8dee2aaSAndroid Build Coastguard Worker     int ret = MHD_queue_response(connection, 200, response);
51*c8dee2aaSAndroid Build Coastguard Worker     MHD_destroy_response(response);
52*c8dee2aaSAndroid Build Coastguard Worker     return ret;
53*c8dee2aaSAndroid Build Coastguard Worker }
54*c8dee2aaSAndroid Build Coastguard Worker 
SendError(MHD_Connection * connection,const char * msg)55*c8dee2aaSAndroid Build Coastguard Worker int SendError(MHD_Connection* connection, const char* msg) {
56*c8dee2aaSAndroid Build Coastguard Worker     MHD_Response* response = MHD_create_response_from_buffer(strlen(msg),
57*c8dee2aaSAndroid Build Coastguard Worker                                                              (void*) msg,
58*c8dee2aaSAndroid Build Coastguard Worker                                                              MHD_RESPMEM_PERSISTENT);
59*c8dee2aaSAndroid Build Coastguard Worker     int ret = MHD_queue_response(connection, 500, response);
60*c8dee2aaSAndroid Build Coastguard Worker     MHD_destroy_response(response);
61*c8dee2aaSAndroid Build Coastguard Worker     return ret;
62*c8dee2aaSAndroid Build Coastguard Worker }
63*c8dee2aaSAndroid Build Coastguard Worker 
SendData(MHD_Connection * connection,const SkData * data,const char * type,bool setContentDisposition,const char * dispositionString)64*c8dee2aaSAndroid Build Coastguard Worker int SendData(MHD_Connection* connection, const SkData* data, const char* type,
65*c8dee2aaSAndroid Build Coastguard Worker              bool setContentDisposition, const char* dispositionString) {
66*c8dee2aaSAndroid Build Coastguard Worker     MHD_Response* response = MHD_create_response_from_buffer(data->size(),
67*c8dee2aaSAndroid Build Coastguard Worker                                                              const_cast<void*>(data->data()),
68*c8dee2aaSAndroid Build Coastguard Worker                                                              MHD_RESPMEM_MUST_COPY);
69*c8dee2aaSAndroid Build Coastguard Worker     MHD_add_response_header(response, "Content-Type", type);
70*c8dee2aaSAndroid Build Coastguard Worker 
71*c8dee2aaSAndroid Build Coastguard Worker     if (setContentDisposition) {
72*c8dee2aaSAndroid Build Coastguard Worker         MHD_add_response_header(response, "Content-Disposition", dispositionString);
73*c8dee2aaSAndroid Build Coastguard Worker     }
74*c8dee2aaSAndroid Build Coastguard Worker 
75*c8dee2aaSAndroid Build Coastguard Worker     int ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
76*c8dee2aaSAndroid Build Coastguard Worker     MHD_destroy_response(response);
77*c8dee2aaSAndroid Build Coastguard Worker     return ret;
78*c8dee2aaSAndroid Build Coastguard Worker }
79*c8dee2aaSAndroid Build Coastguard Worker 
SendTemplate(MHD_Connection * connection,bool redirect,const char * redirectUrl)80*c8dee2aaSAndroid Build Coastguard Worker int SendTemplate(MHD_Connection* connection, bool redirect, const char* redirectUrl) {
81*c8dee2aaSAndroid Build Coastguard Worker     SkString debuggerTemplate = generate_template(SkString(FLAGS_source[0]));
82*c8dee2aaSAndroid Build Coastguard Worker 
83*c8dee2aaSAndroid Build Coastguard Worker     MHD_Response* response = MHD_create_response_from_buffer(
84*c8dee2aaSAndroid Build Coastguard Worker         debuggerTemplate.size(),
85*c8dee2aaSAndroid Build Coastguard Worker         (void*) const_cast<char*>(debuggerTemplate.c_str()),
86*c8dee2aaSAndroid Build Coastguard Worker         MHD_RESPMEM_MUST_COPY);
87*c8dee2aaSAndroid Build Coastguard Worker     MHD_add_response_header (response, "Access-Control-Allow-Origin", "*");
88*c8dee2aaSAndroid Build Coastguard Worker 
89*c8dee2aaSAndroid Build Coastguard Worker     int status = MHD_HTTP_OK;
90*c8dee2aaSAndroid Build Coastguard Worker 
91*c8dee2aaSAndroid Build Coastguard Worker     if (redirect) {
92*c8dee2aaSAndroid Build Coastguard Worker         MHD_add_response_header (response, "Location", redirectUrl);
93*c8dee2aaSAndroid Build Coastguard Worker         status = MHD_HTTP_SEE_OTHER;
94*c8dee2aaSAndroid Build Coastguard Worker     }
95*c8dee2aaSAndroid Build Coastguard Worker 
96*c8dee2aaSAndroid Build Coastguard Worker     int ret = MHD_queue_response(connection, status, response);
97*c8dee2aaSAndroid Build Coastguard Worker     MHD_destroy_response(response);
98*c8dee2aaSAndroid Build Coastguard Worker     return ret;
99*c8dee2aaSAndroid Build Coastguard Worker }
100*c8dee2aaSAndroid Build Coastguard Worker 
101*c8dee2aaSAndroid Build Coastguard Worker } // namespace Response
102