1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/common/appcache_interfaces.h"
6
7#include <set>
8
9#include "base/strings/string_util.h"
10#include "net/url_request/url_request.h"
11#include "url/gurl.h"
12
13namespace content {
14
15const char kHttpScheme[] = "http";
16const char kHttpsScheme[] = "https";
17const char kDevToolsScheme[] = "chrome-devtools";
18const char kHttpGETMethod[] = "GET";
19const char kHttpHEADMethod[] = "HEAD";
20
21const char kEnableExecutableHandlers[] = "enable-appcache-executable-handlers";
22
23const base::FilePath::CharType kAppCacheDatabaseName[] =
24    FILE_PATH_LITERAL("Index");
25
26AppCacheInfo::AppCacheInfo()
27    : cache_id(kAppCacheNoCacheId),
28      group_id(0),
29      status(APPCACHE_STATUS_UNCACHED),
30      size(0),
31      is_complete(false) {
32}
33
34AppCacheInfo::~AppCacheInfo() {
35}
36
37AppCacheResourceInfo::AppCacheResourceInfo()
38    : url(),
39      size(0),
40      is_master(false),
41      is_manifest(false),
42      is_intercept(false),
43      is_fallback(false),
44      is_foreign(false),
45      is_explicit(false),
46      response_id(kAppCacheNoResponseId) {
47}
48
49AppCacheResourceInfo::~AppCacheResourceInfo() {
50}
51
52AppCacheErrorDetails::AppCacheErrorDetails()
53    : message(),
54      reason(APPCACHE_UNKNOWN_ERROR),
55      url(),
56      status(0),
57      is_cross_origin(false) {}
58
59AppCacheErrorDetails::AppCacheErrorDetails(
60    std::string in_message,
61    AppCacheErrorReason in_reason,
62    GURL in_url,
63    int in_status,
64    bool in_is_cross_origin)
65    : message(in_message),
66      reason(in_reason),
67      url(in_url),
68      status(in_status),
69      is_cross_origin(in_is_cross_origin) {}
70
71AppCacheErrorDetails::~AppCacheErrorDetails() {}
72
73AppCacheNamespace::AppCacheNamespace()
74    : type(APPCACHE_FALLBACK_NAMESPACE),
75      is_pattern(false),
76      is_executable(false) {
77}
78
79AppCacheNamespace::AppCacheNamespace(
80    AppCacheNamespaceType type, const GURL& url, const GURL& target,
81    bool is_pattern)
82    : type(type),
83      namespace_url(url),
84      target_url(target),
85      is_pattern(is_pattern),
86      is_executable(false) {
87}
88
89AppCacheNamespace::AppCacheNamespace(
90    AppCacheNamespaceType type, const GURL& url, const GURL& target,
91    bool is_pattern, bool is_executable)
92    : type(type),
93      namespace_url(url),
94      target_url(target),
95      is_pattern(is_pattern),
96      is_executable(is_executable) {
97}
98
99AppCacheNamespace::~AppCacheNamespace() {
100}
101
102bool AppCacheNamespace::IsMatch(const GURL& url) const {
103  if (is_pattern) {
104    // We have to escape '?' characters since MatchPattern also treats those
105    // as wildcards which we don't want here, we only do '*'s.
106    std::string pattern = namespace_url.spec();
107    if (namespace_url.has_query())
108      ReplaceSubstringsAfterOffset(&pattern, 0, "?", "\\?");
109    return MatchPattern(url.spec(), pattern);
110  }
111  return StartsWithASCII(url.spec(), namespace_url.spec(), true);
112}
113
114bool IsSchemeSupportedForAppCache(const GURL& url) {
115  bool supported = url.SchemeIs(kHttpScheme) || url.SchemeIs(kHttpsScheme) ||
116      url.SchemeIs(kDevToolsScheme);
117
118#ifndef NDEBUG
119  // TODO(michaeln): It would be really nice if this could optionally work for
120  // file and filesystem urls too to help web developers experiment and test
121  // their apps, perhaps enabled via a cmd line flag or some other developer
122  // tool setting.  Unfortunately file scheme net::URLRequests don't produce the
123  // same signalling (200 response codes, headers) as http URLRequests, so this
124  // doesn't work just yet.
125  // supported |= url.SchemeIsFile();
126#endif
127  return supported;
128}
129
130bool IsMethodSupportedForAppCache(const std::string& method) {
131  return (method == kHttpGETMethod) || (method == kHttpHEADMethod);
132}
133
134bool IsSchemeAndMethodSupportedForAppCache(const net::URLRequest* request) {
135  return IsSchemeSupportedForAppCache(request->url()) &&
136         IsMethodSupportedForAppCache(request->method());
137}
138
139}  // namespace content
140