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