Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(155)

Side by Side Diff: android_webview/test/embedded_test_server/aw_embedded_test_server.cc

Issue 2687573002: [Android Webview] Refactor LoadUrlTest and work on embedded_test_server custom handler (Closed)
Patch Set: Change AwETS intent class name Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "android_webview/test/embedded_test_server/aw_embedded_test_server.h"
6
7 #include <jni.h>
8
9 #include "android_webview/test/jni/AwEmbeddedTestServerImpl_jni.h"
10 #include "base/android/jni_array.h"
11 #include "base/base64.h"
12 #include "base/strings/stringprintf.h"
13 #include "net/test/embedded_test_server/http_request.h"
14 #include "net/test/embedded_test_server/http_response.h"
15 #include "net/test/embedded_test_server/request_handler_util.h"
16
17 using base::android::JavaParamRef;
18 using base::android::JavaRef;
19 using base::android::ScopedJavaLocalRef;
20 using net::test_server::BasicHttpResponse;
21 using net::test_server::HttpRequest;
22 using net::test_server::HttpResponse;
23 using net::test_server::ParseQuery;
24 using net::test_server::RequestQuery;
25
26 namespace android_webview {
27 namespace test {
28
29 namespace {
30 // /click-redirect?url=URL&header=HEADER
31 // Returns a href redirect to URL.
32 // Responds in the message body with the headers echoed on the current request.
33 std::unique_ptr<HttpResponse> HandleClickRedirect(const HttpRequest& request) {
34 if (!ShouldHandle(request, "/click-redirect"))
35 return nullptr;
36 GURL request_url = request.GetURL();
37 RequestQuery query = ParseQuery(request_url);
38
39 std::unique_ptr<BasicHttpResponse> http_response(new BasicHttpResponse);
40 http_response->set_content_type("text/html");
41 http_response->AddCustomHeader("Cache-Control", "no-cache, no-store");
42
43 std::string url;
44 if (query.find("url") != query.end()) {
45 url = query.at("url").front();
46 }
47
48 std::string content;
49 if (query.find("header") != query.end()) {
50 for (const auto& header : query.at("header")) {
51 std::string header_value = "None";
52 if (request.headers.find(header) != request.headers.end())
53 header_value = request.headers.at(header);
54 content += header_value + "\n";
55 }
56 }
57
58 http_response->set_content(base::StringPrintf(
59 "<html><body><div>%s</div>"
60 "<a id=\"click\" href=\"%s\">Click to redirect to %s</a></body></html>",
61 content.c_str(), url.c_str(), url.c_str()));
62
63 return std::move(http_response);
64 }
65
66 // /echoheader-and-set-data?header=HEADER1&data=DATA
67 // Responds as json in the message body with the headers echoed on the current
68 // request and a content that matches DATA.
69 std::unique_ptr<HttpResponse> HandleEchoHeaderAndSetData(
70 const HttpRequest& request) {
71 if (!ShouldHandle(request, "/echoheader-and-set-data"))
72 return nullptr;
73 GURL request_url = request.GetURL();
74 RequestQuery query = ParseQuery(request_url);
75
76 std::string header_content;
77 if (query.find("header") != query.end()) {
78 for (const auto& header : query.at("header")) {
79 std::string header_value = "None";
80 if (request.headers.find(header) != request.headers.end())
81 header_value = request.headers.at(header);
82 if (!header_content.empty())
83 header_content += ",";
84 header_content += "\"" + header_value + "\"";
85 }
86 }
87
88 std::string data_content;
89 if (query.find("data") != query.end()) {
90 for (const auto& data : query.at("data")) {
91 if (!data_content.empty())
92 data_content += ", ";
93 data_content += "\"" + data + "\"";
94 }
95 }
96
97 std::unique_ptr<BasicHttpResponse> http_response(new BasicHttpResponse);
98 http_response->set_content_type("application/json");
99 http_response->AddCustomHeader("Cache-Control", "no-cache, no-store");
100 http_response->set_content(
101 base::StringPrintf("{"
102 " \"echo header\": [%s],"
103 " \"data content\": [%s]"
104 "}",
105 header_content.c_str(), data_content.c_str()));
106
107 return std::move(http_response);
108 }
109
110 // /server-redirect-echoheader?url=URL&header=HEADER
111 // Returns a server-redirect (301) to URL. Pass the headers echoed on the
112 // current request into the URL request.
113 std::unique_ptr<HttpResponse> HandleServerRedirectEchoHeader(
114 const HttpRequest& request) {
115 if (!ShouldHandle(request, "/server-redirect-echoheader"))
116 return nullptr;
117 GURL request_url = request.GetURL();
118 RequestQuery query = ParseQuery(request_url);
119
120 std::string url;
121 if (query.find("url") != query.end()) {
122 url = query.at("url").front();
123 }
124
125 std::string url_suffix;
126 if (query.find("header") != query.end()) {
127 for (const auto& header : query.at("header")) {
128 std::string header_value = "None";
129 if (request.headers.find(header) != request.headers.end())
130 header_value = request.headers.at(header);
131 url_suffix += "&data=" + header_value;
132 }
133 }
134 url.append(url_suffix);
135
136 std::unique_ptr<BasicHttpResponse> http_response(new BasicHttpResponse);
137 http_response->set_code(net::HTTP_MOVED_PERMANENTLY);
138 http_response->AddCustomHeader("Location", url);
139 http_response->set_content_type("text/html");
140 http_response->set_content(base::StringPrintf(
141 "<html><body>Redirecting to %s</body></html>", url.c_str()));
142 return std::move(http_response);
143 }
144
145 // /image-response-if-header-not-exists?resource=RESOURCE&header=HEADER
146 // Returns the response with the base64 encoded image resource in the request.
147 std::unique_ptr<HttpResponse> HandleSetImageResponse(
148 const HttpRequest& request) {
149 if (!ShouldHandle(request, "/image-response-if-header-not-exists"))
150 return nullptr;
151 GURL request_url = request.GetURL();
152 RequestQuery query = ParseQuery(request_url);
153
154 std::string resource;
155 if (query.find("resource") != query.end()) {
156 resource = query.at("resource").front();
157 }
158
159 bool header_exist = false;
160 if (query.find("header") != query.end()) {
161 for (const auto& header : query.at("header")) {
162 if (request.headers.find(header) != request.headers.end())
163 header_exist = true;
164 break;
165 }
166 }
167
168 std::string decoded_resource;
169 if (!base::Base64Decode(resource, &decoded_resource))
170 return nullptr;
171
172 std::unique_ptr<BasicHttpResponse> http_response(new BasicHttpResponse);
173 http_response->set_content_type("image/png");
174 http_response->AddCustomHeader("Cache-Control", "no-store");
175 if (!header_exist)
176 http_response->set_content(decoded_resource);
177 else {
178 http_response->set_code(net::HTTP_NOT_FOUND);
179 http_response->set_content("Found Extra Header. Validation Failed.");
180 }
181 return std::move(http_response);
182 }
183
184 // /image-onload-html?imagesrc=URL&header=HEADER
185 // Returns the response with the base64 encoded image resource in the request.
186 std::unique_ptr<HttpResponse> HandleImageOnloadHtml(
187 const HttpRequest& request) {
188 if (!ShouldHandle(request, "/image-onload-html"))
189 return nullptr;
190 GURL request_url = request.GetURL();
191 RequestQuery query = ParseQuery(request_url);
192
193 std::string image_url;
194 if (query.find("imagesrc") != query.end()) {
195 image_url = query.at("imagesrc").front();
196 }
197
198 std::string content;
199 if (query.find("header") != query.end()) {
200 for (const auto& header : query.at("header")) {
201 std::string header_value = "None";
202 if (request.headers.find(header) != request.headers.end())
203 header_value = request.headers.at(header);
204 content += header_value + "\n";
205 }
206 }
207
208 std::unique_ptr<BasicHttpResponse> http_response(new BasicHttpResponse);
209 http_response->set_content_type("text/html");
210 http_response->set_content(base::StringPrintf(
211 "<html><head><script>function updateTitle() "
212 "{ document.title=document.getElementById('img').naturalHeight } "
213 "</script></head><body><div>%s</div>"
214 "<div onload='updateTitle();'><img id='img' onload='updateTitle();' "
215 "src='%s'></div></body></html>",
216 content.c_str(), image_url.c_str()));
217 return std::move(http_response);
218 }
219
220 } // namespace
221
222 // static
223 ScopedJavaLocalRef<jlongArray> GetHandlers(JNIEnv* env,
224 const JavaParamRef<jclass>&) {
225 std::vector<int64_t> handlers = {
226 reinterpret_cast<int64_t>(&HandleClickRedirect),
227 reinterpret_cast<int64_t>(&HandleEchoHeaderAndSetData),
228 reinterpret_cast<int64_t>(&HandleServerRedirectEchoHeader),
229 reinterpret_cast<int64_t>(&HandleSetImageResponse),
230 reinterpret_cast<int64_t>(&HandleImageOnloadHtml)};
231 return base::android::ToJavaLongArray(env, handlers);
232 }
233
234 // static
235 bool RegisterCustomHandlers(JNIEnv* env) {
236 return RegisterNativesImpl(env);
237 }
238
239 } // namespace test
240 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698