15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simple implementation of a data: protocol handler. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_data_job.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/data_url.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/http/http_response_headers.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "url/gurl.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint URLRequestDataJob::BuildResponse(const GURL& url, 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string* mime_type, 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string* charset, 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string* data, 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HttpResponseHeaders* headers) { 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!net::DataURL::Parse(url, mime_type, charset, data)) 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return net::ERR_INVALID_URL; 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |mime_type| set by net::DataURL::Parse() is guaranteed to be in 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // token "/" token 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // form. |charset| is also guaranteed to be a token. 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!mime_type->empty()); 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!charset->empty()); 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (headers) { 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci headers->ReplaceStatusLine("HTTP/1.1 200 OK"); 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // "charset" in the Content-Type header is specified explicitly to follow 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the "token" ABNF in the HTTP spec. When DataURL::Parse() call is 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // successful, it's guaranteed that the string in |charset| follows the 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // "token" ABNF. 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string content_type_header = 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "Content-Type: " + *mime_type + ";charset=" + *charset; 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci headers->AddHeader(content_type_header); 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci headers->AddHeader("Access-Control-Allow-Origin: *"); 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return net::OK; 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestDataJob::URLRequestDataJob( 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, NetworkDelegate* network_delegate) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : URLRequestSimpleJob(request, network_delegate) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int URLRequestDataJob::GetData(std::string* mime_type, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* charset, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* data, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) const { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if data URL is valid. If not, don't bother to try to extract data. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, parse the data from the data URL. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url = request_->url(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_valid()) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ERR_INVALID_URL; 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(tyoshino): Get the headers and export via 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // URLRequestJob::GetResponseInfo(). 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return BuildResponse(url, mime_type, charset, data, NULL); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestDataJob::~URLRequestDataJob() { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 70