11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string>
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/ref_counted.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/base/net_errors.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/http/http_response_headers.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/http/http_version.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/url_request_data_job.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "url/gurl.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace net {
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(BuildResponseTest, Simple) {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string mime_type;
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string charset;
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string data;
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<net::HttpResponseHeaders> headers(
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new net::HttpResponseHeaders(std::string()));
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::OK,
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      URLRequestDataJob::BuildResponse(
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          GURL("data:,Hello"), &mime_type, &charset, &data, headers.get()));
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("text/plain", mime_type);
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("US-ASCII", charset);
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("Hello", data);
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const net::HttpVersion& version = headers->GetParsedHttpVersion();
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, version.major_value());
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, version.minor_value());
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("OK", headers->GetStatusText());
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string value;
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(headers->GetNormalizedHeader("Content-Type", &value));
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(value, "text/plain;charset=US-ASCII");
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  value.clear();
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      headers->GetNormalizedHeader("Access-Control-Allow-Origin", &value));
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(value, "*");
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(BuildResponseTest, InvalidInput) {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string mime_type;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string charset;
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string data;
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<net::HttpResponseHeaders> headers(
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new net::HttpResponseHeaders(std::string()));
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::ERR_INVALID_URL,
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      URLRequestDataJob::BuildResponse(
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          GURL("bogus"), &mime_type, &charset, &data, headers.get()));
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(BuildResponseTest, InvalidMimeType) {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string mime_type;
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string charset;
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string data;
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<net::HttpResponseHeaders> headers(
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new net::HttpResponseHeaders(std::string()));
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
66ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  // MIME type contains delimiters. Must be accepted but Content-Type header
67ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  // should be generated as if the mediatype was text/plain.
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(
69ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch      net::OK,
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      URLRequestDataJob::BuildResponse(
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          GURL("data:f(o/b)r,test"),
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          &mime_type, &charset, &data, headers.get()));
73ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch
74ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  std::string value;
75ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  EXPECT_TRUE(headers->GetNormalizedHeader("Content-Type", &value));
76ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  EXPECT_EQ(value, "text/plain;charset=US-ASCII");
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(BuildResponseTest, InvalidCharset) {
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string mime_type;
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string charset;
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string data;
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<net::HttpResponseHeaders> headers(
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new net::HttpResponseHeaders(std::string()));
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // MIME type contains delimiters. Must be rejected.
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::ERR_INVALID_URL,
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      URLRequestDataJob::BuildResponse(
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          GURL("data:text/html;charset=(),test"),
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          &mime_type, &charset, &data, headers.get()));
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace net
95