data_url.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#ifndef NET_BASE_DATA_URL_H_ 69ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#define NET_BASE_DATA_URL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See RFC 2397 for a complete description of the 'data' URL scheme. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Briefly, a 'data' URL has the form: 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// data:[<mediatype>][;base64],<data> 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The <mediatype> is an Internet media type specification (with optional 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameters.) The appearance of ";base64" means that the data is encoded as 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base64. Without ";base64", the data (as a sequence of octets) is represented 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// using ASCII encoding for octets inside the range of safe URL characters and 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// using the standard %xx hex encoding of URLs for octets outside that range. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If <mediatype> is omitted, it defaults to text/plain;charset=US-ASCII. As a 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// shorthand, "text/plain" can be omitted but the charset parameter supplied. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT DataURL { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method can be used to parse a 'data' URL into its component pieces. 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The resulting mime_type is normalized to lowercase. The data is the 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // decoded data (e.g.., if the data URL specifies base64 encoding, then the 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returned data is base64 decoded, and any %-escaped bytes are unescaped). 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the URL is malformed, then this method will return false, and its 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // output variables will remain unchanged. On success, true is returned. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OPTIONAL: If |data| is NULL, then the <data> section will not be parsed 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or validated. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Parse(const GURL& url, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* mime_type, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* charset, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* data); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_BASE_DATA_URL_H_ 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)