1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file.
4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/common/appcache_interfaces.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <set>
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
95e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/url_request/url_request.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace content {
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kHttpScheme[] = "http";
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kHttpsScheme[] = "https";
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char kDevToolsScheme[] = "chrome-devtools";
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kHttpGETMethod[] = "GET";
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kHttpHEADMethod[] = "HEAD";
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kEnableExecutableHandlers[] = "enable-appcache-executable-handlers";
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const base::FilePath::CharType kAppCacheDatabaseName[] =
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    FILE_PATH_LITERAL("Index");
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)AppCacheInfo::AppCacheInfo()
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : cache_id(kAppCacheNoCacheId),
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      group_id(0),
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      status(APPCACHE_STATUS_UNCACHED),
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      size(0),
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_complete(false) {
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)AppCacheInfo::~AppCacheInfo() {
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)AppCacheResourceInfo::AppCacheResourceInfo()
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : url(),
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      size(0),
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_master(false),
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_manifest(false),
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_intercept(false),
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_fallback(false),
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_foreign(false),
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_explicit(false),
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      response_id(kAppCacheNoResponseId) {
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)AppCacheResourceInfo::~AppCacheResourceInfo() {
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)AppCacheErrorDetails::AppCacheErrorDetails()
53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    : message(),
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      reason(APPCACHE_UNKNOWN_ERROR),
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      url(),
56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      status(0),
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      is_cross_origin(false) {}
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)AppCacheErrorDetails::AppCacheErrorDetails(
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    std::string in_message,
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    AppCacheErrorReason in_reason,
62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    GURL in_url,
63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    int in_status,
64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    bool in_is_cross_origin)
65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    : message(in_message),
66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      reason(in_reason),
67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      url(in_url),
68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      status(in_status),
69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      is_cross_origin(in_is_cross_origin) {}
70e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)AppCacheErrorDetails::~AppCacheErrorDetails() {}
72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
73116680a4aac90f2aa7413d9095a592090648e557Ben MurdochAppCacheNamespace::AppCacheNamespace()
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : type(APPCACHE_FALLBACK_NAMESPACE),
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_pattern(false),
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_executable(false) {
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
79116680a4aac90f2aa7413d9095a592090648e557Ben MurdochAppCacheNamespace::AppCacheNamespace(
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    AppCacheNamespaceType type, const GURL& url, const GURL& target,
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    bool is_pattern)
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : type(type),
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      namespace_url(url),
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      target_url(target),
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_pattern(is_pattern),
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_executable(false) {
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
89116680a4aac90f2aa7413d9095a592090648e557Ben MurdochAppCacheNamespace::AppCacheNamespace(
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    AppCacheNamespaceType type, const GURL& url, const GURL& target,
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool is_pattern, bool is_executable)
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : type(type),
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      namespace_url(url),
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      target_url(target),
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_pattern(is_pattern),
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_executable(is_executable) {
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
99116680a4aac90f2aa7413d9095a592090648e557Ben MurdochAppCacheNamespace::~AppCacheNamespace() {
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool AppCacheNamespace::IsMatch(const GURL& url) const {
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (is_pattern) {
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // We have to escape '?' characters since MatchPattern also treats those
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // as wildcards which we don't want here, we only do '*'s.
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    std::string pattern = namespace_url.spec();
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (namespace_url.has_query())
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ReplaceSubstringsAfterOffset(&pattern, 0, "?", "\\?");
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return MatchPattern(url.spec(), pattern);
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return StartsWithASCII(url.spec(), namespace_url.spec(), true);
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool IsSchemeSupportedForAppCache(const GURL& url) {
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool supported = url.SchemeIs(kHttpScheme) || url.SchemeIs(kHttpsScheme) ||
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      url.SchemeIs(kDevToolsScheme);
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef NDEBUG
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // TODO(michaeln): It would be really nice if this could optionally work for
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // file and filesystem urls too to help web developers experiment and test
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // their apps, perhaps enabled via a cmd line flag or some other developer
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // tool setting.  Unfortunately file scheme net::URLRequests don't produce the
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // same signalling (200 response codes, headers) as http URLRequests, so this
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // doesn't work just yet.
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // supported |= url.SchemeIsFile();
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return supported;
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool IsMethodSupportedForAppCache(const std::string& method) {
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return (method == kHttpGETMethod) || (method == kHttpHEADMethod);
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool IsSchemeAndMethodSupportedForAppCache(const net::URLRequest* request) {
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return IsSchemeSupportedForAppCache(request->url()) &&
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         IsMethodSupportedForAppCache(request->method());
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace content
140