| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/proxy/proxy_script_fetcher_impl.h" | 5 #include "net/proxy/proxy_script_fetcher_impl.h" |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/i18n/icu_string_conversions.h" | 8 #include "base/i18n/icu_string_conversions.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 // The maximum size (in bytes) allowed for a PAC script. Responses exceeding | 28 // The maximum size (in bytes) allowed for a PAC script. Responses exceeding |
| 29 // this will fail with ERR_FILE_TOO_BIG. | 29 // this will fail with ERR_FILE_TOO_BIG. |
| 30 const int kDefaultMaxResponseBytes = 1048576; // 1 megabyte | 30 const int kDefaultMaxResponseBytes = 1048576; // 1 megabyte |
| 31 | 31 |
| 32 // The maximum duration (in milliseconds) allowed for fetching the PAC script. | 32 // The maximum duration (in milliseconds) allowed for fetching the PAC script. |
| 33 // Responses exceeding this will fail with ERR_TIMED_OUT. | 33 // Responses exceeding this will fail with ERR_TIMED_OUT. |
| 34 const int kDefaultMaxDurationMs = 300000; // 5 minutes | 34 const int kDefaultMaxDurationMs = 300000; // 5 minutes |
| 35 | 35 |
| 36 // Returns true if |mime_type| is one of the known PAC mime type. | 36 // Returns true if |mime_type| is one of the known PAC mime type. |
| 37 bool IsPacMimeType(const std::string& mime_type) { | 37 bool IsPacMimeType(const std::string& mime_type) { |
| 38 static const char * const kSupportedPacMimeTypes[] = { | 38 static const char* const kSupportedPacMimeTypes[] = { |
| 39 "application/x-ns-proxy-autoconfig", | 39 "application/x-ns-proxy-autoconfig", "application/x-javascript-config", |
| 40 "application/x-javascript-config", | |
| 41 }; | 40 }; |
| 42 for (size_t i = 0; i < arraysize(kSupportedPacMimeTypes); ++i) { | 41 for (size_t i = 0; i < arraysize(kSupportedPacMimeTypes); ++i) { |
| 43 if (LowerCaseEqualsASCII(mime_type, kSupportedPacMimeTypes[i])) | 42 if (LowerCaseEqualsASCII(mime_type, kSupportedPacMimeTypes[i])) |
| 44 return true; | 43 return true; |
| 45 } | 44 } |
| 46 return false; | 45 return false; |
| 47 } | 46 } |
| 48 | 47 |
| 49 // Converts |bytes| (which is encoded by |charset|) to UTF16, saving the resul | 48 // Converts |bytes| (which is encoded by |charset|) to UTF16, saving the resul |
| 50 // to |*utf16|. | 49 // to |*utf16|. |
| 51 // If |charset| is empty, then we don't know what it was and guess. | 50 // If |charset| is empty, then we don't know what it was and guess. |
| 52 void ConvertResponseToUTF16(const std::string& charset, | 51 void ConvertResponseToUTF16(const std::string& charset, |
| 53 const std::string& bytes, | 52 const std::string& bytes, |
| 54 base::string16* utf16) { | 53 base::string16* utf16) { |
| 55 const char* codepage; | 54 const char* codepage; |
| 56 | 55 |
| 57 if (charset.empty()) { | 56 if (charset.empty()) { |
| 58 // Assume ISO-8859-1 if no charset was specified. | 57 // Assume ISO-8859-1 if no charset was specified. |
| 59 codepage = base::kCodepageLatin1; | 58 codepage = base::kCodepageLatin1; |
| 60 } else { | 59 } else { |
| 61 // Otherwise trust the charset that was provided. | 60 // Otherwise trust the charset that was provided. |
| 62 codepage = charset.c_str(); | 61 codepage = charset.c_str(); |
| 63 } | 62 } |
| 64 | 63 |
| 65 // We will be generous in the conversion -- if any characters lie | 64 // We will be generous in the conversion -- if any characters lie |
| 66 // outside of |charset| (i.e. invalid), then substitute them with | 65 // outside of |charset| (i.e. invalid), then substitute them with |
| 67 // U+FFFD rather than failing. | 66 // U+FFFD rather than failing. |
| 68 base::CodepageToUTF16(bytes, codepage, | 67 base::CodepageToUTF16( |
| 69 base::OnStringConversionError::SUBSTITUTE, | 68 bytes, codepage, base::OnStringConversionError::SUBSTITUTE, utf16); |
| 70 utf16); | |
| 71 } | 69 } |
| 72 | 70 |
| 73 } // namespace | 71 } // namespace |
| 74 | 72 |
| 75 ProxyScriptFetcherImpl::ProxyScriptFetcherImpl( | 73 ProxyScriptFetcherImpl::ProxyScriptFetcherImpl( |
| 76 URLRequestContext* url_request_context) | 74 URLRequestContext* url_request_context) |
| 77 : weak_factory_(this), | 75 : weak_factory_(this), |
| 78 url_request_context_(url_request_context), | 76 url_request_context_(url_request_context), |
| 79 buf_(new IOBuffer(kBufSize)), | 77 buf_(new IOBuffer(kBufSize)), |
| 80 next_id_(0), | 78 next_id_(0), |
| (...skipping 27 matching lines...) Expand all Loading... |
| 108 DCHECK_EQ(request, cur_request_.get()); | 106 DCHECK_EQ(request, cur_request_.get()); |
| 109 | 107 |
| 110 // Use |result_code_| as the request's error if we have already set it to | 108 // Use |result_code_| as the request's error if we have already set it to |
| 111 // something specific. | 109 // something specific. |
| 112 if (result_code_ == OK && !request->status().is_success()) | 110 if (result_code_ == OK && !request->status().is_success()) |
| 113 result_code_ = request->status().error(); | 111 result_code_ = request->status().error(); |
| 114 | 112 |
| 115 FetchCompleted(); | 113 FetchCompleted(); |
| 116 } | 114 } |
| 117 | 115 |
| 118 int ProxyScriptFetcherImpl::Fetch( | 116 int ProxyScriptFetcherImpl::Fetch(const GURL& url, |
| 119 const GURL& url, base::string16* text, const CompletionCallback& callback) { | 117 base::string16* text, |
| 118 const CompletionCallback& callback) { |
| 120 // It is invalid to call Fetch() while a request is already in progress. | 119 // It is invalid to call Fetch() while a request is already in progress. |
| 121 DCHECK(!cur_request_.get()); | 120 DCHECK(!cur_request_.get()); |
| 122 DCHECK(!callback.is_null()); | 121 DCHECK(!callback.is_null()); |
| 123 DCHECK(text); | 122 DCHECK(text); |
| 124 | 123 |
| 125 // Handle base-64 encoded data-urls that contain custom PAC scripts. | 124 // Handle base-64 encoded data-urls that contain custom PAC scripts. |
| 126 if (url.SchemeIs("data")) { | 125 if (url.SchemeIs("data")) { |
| 127 std::string mime_type; | 126 std::string mime_type; |
| 128 std::string charset; | 127 std::string charset; |
| 129 std::string data; | 128 std::string data; |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 // is still applicable. | 313 // is still applicable. |
| 315 if (cur_request_id_ != id) | 314 if (cur_request_id_ != id) |
| 316 return; | 315 return; |
| 317 | 316 |
| 318 DCHECK(cur_request_.get()); | 317 DCHECK(cur_request_.get()); |
| 319 result_code_ = ERR_TIMED_OUT; | 318 result_code_ = ERR_TIMED_OUT; |
| 320 cur_request_->Cancel(); | 319 cur_request_->Cancel(); |
| 321 } | 320 } |
| 322 | 321 |
| 323 } // namespace net | 322 } // namespace net |
| OLD | NEW |