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