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