1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "net/base/data_url.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
8*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
9*6777b538SAndroid Build Coastguard Worker #include "net/http/http_response_headers.h"
10*6777b538SAndroid Build Coastguard Worker #include "net/http/http_version.h"
11*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
12*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h"
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker namespace net {
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker namespace {
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker struct ParseTestData {
19*6777b538SAndroid Build Coastguard Worker const char* url;
20*6777b538SAndroid Build Coastguard Worker bool is_valid;
21*6777b538SAndroid Build Coastguard Worker const char* mime_type;
22*6777b538SAndroid Build Coastguard Worker const char* charset;
23*6777b538SAndroid Build Coastguard Worker const std::string data;
24*6777b538SAndroid Build Coastguard Worker };
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Worker } // namespace
27*6777b538SAndroid Build Coastguard Worker
TEST(DataURLTest,Parse)28*6777b538SAndroid Build Coastguard Worker TEST(DataURLTest, Parse) {
29*6777b538SAndroid Build Coastguard Worker const ParseTestData tests[] = {
30*6777b538SAndroid Build Coastguard Worker {"data:", false, "", "", ""},
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker {"data:,", true, "text/plain", "US-ASCII", ""},
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker {"data:;base64,", true, "text/plain", "US-ASCII", ""},
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker {"data:;charset=,test", false, "", "", ""},
37*6777b538SAndroid Build Coastguard Worker
38*6777b538SAndroid Build Coastguard Worker {"data:TeXt/HtMl,<b>x</b>", true, "text/html", "", "<b>x</b>"},
39*6777b538SAndroid Build Coastguard Worker
40*6777b538SAndroid Build Coastguard Worker {"data:,foo", true, "text/plain", "US-ASCII", "foo"},
41*6777b538SAndroid Build Coastguard Worker
42*6777b538SAndroid Build Coastguard Worker {"data:;base64,aGVsbG8gd29ybGQ=", true, "text/plain", "US-ASCII",
43*6777b538SAndroid Build Coastguard Worker "hello world"},
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker // Allow invalid mediatype for backward compatibility but set mime_type to
46*6777b538SAndroid Build Coastguard Worker // "text/plain" instead of the invalid mediatype.
47*6777b538SAndroid Build Coastguard Worker {"data:foo,boo", true, "text/plain", "US-ASCII", "boo"},
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker // When accepting an invalid mediatype, override charset with "US-ASCII"
50*6777b538SAndroid Build Coastguard Worker {"data:foo;charset=UTF-8,boo", true, "text/plain", "US-ASCII", "boo"},
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker // Invalid mediatype. Includes a slash but the type part is not a token.
53*6777b538SAndroid Build Coastguard Worker {"data:f(oo/bar;baz=1;charset=kk,boo", true, "text/plain", "US-ASCII",
54*6777b538SAndroid Build Coastguard Worker "boo"},
55*6777b538SAndroid Build Coastguard Worker
56*6777b538SAndroid Build Coastguard Worker {"data:foo/bar;baz=1;charset=kk,boo", true, "foo/bar", "kk", "boo"},
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker {"data:foo/bar;charset=kk;baz=1,boo", true, "foo/bar", "kk", "boo"},
59*6777b538SAndroid Build Coastguard Worker
60*6777b538SAndroid Build Coastguard Worker {"data:text/html,%3Chtml%3E%3Cbody%3E%3Cb%3Ehello%20world"
61*6777b538SAndroid Build Coastguard Worker "%3C%2Fb%3E%3C%2Fbody%3E%3C%2Fhtml%3E",
62*6777b538SAndroid Build Coastguard Worker true, "text/html", "", "<html><body><b>hello world</b></body></html>"},
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Worker {"data:text/html,<html><body><b>hello world</b></body></html>", true,
65*6777b538SAndroid Build Coastguard Worker "text/html", "", "<html><body><b>hello world</b></body></html>"},
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Worker // the comma cannot be url-escaped!
68*6777b538SAndroid Build Coastguard Worker {"data:%2Cblah", false, "", "", ""},
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard Worker // invalid base64 content
71*6777b538SAndroid Build Coastguard Worker {"data:;base64,aGVs_-_-", false, "", "", ""},
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker // Spaces should be removed from non-text data URLs (we already tested
74*6777b538SAndroid Build Coastguard Worker // spaces above).
75*6777b538SAndroid Build Coastguard Worker {"data:image/fractal,a b c d e f g", true, "image/fractal", "",
76*6777b538SAndroid Build Coastguard Worker "abcdefg"},
77*6777b538SAndroid Build Coastguard Worker
78*6777b538SAndroid Build Coastguard Worker // Spaces should also be removed from anything base-64 encoded
79*6777b538SAndroid Build Coastguard Worker {"data:;base64,aGVs bG8gd2 9ybGQ=", true, "text/plain", "US-ASCII",
80*6777b538SAndroid Build Coastguard Worker "hello world"},
81*6777b538SAndroid Build Coastguard Worker
82*6777b538SAndroid Build Coastguard Worker // Other whitespace should also be removed from anything base-64 encoded.
83*6777b538SAndroid Build Coastguard Worker {"data:;base64,aGVs bG8gd2 \n9ybGQ=", true, "text/plain", "US-ASCII",
84*6777b538SAndroid Build Coastguard Worker "hello world"},
85*6777b538SAndroid Build Coastguard Worker
86*6777b538SAndroid Build Coastguard Worker // In base64 encoding, escaped whitespace should be stripped.
87*6777b538SAndroid Build Coastguard Worker // (This test was taken from acid3)
88*6777b538SAndroid Build Coastguard Worker // http://b/1054495
89*6777b538SAndroid Build Coastguard Worker {"data:text/javascript;base64,%20ZD%20Qg%0D%0APS%20An%20Zm91cic%0D%0A%207"
90*6777b538SAndroid Build Coastguard Worker "%20",
91*6777b538SAndroid Build Coastguard Worker true, "text/javascript", "", "d4 = 'four';"},
92*6777b538SAndroid Build Coastguard Worker
93*6777b538SAndroid Build Coastguard Worker // Only unescaped whitespace should be stripped in non-base64.
94*6777b538SAndroid Build Coastguard Worker // http://b/1157796
95*6777b538SAndroid Build Coastguard Worker {"data:img/png,A B %20 %0A C", true, "img/png", "", "AB \nC"},
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker {"data:text/plain;charset=utf-8;base64,SGVsbMO2", true, "text/plain",
98*6777b538SAndroid Build Coastguard Worker "utf-8", "Hell\xC3\xB6"},
99*6777b538SAndroid Build Coastguard Worker
100*6777b538SAndroid Build Coastguard Worker // no mimetype
101*6777b538SAndroid Build Coastguard Worker {"data:;charset=utf-8;base64,SGVsbMO2", true, "text/plain", "utf-8",
102*6777b538SAndroid Build Coastguard Worker "Hell\xC3\xB6"},
103*6777b538SAndroid Build Coastguard Worker
104*6777b538SAndroid Build Coastguard Worker // Not sufficiently padded.
105*6777b538SAndroid Build Coastguard Worker {"data:;base64,aGVsbG8gd29ybGQ", true, "text/plain", "US-ASCII",
106*6777b538SAndroid Build Coastguard Worker "hello world"},
107*6777b538SAndroid Build Coastguard Worker
108*6777b538SAndroid Build Coastguard Worker // Not sufficiently padded with whitespace.
109*6777b538SAndroid Build Coastguard Worker {"data:;base64,aGV sbG8g d29ybGQ", true, "text/plain", "US-ASCII",
110*6777b538SAndroid Build Coastguard Worker "hello world"},
111*6777b538SAndroid Build Coastguard Worker
112*6777b538SAndroid Build Coastguard Worker // Not sufficiently padded with escaped whitespace.
113*6777b538SAndroid Build Coastguard Worker {"data:;base64,aGV%20sbG8g%20d29ybGQ", true, "text/plain", "US-ASCII",
114*6777b538SAndroid Build Coastguard Worker "hello world"},
115*6777b538SAndroid Build Coastguard Worker
116*6777b538SAndroid Build Coastguard Worker // Bad encoding (truncated).
117*6777b538SAndroid Build Coastguard Worker {"data:;base64,aGVsbG8gd29yb", false, "", "", ""},
118*6777b538SAndroid Build Coastguard Worker
119*6777b538SAndroid Build Coastguard Worker // BiDi control characters should be unescaped and preserved as is, and
120*6777b538SAndroid Build Coastguard Worker // should not be replaced with % versions. In the below case, \xE2\x80\x8F
121*6777b538SAndroid Build Coastguard Worker // is the RTL mark and the parsed text should preserve it as is.
122*6777b538SAndroid Build Coastguard Worker {"data:text/plain;charset=utf-8,\xE2\x80\x8Ftest", true, "text/plain",
123*6777b538SAndroid Build Coastguard Worker "utf-8", "\xE2\x80\x8Ftest"},
124*6777b538SAndroid Build Coastguard Worker
125*6777b538SAndroid Build Coastguard Worker // Same as above but with Arabic text after RTL mark.
126*6777b538SAndroid Build Coastguard Worker {"data:text/plain;charset=utf-8,"
127*6777b538SAndroid Build Coastguard Worker "\xE2\x80\x8F\xD8\xA7\xD8\xAE\xD8\xAA\xD8\xA8\xD8\xA7\xD8\xB1",
128*6777b538SAndroid Build Coastguard Worker true, "text/plain", "utf-8",
129*6777b538SAndroid Build Coastguard Worker "\xE2\x80\x8F\xD8\xA7\xD8\xAE\xD8\xAA\xD8\xA8\xD8\xA7\xD8\xB1"},
130*6777b538SAndroid Build Coastguard Worker
131*6777b538SAndroid Build Coastguard Worker // RTL mark encoded as %E2%80%8F should be unescaped too. Note that when
132*6777b538SAndroid Build Coastguard Worker // wrapped in a GURL, this URL and the next effectively become the same as
133*6777b538SAndroid Build Coastguard Worker // the previous two URLs.
134*6777b538SAndroid Build Coastguard Worker {"data:text/plain;charset=utf-8,%E2%80%8Ftest", true, "text/plain",
135*6777b538SAndroid Build Coastguard Worker "utf-8", "\xE2\x80\x8Ftest"},
136*6777b538SAndroid Build Coastguard Worker
137*6777b538SAndroid Build Coastguard Worker // Same as above but with Arabic text after RTL mark.
138*6777b538SAndroid Build Coastguard Worker {"data:text/plain;charset=utf-8,"
139*6777b538SAndroid Build Coastguard Worker "%E2%80%8F\xD8\xA7\xD8\xAE\xD8\xAA\xD8\xA8\xD8\xA7\xD8\xB1",
140*6777b538SAndroid Build Coastguard Worker true, "text/plain", "utf-8",
141*6777b538SAndroid Build Coastguard Worker "\xE2\x80\x8F\xD8\xA7\xD8\xAE\xD8\xAA\xD8\xA8\xD8\xA7\xD8\xB1"},
142*6777b538SAndroid Build Coastguard Worker
143*6777b538SAndroid Build Coastguard Worker // The 'data' of a data URI does not include any ref it has.
144*6777b538SAndroid Build Coastguard Worker {"data:text/plain,this/is/a/test/%23include/#dontinclude", true,
145*6777b538SAndroid Build Coastguard Worker "text/plain", "", "this/is/a/test/#include/"},
146*6777b538SAndroid Build Coastguard Worker
147*6777b538SAndroid Build Coastguard Worker // More unescaping tests and tests with nulls.
148*6777b538SAndroid Build Coastguard Worker {"data:%00text/plain%41,foo", true, "%00text/plain%41", "", "foo"},
149*6777b538SAndroid Build Coastguard Worker {"data:text/plain;charset=%00US-ASCII%41,foo", true, "text/plain",
150*6777b538SAndroid Build Coastguard Worker "%00US-ASCII%41", "foo"},
151*6777b538SAndroid Build Coastguard Worker {"data:text/plain,%00_%41", true, "text/plain", "",
152*6777b538SAndroid Build Coastguard Worker std::string("\x00_A", 3)},
153*6777b538SAndroid Build Coastguard Worker {"data:text/plain;base64,AA//", true, "text/plain", "",
154*6777b538SAndroid Build Coastguard Worker std::string("\x00\x0F\xFF", 3)},
155*6777b538SAndroid Build Coastguard Worker // "%62ase64" unescapes to base64, but should not be treated as such.
156*6777b538SAndroid Build Coastguard Worker {"data:text/plain;%62ase64,AA//", true, "text/plain", "", "AA//"},
157*6777b538SAndroid Build Coastguard Worker };
158*6777b538SAndroid Build Coastguard Worker
159*6777b538SAndroid Build Coastguard Worker for (const auto& test : tests) {
160*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(test.url);
161*6777b538SAndroid Build Coastguard Worker
162*6777b538SAndroid Build Coastguard Worker std::string mime_type;
163*6777b538SAndroid Build Coastguard Worker std::string charset;
164*6777b538SAndroid Build Coastguard Worker std::string data;
165*6777b538SAndroid Build Coastguard Worker bool ok = DataURL::Parse(GURL(test.url), &mime_type, &charset, &data);
166*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ok, test.is_valid);
167*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(test.mime_type, mime_type);
168*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(test.charset, charset);
169*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(test.data, data);
170*6777b538SAndroid Build Coastguard Worker }
171*6777b538SAndroid Build Coastguard Worker }
172*6777b538SAndroid Build Coastguard Worker
TEST(DataURLTest,BuildResponseSimple)173*6777b538SAndroid Build Coastguard Worker TEST(DataURLTest, BuildResponseSimple) {
174*6777b538SAndroid Build Coastguard Worker std::string mime_type;
175*6777b538SAndroid Build Coastguard Worker std::string charset;
176*6777b538SAndroid Build Coastguard Worker std::string data;
177*6777b538SAndroid Build Coastguard Worker scoped_refptr<HttpResponseHeaders> headers;
178*6777b538SAndroid Build Coastguard Worker
179*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(OK, DataURL::BuildResponse(GURL("data:,Hello"), "GET", &mime_type,
180*6777b538SAndroid Build Coastguard Worker &charset, &data, &headers));
181*6777b538SAndroid Build Coastguard Worker
182*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("text/plain", mime_type);
183*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("US-ASCII", charset);
184*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("Hello", data);
185*6777b538SAndroid Build Coastguard Worker
186*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(headers);
187*6777b538SAndroid Build Coastguard Worker const HttpVersion& version = headers->GetHttpVersion();
188*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, version.major_value());
189*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, version.minor_value());
190*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("OK", headers->GetStatusText());
191*6777b538SAndroid Build Coastguard Worker std::string value;
192*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(headers->GetNormalizedHeader("Content-Type", &value));
193*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(value, "text/plain;charset=US-ASCII");
194*6777b538SAndroid Build Coastguard Worker value.clear();
195*6777b538SAndroid Build Coastguard Worker }
196*6777b538SAndroid Build Coastguard Worker
TEST(DataURLTest,BuildResponseHead)197*6777b538SAndroid Build Coastguard Worker TEST(DataURLTest, BuildResponseHead) {
198*6777b538SAndroid Build Coastguard Worker for (const char* method : {"HEAD", "head", "hEaD"}) {
199*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(method);
200*6777b538SAndroid Build Coastguard Worker
201*6777b538SAndroid Build Coastguard Worker std::string mime_type;
202*6777b538SAndroid Build Coastguard Worker std::string charset;
203*6777b538SAndroid Build Coastguard Worker std::string data;
204*6777b538SAndroid Build Coastguard Worker scoped_refptr<HttpResponseHeaders> headers;
205*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(OK,
206*6777b538SAndroid Build Coastguard Worker DataURL::BuildResponse(GURL("data:,Hello"), method, &mime_type,
207*6777b538SAndroid Build Coastguard Worker &charset, &data, &headers));
208*6777b538SAndroid Build Coastguard Worker
209*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("text/plain", mime_type);
210*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("US-ASCII", charset);
211*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", data);
212*6777b538SAndroid Build Coastguard Worker
213*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(headers);
214*6777b538SAndroid Build Coastguard Worker HttpVersion version = headers->GetHttpVersion();
215*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, version.major_value());
216*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, version.minor_value());
217*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("OK", headers->GetStatusText());
218*6777b538SAndroid Build Coastguard Worker std::string content_type;
219*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(headers->GetNormalizedHeader("Content-Type", &content_type));
220*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(content_type, "text/plain;charset=US-ASCII");
221*6777b538SAndroid Build Coastguard Worker }
222*6777b538SAndroid Build Coastguard Worker }
223*6777b538SAndroid Build Coastguard Worker
TEST(DataURLTest,BuildResponseInput)224*6777b538SAndroid Build Coastguard Worker TEST(DataURLTest, BuildResponseInput) {
225*6777b538SAndroid Build Coastguard Worker std::string mime_type;
226*6777b538SAndroid Build Coastguard Worker std::string charset;
227*6777b538SAndroid Build Coastguard Worker std::string data;
228*6777b538SAndroid Build Coastguard Worker scoped_refptr<HttpResponseHeaders> headers;
229*6777b538SAndroid Build Coastguard Worker
230*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(ERR_INVALID_URL,
231*6777b538SAndroid Build Coastguard Worker DataURL::BuildResponse(GURL("bogus"), "GET", &mime_type, &charset,
232*6777b538SAndroid Build Coastguard Worker &data, &headers));
233*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(headers);
234*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(mime_type.empty());
235*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(charset.empty());
236*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(data.empty());
237*6777b538SAndroid Build Coastguard Worker }
238*6777b538SAndroid Build Coastguard Worker
TEST(DataURLTest,BuildResponseInvalidMimeType)239*6777b538SAndroid Build Coastguard Worker TEST(DataURLTest, BuildResponseInvalidMimeType) {
240*6777b538SAndroid Build Coastguard Worker std::string mime_type;
241*6777b538SAndroid Build Coastguard Worker std::string charset;
242*6777b538SAndroid Build Coastguard Worker std::string data;
243*6777b538SAndroid Build Coastguard Worker scoped_refptr<HttpResponseHeaders> headers;
244*6777b538SAndroid Build Coastguard Worker
245*6777b538SAndroid Build Coastguard Worker // MIME type contains delimiters. Must be accepted but Content-Type header
246*6777b538SAndroid Build Coastguard Worker // should be generated as if the mediatype was text/plain.
247*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(OK, DataURL::BuildResponse(GURL("data:f(o/b)r,test"), "GET",
248*6777b538SAndroid Build Coastguard Worker &mime_type, &charset, &data, &headers));
249*6777b538SAndroid Build Coastguard Worker
250*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(headers);
251*6777b538SAndroid Build Coastguard Worker std::string value;
252*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(headers->GetNormalizedHeader("Content-Type", &value));
253*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(value, "text/plain;charset=US-ASCII");
254*6777b538SAndroid Build Coastguard Worker }
255*6777b538SAndroid Build Coastguard Worker
TEST(DataURLTest,InvalidCharset)256*6777b538SAndroid Build Coastguard Worker TEST(DataURLTest, InvalidCharset) {
257*6777b538SAndroid Build Coastguard Worker std::string mime_type;
258*6777b538SAndroid Build Coastguard Worker std::string charset;
259*6777b538SAndroid Build Coastguard Worker std::string data;
260*6777b538SAndroid Build Coastguard Worker scoped_refptr<HttpResponseHeaders> headers;
261*6777b538SAndroid Build Coastguard Worker
262*6777b538SAndroid Build Coastguard Worker // MIME type contains delimiters. Must be rejected.
263*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(ERR_INVALID_URL, DataURL::BuildResponse(
264*6777b538SAndroid Build Coastguard Worker GURL("data:text/html;charset=(),test"), "GET",
265*6777b538SAndroid Build Coastguard Worker &mime_type, &charset, &data, &headers));
266*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(headers);
267*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(mime_type.empty());
268*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(charset.empty());
269*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(data.empty());
270*6777b538SAndroid Build Coastguard Worker }
271*6777b538SAndroid Build Coastguard Worker
272*6777b538SAndroid Build Coastguard Worker // Test a slightly larger data URL.
TEST(DataURLTest,Image)273*6777b538SAndroid Build Coastguard Worker TEST(DataURLTest, Image) {
274*6777b538SAndroid Build Coastguard Worker // Use our nice little Chrome logo.
275*6777b538SAndroid Build Coastguard Worker GURL image_url(
276*6777b538SAndroid Build Coastguard Worker "data:image/png;base64,"
277*6777b538SAndroid Build Coastguard Worker "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADVklEQVQ4jX2TfUwUB"
278*6777b538SAndroid Build Coastguard Worker "BjG3w1y+HGcd9dxhXR8T4awOccJGgOSWclHImznLkTlSw0DDQXkrmgYgbUYnlQTqQ"
279*6777b538SAndroid Build Coastguard Worker "xIEVxitD5UMCATRA1CEEg+Qjw3bWDxIauJv/5oumqs39/P827vnucRmYN0gyF01GI"
280*6777b538SAndroid Build Coastguard Worker "5MpCVdW0gO7tvNC+vqSEtbZefk5NuLv1jdJ46p/zw0HeH4+PHr3h7c1mjoV2t5rKz"
281*6777b538SAndroid Build Coastguard Worker "Mx1+fg9bAgK6zHq9cU5z+LpA3xOtx34+vTeT21onRuzssC3zxbbSwC13d/pFuC7Ck"
282*6777b538SAndroid Build Coastguard Worker "IMDxQpF7r/MWq12UctI1dWWm99ypqSYmRUBdKem8MkrO/kgaTt1O7YzlpzE5GIVd0"
283*6777b538SAndroid Build Coastguard Worker "WYUqt57yWf2McHTObYPbVD+ZwbtlLTVMZ3BW+TnLyXLaWtmEq6WJVbT3HBh3Svj2H"
284*6777b538SAndroid Build Coastguard Worker "QQcm43XwmtoYM6vVKleh0uoWvnzW3v3MpidruPTQPf0bia7sJOtBM0ufTWNvus/nk"
285*6777b538SAndroid Build Coastguard Worker "DFHF9ZS+uYVjRUasMeHUmyLYtcklTvzWGFZnNOXczThvpKIzjcahSqIzkvDLayDq6"
286*6777b538SAndroid Build Coastguard Worker "D3eOjtBbNUEIZYyqsvj4V4wY92eNJ4IoyhTbxXX1T5xsV9tm9r4TQwHLiZw/pdDZJ"
287*6777b538SAndroid Build Coastguard Worker "ea8TKmsmR/K0uLh/GwnCHghTja6lPhphezPfO5/5MrVvMzNaI3+ERHfrFzPKQukrQ"
288*6777b538SAndroid Build Coastguard Worker "GI4d/3EFD/3E2mVNYvi4at7CXWREaxZGD+3hg28zD3gVMd6q5c8GdosynKmSeRuGz"
289*6777b538SAndroid Build Coastguard Worker "pjyl1/9UDGtPR5HeaKT8Wjo17WXk579BXVUhN64ehF9fhRtq/uxxZKzNiZFGD0wRC"
290*6777b538SAndroid Build Coastguard Worker "3NFROZ5mwIPL/96K/rKMMLrIzF9uhHr+/sYH7DAbwlgC4J+R2Z7FUx1qLnV7MGF40"
291*6777b538SAndroid Build Coastguard Worker "smVSoJ/jvHRfYhQeUJd/SnYtGWhPHR0Sz+GE2F2yth0B36Vcz2KpnufBJbsysjjW4"
292*6777b538SAndroid Build Coastguard Worker "kblBUiIjiURUWqJY65zxbnTy57GQyH58zgy0QBtTQv5gH15XMdKkYu+TGaJMnlm2O"
293*6777b538SAndroid Build Coastguard Worker "34uI4b9tflqp1+QEFGzoW/ulmcofcpkZCYJhDfSpme7QcrHa+Xfji8paEQkTkSfmm"
294*6777b538SAndroid Build Coastguard Worker "oRWRNZr/F1KfVMjW+IKEnv2FwZfKdzt0BQR6lClcZR0EfEXEfv/G6W9iLiIyCoReV"
295*6777b538SAndroid Build Coastguard Worker "5EnhORIBHx+ufPj/gLB/zGI/G4Bk0AAAAASUVORK5CYII=");
296*6777b538SAndroid Build Coastguard Worker
297*6777b538SAndroid Build Coastguard Worker std::string mime_type;
298*6777b538SAndroid Build Coastguard Worker std::string charset;
299*6777b538SAndroid Build Coastguard Worker std::string data;
300*6777b538SAndroid Build Coastguard Worker scoped_refptr<HttpResponseHeaders> headers;
301*6777b538SAndroid Build Coastguard Worker
302*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(OK, DataURL::BuildResponse(image_url, "GET", &mime_type, &charset,
303*6777b538SAndroid Build Coastguard Worker &data, &headers));
304*6777b538SAndroid Build Coastguard Worker
305*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(911u, data.size());
306*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("image/png", mime_type);
307*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(charset.empty());
308*6777b538SAndroid Build Coastguard Worker
309*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(headers);
310*6777b538SAndroid Build Coastguard Worker std::string value;
311*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(headers->GetStatusLine(), "HTTP/1.1 200 OK");
312*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(headers->GetNormalizedHeader("Content-Type", &value));
313*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(value, "image/png");
314*6777b538SAndroid Build Coastguard Worker }
315*6777b538SAndroid Build Coastguard Worker
316*6777b538SAndroid Build Coastguard Worker } // namespace net
317