15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url_request_job_factory.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_dir_url_request_job.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url_request_job.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileSystemProtocolHandler 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public net::URLRequestJobFactory::ProtocolHandler { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FileSystemProtocolHandler(const std::string& storage_domain, 2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FileSystemContext* context); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FileSystemProtocolHandler(); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual net::URLRequestJob* MaybeCreateJob( 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkDelegate* network_delegate) const OVERRIDE; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string storage_domain_; 3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No scoped_refptr because |file_system_context_| is owned by the 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ProfileIOData, which also owns this ProtocolHandler. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemContext* const file_system_context_; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FileSystemProtocolHandler); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileSystemProtocolHandler::FileSystemProtocolHandler( 4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string& storage_domain, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemContext* context) 4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) : storage_domain_(storage_domain), 4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) file_system_context_(context) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(file_system_context_); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileSystemProtocolHandler::~FileSystemProtocolHandler() {} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestJob* FileSystemProtocolHandler::MaybeCreateJob( 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, net::NetworkDelegate* network_delegate) const { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string path = request->url().path(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the path ends with a /, we know it's a directory. If the path refers 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to a directory and gets dispatched to FileSystemURLRequestJob, that class 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // redirects back here, by adding a / to the URL. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!path.empty() && path[path.size() - 1] == '/') { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FileSystemDirURLRequestJob( 5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) request, network_delegate, storage_domain_, file_system_context_); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new FileSystemURLRequestJob( 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) request, network_delegate, storage_domain_, file_system_context_); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // anonymous namespace 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)net::URLRequestJobFactory::ProtocolHandler* CreateFileSystemProtocolHandler( 6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string& storage_domain, FileSystemContext* context) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(context); 7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return new FileSystemProtocolHandler(storage_domain, context); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace storage 74