1e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/browser/appcache/appcache_interceptor.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_backend_impl.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_host.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_request_handler.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_service_impl.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_url_request_job.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/common/appcache_interfaces.h" 13e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace content { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppCacheInterceptor* AppCacheInterceptor::GetInstance() { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Singleton<AppCacheInterceptor>::get(); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void AppCacheInterceptor::SetHandler(net::URLRequest* request, 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AppCacheRequestHandler* handler) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->SetUserData(GetInstance(), handler); // request takes ownership 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppCacheRequestHandler* AppCacheInterceptor::GetHandler( 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<AppCacheRequestHandler*>( 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->GetUserData(GetInstance())); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCacheInterceptor::SetExtraRequestInfo( 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::URLRequest* request, 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AppCacheServiceImpl* service, 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int process_id, 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int host_id, 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ResourceType resource_type) { 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!service || (host_id == kAppCacheNoHostId)) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheBackendImpl* backend = service->GetBackend(process_id); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!backend) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(michaeln): An invalid host id is indicative of bad data 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from a child process. How should we handle that here? 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheHost* host = backend->GetHost(host_id); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!host) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a handler for this request and associate it with the request. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheRequestHandler* handler = 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->CreateRequestHandler(request, resource_type); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handler) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetHandler(request, handler); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCacheInterceptor::GetExtraResponseInfo(net::URLRequest* request, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64* cache_id, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL* manifest_url) { 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(*cache_id == kAppCacheNoCacheId); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(manifest_url->is_empty()); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheRequestHandler* handler = GetHandler(request); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handler) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler->GetExtraResponseInfo(cache_id, manifest_url); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AppCacheInterceptor::PrepareForCrossSiteTransfer( 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::URLRequest* request, 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int old_process_id) { 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AppCacheRequestHandler* handler = GetHandler(request); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!handler) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) handler->PrepareForCrossSiteTransfer(old_process_id); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AppCacheInterceptor::CompleteCrossSiteTransfer( 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::URLRequest* request, 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int new_process_id, 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int new_host_id) { 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AppCacheRequestHandler* handler = GetHandler(request); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!handler) 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK_NE(kAppCacheNoHostId, new_host_id); 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) handler->CompleteCrossSiteTransfer(new_process_id, 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_host_id); 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppCacheInterceptor::AppCacheInterceptor() { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest::Deprecated::RegisterRequestInterceptor(this); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppCacheInterceptor::~AppCacheInterceptor() { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest::Deprecated::UnregisterRequestInterceptor(this); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestJob* AppCacheInterceptor::MaybeIntercept( 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, net::NetworkDelegate* network_delegate) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheRequestHandler* handler = GetHandler(request); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!handler) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handler->MaybeLoadResource(request, network_delegate); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestJob* AppCacheInterceptor::MaybeInterceptRedirect( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkDelegate* network_delegate, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& location) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheRequestHandler* handler = GetHandler(request); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!handler) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handler->MaybeLoadFallbackForRedirect( 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request, network_delegate, location); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestJob* AppCacheInterceptor::MaybeInterceptResponse( 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, net::NetworkDelegate* network_delegate) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheRequestHandler* handler = GetHandler(request); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!handler) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handler->MaybeLoadFallbackForResponse(request, network_delegate); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} // namespace content 125