service_worker_request_handler.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// Copyright 2014 The Chromium Authors. All rights reserved. 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// Use of this source code is governed by a BSD-style license that can be 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// found in the LICENSE file. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com#include "content/browser/service_worker/service_worker_request_handler.h" 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 70397e9f3415b4646797f1b17e9a38b5deb864ff0reed#include "content/browser/service_worker/service_worker_context_core.h" 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "content/browser/service_worker/service_worker_context_wrapper.h" 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "content/browser/service_worker/service_worker_provider_host.h" 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "content/browser/service_worker/service_worker_registration.h" 110397e9f3415b4646797f1b17e9a38b5deb864ff0reed#include "content/browser/service_worker/service_worker_url_request_job.h" 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "content/browser/service_worker/service_worker_utils.h" 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "content/common/service_worker/service_worker_types.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "net/url_request/url_request.h" 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "net/url_request/url_request_interceptor.h" 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "webkit/browser/blob/blob_storage_context.h" 17658650c5b42653f5f7d9857252b764333331be58tfarina@chromium.org 18d3aed39ab1ad88b05b9423ee1329c227d1f8f612Scroggonamespace content { 19d3aed39ab1ad88b05b9423ee1329c227d1f8f612Scroggo 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comnamespace { 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 22e24ad23ae67ffcb0dc545b7e426cf08d102e0868commit-bot@chromium.orgint kUserDataKey; // Key value is not important. 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2428fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.orgclass ServiceWorkerRequestInterceptor 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com : public net::URLRequestInterceptor { 26f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com public: 27f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com ServiceWorkerRequestInterceptor() {} 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~ServiceWorkerRequestInterceptor() {} 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual net::URLRequestJob* MaybeInterceptRequest( 30658650c5b42653f5f7d9857252b764333331be58tfarina@chromium.org net::URLRequest* request, 31d3aed39ab1ad88b05b9423ee1329c227d1f8f612Scroggo net::NetworkDelegate* network_delegate) const OVERRIDE { 32d3aed39ab1ad88b05b9423ee1329c227d1f8f612Scroggo ServiceWorkerRequestHandler* handler = 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ServiceWorkerRequestHandler::GetHandler(request); 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (!handler) 350397e9f3415b4646797f1b17e9a38b5deb864ff0reed return NULL; 360397e9f3415b4646797f1b17e9a38b5deb864ff0reed return handler->MaybeCreateJob(request, network_delegate); 370397e9f3415b4646797f1b17e9a38b5deb864ff0reed } 385957f47e8de0ff55b8c0bf84984d4915c7c72825reed@google.com 395957f47e8de0ff55b8c0bf84984d4915c7c72825reed@google.com private: 40f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRequestInterceptor); 41f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}; 42f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 43f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.combool IsMethodSupported(const std::string& method) { 44f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com return (method == "GET") || (method == "HEAD"); 45f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com} 46f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 47f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.combool IsSchemeAndMethodSupported(const net::URLRequest* request) { 48f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com return request->url().SchemeIsHTTPOrHTTPS() && 49f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com IsMethodSupported(request->method()); 50f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com} 51f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 52f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com} // namespace 53f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 54f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comvoid ServiceWorkerRequestHandler::InitializeHandler( 55f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com net::URLRequest* request, 56f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com ServiceWorkerContextWrapper* context_wrapper, 57f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com webkit_blob::BlobStorageContext* blob_storage_context, 58f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com int process_id, 59e24ad23ae67ffcb0dc545b7e426cf08d102e0868commit-bot@chromium.org int provider_id, 60e24ad23ae67ffcb0dc545b7e426cf08d102e0868commit-bot@chromium.org ResourceType::Type resource_type) { 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (!ServiceWorkerUtils::IsFeatureEnabled() || 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com !IsSchemeAndMethodSupported(request)) { 63e24ad23ae67ffcb0dc545b7e426cf08d102e0868commit-bot@chromium.org return; 64e24ad23ae67ffcb0dc545b7e426cf08d102e0868commit-bot@chromium.org } 65e24ad23ae67ffcb0dc545b7e426cf08d102e0868commit-bot@chromium.org 66d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com if (!context_wrapper || !context_wrapper->context() || 67e24ad23ae67ffcb0dc545b7e426cf08d102e0868commit-bot@chromium.org provider_id == kInvalidServiceWorkerProviderId) { 68e24ad23ae67ffcb0dc545b7e426cf08d102e0868commit-bot@chromium.org return; 69e24ad23ae67ffcb0dc545b7e426cf08d102e0868commit-bot@chromium.org } 70e24ad23ae67ffcb0dc545b7e426cf08d102e0868commit-bot@chromium.org 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ServiceWorkerProviderHost* provider_host = 72d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com context_wrapper->context()->GetProviderHost(process_id, provider_id); 73d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com if (!provider_host) 74d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com return; 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com scoped_ptr<ServiceWorkerRequestHandler> handler( 77658650c5b42653f5f7d9857252b764333331be58tfarina@chromium.org provider_host->CreateRequestHandler(resource_type, 78658650c5b42653f5f7d9857252b764333331be58tfarina@chromium.org blob_storage_context->AsWeakPtr())); 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (!handler) 80f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com return; 81f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 82f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com request->SetUserData(&kUserDataKey, handler.release()); 83f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com} 84f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 85f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comServiceWorkerRequestHandler* ServiceWorkerRequestHandler::GetHandler( 86f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com net::URLRequest* request) { 87f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com return reinterpret_cast<ServiceWorkerRequestHandler*>( 88f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com request->GetUserData(&kUserDataKey)); 89f9bb7a8e2052d21e6a7f48d5b73d2ef97637a09ereed@google.com} 90e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com 91e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.comscoped_ptr<net::URLRequestInterceptor> 92f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comServiceWorkerRequestHandler::CreateInterceptor() { 93d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com return scoped_ptr<net::URLRequestInterceptor>( 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com new ServiceWorkerRequestInterceptor); 95d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com} 96d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comServiceWorkerRequestHandler::~ServiceWorkerRequestHandler() { 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 99f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 100261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.comServiceWorkerRequestHandler::ServiceWorkerRequestHandler( 101e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com base::WeakPtr<ServiceWorkerContextCore> context, 102e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com base::WeakPtr<ServiceWorkerProviderHost> provider_host, 103f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com base::WeakPtr<webkit_blob::BlobStorageContext> blob_storage_context, 104f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com ResourceType::Type resource_type) 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com : context_(context), 106d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com provider_host_(provider_host), 107d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com blob_storage_context_(blob_storage_context), 108d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com resource_type_(resource_type) { 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} // namespace content 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com