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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "android_webview/browser/net/aw_url_request_job_factory.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_error_job.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_manager.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using net::NetworkDelegate;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using net::URLRequest;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using net::URLRequestJob;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android_webview {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AwURLRequestJobFactory::AwURLRequestJobFactory()
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : next_factory_(new net::URLRequestJobFactoryImpl()) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AwURLRequestJobFactory::~AwURLRequestJobFactory() {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AwURLRequestJobFactory::IsHandledProtocol(
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& scheme) const {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This introduces a dependency on the URLRequestJobManager
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // implementation. The assumption is that if true is returned from this
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // method it is still valid to return NULL from the
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MaybeCreateJobWithProtocolHandler method and in that case the
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLRequestJobManager will try and create the URLRequestJob by using the
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // set of built in handlers.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AwURLRequestJobFactory::IsHandledURL(const GURL& url) const {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestJob* AwURLRequestJobFactory::MaybeCreateJobWithProtocolHandler(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& scheme,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest* request,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetworkDelegate* network_delegate) const {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestJob* job = next_factory_->MaybeCreateJobWithProtocolHandler(
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scheme, request, network_delegate);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (job)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return job;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If URLRequest supports the scheme NULL should be returned from this method.
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // In that case the built in handlers will then be used to create the job.
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // NOTE(joth): See the assumption in IsHandledProtocol above.
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (net::URLRequest::IsHandledProtocol(scheme))
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new net::URLRequestErrorJob(
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request, network_delegate, net::ERR_UNKNOWN_URL_SCHEME);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AwURLRequestJobFactory::SetProtocolHandler(
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& scheme,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandler* protocol_handler) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return next_factory_->SetProtocolHandler(scheme, protocol_handler);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool AwURLRequestJobFactory::IsSafeRedirectTarget(const GURL& location) const {
67b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return next_factory_->IsSafeRedirectTarget(location);
68b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
69b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace android_webview
71