blob: 7b615b372bc0de2fc9bc4740f798614df7fcb149 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/service_worker/service_worker_request_handler.h"
#include <string>
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/browser/service_worker/service_worker_provider_host.h"
#include "content/browser/service_worker/service_worker_registration.h"
#include "content/browser/service_worker/service_worker_url_request_job.h"
#include "content/browser/service_worker/service_worker_utils.h"
#include "content/common/service_worker/service_worker_types.h"
#include "net/url_request/url_request.h"
#include "net/url_request/url_request_interceptor.h"
#include "webkit/browser/blob/blob_storage_context.h"
namespace content {
namespace {
int kUserDataKey; // Key value is not important.
class ServiceWorkerRequestInterceptor
: public net::URLRequestInterceptor {
public:
ServiceWorkerRequestInterceptor() {}
virtual ~ServiceWorkerRequestInterceptor() {}
virtual net::URLRequestJob* MaybeInterceptRequest(
net::URLRequest* request,
net::NetworkDelegate* network_delegate) const OVERRIDE {
ServiceWorkerRequestHandler* handler =
ServiceWorkerRequestHandler::GetHandler(request);
if (!handler)
return NULL;
return handler->MaybeCreateJob(request, network_delegate);
}
private:
DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRequestInterceptor);
};
bool IsMethodSupportedForAppCache(const std::string& method) {
return (method == "GET") || (method == "HEAD");
}
bool IsSchemeAndMethodSupportedForAppCache(const net::URLRequest* request) {
return request->url().SchemeIsHTTPOrHTTPS() &&
IsMethodSupportedForAppCache(request->method());
}
} // namespace
void ServiceWorkerRequestHandler::InitializeHandler(
net::URLRequest* request,
ServiceWorkerContextWrapper* context_wrapper,
webkit_blob::BlobStorageContext* blob_storage_context,
int process_id,
int provider_id,
ResourceType resource_type) {
if (!IsSchemeAndMethodSupportedForAppCache(request)) {
return;
}
if (!context_wrapper || !context_wrapper->context() ||
provider_id == kInvalidServiceWorkerProviderId) {
return;
}
ServiceWorkerProviderHost* provider_host =
context_wrapper->context()->GetProviderHost(process_id, provider_id);
if (!provider_host || !provider_host->IsContextAlive())
return;
scoped_ptr<ServiceWorkerRequestHandler> handler(
provider_host->CreateRequestHandler(resource_type,
blob_storage_context->AsWeakPtr()));
if (!handler)
return;
request->SetUserData(&kUserDataKey, handler.release());
}
ServiceWorkerRequestHandler* ServiceWorkerRequestHandler::GetHandler(
net::URLRequest* request) {
return reinterpret_cast<ServiceWorkerRequestHandler*>(
request->GetUserData(&kUserDataKey));
}
scoped_ptr<net::URLRequestInterceptor>
ServiceWorkerRequestHandler::CreateInterceptor() {
return scoped_ptr<net::URLRequestInterceptor>(
new ServiceWorkerRequestInterceptor);
}
ServiceWorkerRequestHandler::~ServiceWorkerRequestHandler() {
}
ServiceWorkerRequestHandler::ServiceWorkerRequestHandler(
base::WeakPtr<ServiceWorkerContextCore> context,
base::WeakPtr<ServiceWorkerProviderHost> provider_host,
base::WeakPtr<webkit_blob::BlobStorageContext> blob_storage_context,
ResourceType resource_type)
: context_(context),
provider_host_(provider_host),
blob_storage_context_(blob_storage_context),
resource_type_(resource_type) {
}
} // namespace content