xref: /aosp_15_r20/external/cronet/net/base/data_url.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 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 #ifndef NET_BASE_DATA_URL_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_BASE_DATA_URL_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <string>
9*6777b538SAndroid Build Coastguard Worker #include <string_view>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h"
12*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker class GURL;
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker namespace net {
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker class HttpResponseHeaders;
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker // See RFC 2397 for a complete description of the 'data' URL scheme.
22*6777b538SAndroid Build Coastguard Worker //
23*6777b538SAndroid Build Coastguard Worker // Briefly, a 'data' URL has the form:
24*6777b538SAndroid Build Coastguard Worker //
25*6777b538SAndroid Build Coastguard Worker //   data:[<mediatype>][;base64],<data>
26*6777b538SAndroid Build Coastguard Worker //
27*6777b538SAndroid Build Coastguard Worker // The <mediatype> is an Internet media type specification (with optional
28*6777b538SAndroid Build Coastguard Worker // parameters.)  The appearance of ";base64" means that the data is encoded as
29*6777b538SAndroid Build Coastguard Worker // base64.  Without ";base64", the data (as a sequence of octets) is represented
30*6777b538SAndroid Build Coastguard Worker // using ASCII encoding for octets inside the range of safe URL characters and
31*6777b538SAndroid Build Coastguard Worker // using the standard %xx hex encoding of URLs for octets outside that range.
32*6777b538SAndroid Build Coastguard Worker // If <mediatype> is omitted, it defaults to text/plain;charset=US-ASCII.  As a
33*6777b538SAndroid Build Coastguard Worker // shorthand, "text/plain" can be omitted but the charset parameter supplied.
34*6777b538SAndroid Build Coastguard Worker //
35*6777b538SAndroid Build Coastguard Worker class NET_EXPORT DataURL {
36*6777b538SAndroid Build Coastguard Worker  public:
37*6777b538SAndroid Build Coastguard Worker   // This method can be used to parse a 'data' URL into its component pieces.
38*6777b538SAndroid Build Coastguard Worker   //
39*6777b538SAndroid Build Coastguard Worker   // |mime_type| and |charset| must be non-null and point to empty strings.
40*6777b538SAndroid Build Coastguard Worker   //
41*6777b538SAndroid Build Coastguard Worker   // If |data| is null, then the <data> section will not be parsed or validated.
42*6777b538SAndroid Build Coastguard Worker   // If non-null, it must point to an empty string.
43*6777b538SAndroid Build Coastguard Worker   //
44*6777b538SAndroid Build Coastguard Worker   // The resulting mime_type is normalized to lowercase.  The data is the
45*6777b538SAndroid Build Coastguard Worker   // decoded data (e.g.., if the data URL specifies base64 encoding, then the
46*6777b538SAndroid Build Coastguard Worker   // returned data is base64 decoded, and any %-escaped bytes are unescaped).
47*6777b538SAndroid Build Coastguard Worker   //
48*6777b538SAndroid Build Coastguard Worker   // If the media type value doesn't match the media-type production defined in
49*6777b538SAndroid Build Coastguard Worker   // RFC 7231, mime_type will be set to the default value "text/plain". We
50*6777b538SAndroid Build Coastguard Worker   // don't simply fail for this grammar violation since Chromium had been
51*6777b538SAndroid Build Coastguard Worker   // accepting such invalid values. For example, <img> element with the src
52*6777b538SAndroid Build Coastguard Worker   // attribute set to a data URL with an invalid media type "image" (without a
53*6777b538SAndroid Build Coastguard Worker   // slash and subtype) had been displayed. However, the value this method will
54*6777b538SAndroid Build Coastguard Worker   // store in mime_type argument can be used for generating other headers, etc.
55*6777b538SAndroid Build Coastguard Worker   // This could lead to security vulnerability. We don't want to accept
56*6777b538SAndroid Build Coastguard Worker   // arbitrary value and ask each caller to validate the return value.
57*6777b538SAndroid Build Coastguard Worker   //
58*6777b538SAndroid Build Coastguard Worker   // If the charset parameter is specified but its value doesn't match the
59*6777b538SAndroid Build Coastguard Worker   // token production defined in RFC 7230, this method simply fails and returns
60*6777b538SAndroid Build Coastguard Worker   // false.
61*6777b538SAndroid Build Coastguard Worker   //
62*6777b538SAndroid Build Coastguard Worker   // If there's any other grammar violation in the URL, then this method will
63*6777b538SAndroid Build Coastguard Worker   // return false, and all passed in pointers will be unmodified. On success,
64*6777b538SAndroid Build Coastguard Worker   // true is returned.
65*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] static bool Parse(const GURL& url,
66*6777b538SAndroid Build Coastguard Worker                                   std::string* mime_type,
67*6777b538SAndroid Build Coastguard Worker                                   std::string* charset,
68*6777b538SAndroid Build Coastguard Worker                                   std::string* data);
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker   // Similar to parse, except that it also generates a bogus set of response
71*6777b538SAndroid Build Coastguard Worker   // headers, with Content-Type populated, and takes a method. Only the "HEAD"
72*6777b538SAndroid Build Coastguard Worker   // method modifies the response, resulting in a 0-length body. All arguments
73*6777b538SAndroid Build Coastguard Worker   // except must be non-null. All std::string pointers must point to empty
74*6777b538SAndroid Build Coastguard Worker   // strings, and |*headers| must be nullptr. Returns net::OK on success.
75*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] static Error BuildResponse(
76*6777b538SAndroid Build Coastguard Worker       const GURL& url,
77*6777b538SAndroid Build Coastguard Worker       std::string_view method,
78*6777b538SAndroid Build Coastguard Worker       std::string* mime_type,
79*6777b538SAndroid Build Coastguard Worker       std::string* charset,
80*6777b538SAndroid Build Coastguard Worker       std::string* data,
81*6777b538SAndroid Build Coastguard Worker       scoped_refptr<HttpResponseHeaders>* headers);
82*6777b538SAndroid Build Coastguard Worker };
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker }  // namespace net
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker #endif  // NET_BASE_DATA_URL_H_
87