OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/url_request/url_request_job_manager.h" | 5 #include "net/url_request/url_request_job_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "build/build_config.h" | 9 #include "build/build_config.h" |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 | 38 |
39 URLRequestJobManager::URLRequestJobManager() : enable_file_access_(false) { | 39 URLRequestJobManager::URLRequestJobManager() : enable_file_access_(false) { |
40 #ifndef NDEBUG | 40 #ifndef NDEBUG |
41 allowed_thread_ = 0; | 41 allowed_thread_ = 0; |
42 allowed_thread_initialized_ = false; | 42 allowed_thread_initialized_ = false; |
43 #endif | 43 #endif |
44 } | 44 } |
45 | 45 |
46 URLRequestJobManager::~URLRequestJobManager() {} | 46 URLRequestJobManager::~URLRequestJobManager() {} |
47 | 47 |
48 URLRequestJob* URLRequestJobManager::CreateJob(net::URLRequest* request) const { | 48 net::URLRequestJob* URLRequestJobManager::CreateJob( |
| 49 net::URLRequest* request) const { |
49 #ifndef NDEBUG | 50 #ifndef NDEBUG |
50 DCHECK(IsAllowedThread()); | 51 DCHECK(IsAllowedThread()); |
51 #endif | 52 #endif |
52 | 53 |
53 // If we are given an invalid URL, then don't even try to inspect the scheme. | 54 // If we are given an invalid URL, then don't even try to inspect the scheme. |
54 if (!request->url().is_valid()) | 55 if (!request->url().is_valid()) |
55 return new URLRequestErrorJob(request, net::ERR_INVALID_URL); | 56 return new URLRequestErrorJob(request, net::ERR_INVALID_URL); |
56 | 57 |
57 // We do this here to avoid asking interceptors about unsupported schemes. | 58 // We do this here to avoid asking interceptors about unsupported schemes. |
58 const std::string& scheme = request->url().scheme(); // already lowercase | 59 const std::string& scheme = request->url().scheme(); // already lowercase |
59 if (!SupportsScheme(scheme)) | 60 if (!SupportsScheme(scheme)) |
60 return new URLRequestErrorJob(request, net::ERR_UNKNOWN_URL_SCHEME); | 61 return new URLRequestErrorJob(request, net::ERR_UNKNOWN_URL_SCHEME); |
61 | 62 |
62 // THREAD-SAFETY NOTICE: | 63 // THREAD-SAFETY NOTICE: |
63 // We do not need to acquire the lock here since we are only reading our | 64 // We do not need to acquire the lock here since we are only reading our |
64 // data structures. They should only be modified on the current thread. | 65 // data structures. They should only be modified on the current thread. |
65 | 66 |
66 // See if the request should be intercepted. | 67 // See if the request should be intercepted. |
67 if (!(request->load_flags() & net::LOAD_DISABLE_INTERCEPT)) { | 68 if (!(request->load_flags() & net::LOAD_DISABLE_INTERCEPT)) { |
68 InterceptorList::const_iterator i; | 69 InterceptorList::const_iterator i; |
69 for (i = interceptors_.begin(); i != interceptors_.end(); ++i) { | 70 for (i = interceptors_.begin(); i != interceptors_.end(); ++i) { |
70 URLRequestJob* job = (*i)->MaybeIntercept(request); | 71 net::URLRequestJob* job = (*i)->MaybeIntercept(request); |
71 if (job) | 72 if (job) |
72 return job; | 73 return job; |
73 } | 74 } |
74 } | 75 } |
75 | 76 |
76 // See if the request should be handled by a registered protocol factory. | 77 // See if the request should be handled by a registered protocol factory. |
77 // If the registered factory returns null, then we want to fall-back to the | 78 // If the registered factory returns null, then we want to fall-back to the |
78 // built-in protocol factory. | 79 // built-in protocol factory. |
79 FactoryMap::const_iterator i = factories_.find(scheme); | 80 FactoryMap::const_iterator i = factories_.find(scheme); |
80 if (i != factories_.end()) { | 81 if (i != factories_.end()) { |
81 URLRequestJob* job = i->second(request, scheme); | 82 net::URLRequestJob* job = i->second(request, scheme); |
82 if (job) | 83 if (job) |
83 return job; | 84 return job; |
84 } | 85 } |
85 | 86 |
86 // See if the request should be handled by a built-in protocol factory. | 87 // See if the request should be handled by a built-in protocol factory. |
87 for (size_t i = 0; i < arraysize(kBuiltinFactories); ++i) { | 88 for (size_t i = 0; i < arraysize(kBuiltinFactories); ++i) { |
88 if (scheme == kBuiltinFactories[i].scheme) { | 89 if (scheme == kBuiltinFactories[i].scheme) { |
89 URLRequestJob* job = (kBuiltinFactories[i].factory)(request, scheme); | 90 net::URLRequestJob* job = (kBuiltinFactories[i].factory)(request, scheme); |
90 DCHECK(job); // The built-in factories are not expected to fail! | 91 DCHECK(job); // The built-in factories are not expected to fail! |
91 return job; | 92 return job; |
92 } | 93 } |
93 } | 94 } |
94 | 95 |
95 // If we reached here, then it means that a registered protocol factory | 96 // If we reached here, then it means that a registered protocol factory |
96 // wasn't interested in handling the URL. That is fairly unexpected, and we | 97 // wasn't interested in handling the URL. That is fairly unexpected, and we |
97 // don't know have a specific error to report here :-( | 98 // don't know have a specific error to report here :-( |
98 LOG(WARNING) << "Failed to map: " << request->url().spec(); | 99 LOG(WARNING) << "Failed to map: " << request->url().spec(); |
99 return new URLRequestErrorJob(request, net::ERR_FAILED); | 100 return new URLRequestErrorJob(request, net::ERR_FAILED); |
100 } | 101 } |
101 | 102 |
102 URLRequestJob* URLRequestJobManager::MaybeInterceptRedirect( | 103 net::URLRequestJob* URLRequestJobManager::MaybeInterceptRedirect( |
103 net::URLRequest* request, | 104 net::URLRequest* request, |
104 const GURL& location) const { | 105 const GURL& location) const { |
105 #ifndef NDEBUG | 106 #ifndef NDEBUG |
106 DCHECK(IsAllowedThread()); | 107 DCHECK(IsAllowedThread()); |
107 #endif | 108 #endif |
108 if ((request->load_flags() & net::LOAD_DISABLE_INTERCEPT) || | 109 if ((request->load_flags() & net::LOAD_DISABLE_INTERCEPT) || |
109 (request->status().status() == URLRequestStatus::CANCELED) || | 110 (request->status().status() == URLRequestStatus::CANCELED) || |
110 !request->url().is_valid() || | 111 !request->url().is_valid() || |
111 !SupportsScheme(request->url().scheme())) | 112 !SupportsScheme(request->url().scheme())) |
112 return NULL; | 113 return NULL; |
113 | 114 |
114 InterceptorList::const_iterator i; | 115 InterceptorList::const_iterator i; |
115 for (i = interceptors_.begin(); i != interceptors_.end(); ++i) { | 116 for (i = interceptors_.begin(); i != interceptors_.end(); ++i) { |
116 URLRequestJob* job = (*i)->MaybeInterceptRedirect(request, location); | 117 net::URLRequestJob* job = (*i)->MaybeInterceptRedirect(request, location); |
117 if (job) | 118 if (job) |
118 return job; | 119 return job; |
119 } | 120 } |
120 return NULL; | 121 return NULL; |
121 } | 122 } |
122 | 123 |
123 URLRequestJob* URLRequestJobManager::MaybeInterceptResponse( | 124 net::URLRequestJob* URLRequestJobManager::MaybeInterceptResponse( |
124 net::URLRequest* request) const { | 125 net::URLRequest* request) const { |
125 #ifndef NDEBUG | 126 #ifndef NDEBUG |
126 DCHECK(IsAllowedThread()); | 127 DCHECK(IsAllowedThread()); |
127 #endif | 128 #endif |
128 if ((request->load_flags() & net::LOAD_DISABLE_INTERCEPT) || | 129 if ((request->load_flags() & net::LOAD_DISABLE_INTERCEPT) || |
129 (request->status().status() == URLRequestStatus::CANCELED) || | 130 (request->status().status() == URLRequestStatus::CANCELED) || |
130 !request->url().is_valid() || | 131 !request->url().is_valid() || |
131 !SupportsScheme(request->url().scheme())) | 132 !SupportsScheme(request->url().scheme())) |
132 return NULL; | 133 return NULL; |
133 | 134 |
134 InterceptorList::const_iterator i; | 135 InterceptorList::const_iterator i; |
135 for (i = interceptors_.begin(); i != interceptors_.end(); ++i) { | 136 for (i = interceptors_.begin(); i != interceptors_.end(); ++i) { |
136 URLRequestJob* job = (*i)->MaybeInterceptResponse(request); | 137 net::URLRequestJob* job = (*i)->MaybeInterceptResponse(request); |
137 if (job) | 138 if (job) |
138 return job; | 139 return job; |
139 } | 140 } |
140 return NULL; | 141 return NULL; |
141 } | 142 } |
142 | 143 |
143 bool URLRequestJobManager::SupportsScheme(const std::string& scheme) const { | 144 bool URLRequestJobManager::SupportsScheme(const std::string& scheme) const { |
144 // The set of registered factories may change on another thread. | 145 // The set of registered factories may change on another thread. |
145 { | 146 { |
146 AutoLock locked(lock_); | 147 AutoLock locked(lock_); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 DCHECK(IsAllowedThread()); | 199 DCHECK(IsAllowedThread()); |
199 #endif | 200 #endif |
200 | 201 |
201 AutoLock locked(lock_); | 202 AutoLock locked(lock_); |
202 | 203 |
203 InterceptorList::iterator i = | 204 InterceptorList::iterator i = |
204 std::find(interceptors_.begin(), interceptors_.end(), interceptor); | 205 std::find(interceptors_.begin(), interceptors_.end(), interceptor); |
205 DCHECK(i != interceptors_.end()); | 206 DCHECK(i != interceptors_.end()); |
206 interceptors_.erase(i); | 207 interceptors_.erase(i); |
207 } | 208 } |
OLD | NEW |