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