| Index: net/proxy/proxy_script_fetcher.cc
|
| ===================================================================
|
| --- net/proxy/proxy_script_fetcher.cc (revision 51195)
|
| +++ net/proxy/proxy_script_fetcher.cc (working copy)
|
| @@ -1,6 +1,6 @@
|
| -// Copyright (c) 2008 The Chromium Authors. All rights reserved. Use of this
|
| -// source code is governed by a BSD-style license that can be found in the
|
| -// LICENSE file.
|
| +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
|
|
| #include "net/proxy/proxy_script_fetcher.h"
|
|
|
| @@ -45,9 +45,12 @@
|
| return false;
|
| }
|
|
|
| -// Convert |bytes| (which is encoded by |charset|) in place to UTF8.
|
| +// Converts |bytes| (which is encoded by |charset|) to UTF16, saving the resul
|
| +// to |*utf16|.
|
| // If |charset| is empty, then we don't know what it was and guess.
|
| -void ConvertResponseToUTF8(const std::string& charset, std::string* bytes) {
|
| +void ConvertResponseToUTF16(const std::string& charset,
|
| + const std::string& bytes,
|
| + string16* utf16) {
|
| const char* codepage;
|
|
|
| if (charset.empty()) {
|
| @@ -61,12 +64,9 @@
|
| // We will be generous in the conversion -- if any characters lie
|
| // outside of |charset| (i.e. invalid), then substitute them with
|
| // U+FFFD rather than failing.
|
| - std::wstring tmp_wide;
|
| - base::CodepageToWide(*bytes, codepage,
|
| - base::OnStringConversionError::SUBSTITUTE,
|
| - &tmp_wide);
|
| - // TODO(eroman): would be nice to have a CodepageToUTF8() function.
|
| - *bytes = WideToUTF8(tmp_wide);
|
| + base::CodepageToUTF16(bytes, codepage,
|
| + base::OnStringConversionError::SUBSTITUTE,
|
| + utf16);
|
| }
|
|
|
| } // namespace
|
| @@ -83,7 +83,7 @@
|
|
|
| // ProxyScriptFetcher methods:
|
|
|
| - virtual int Fetch(const GURL& url, std::string* bytes,
|
| + virtual int Fetch(const GURL& url, string16* text,
|
| CompletionCallback* callback);
|
| virtual void Cancel();
|
| virtual URLRequestContext* GetRequestContext();
|
| @@ -103,7 +103,7 @@
|
| void ReadBody(URLRequest* request);
|
|
|
| // Called once the request has completed to notify the caller of
|
| - // |response_code_| and |response_bytes_|.
|
| + // |response_code_| and |response_text_|.
|
| void FetchCompleted();
|
|
|
| // Clear out the state for the current request.
|
| @@ -140,9 +140,12 @@
|
| // Holds the error condition that was hit on the current request, or OK.
|
| int result_code_;
|
|
|
| - // Holds the bytes read so far. Will not exceed |max_response_bytes|. This
|
| - // buffer is owned by the owner of |callback|.
|
| - std::string* result_bytes_;
|
| + // Holds the bytes read so far. Will not exceed |max_response_bytes|.
|
| + std::string bytes_read_so_far_;
|
| +
|
| + // This buffer is owned by the owner of |callback|, and will be filled with
|
| + // UTF16 response on completion.
|
| + string16* result_text_;
|
| };
|
|
|
| ProxyScriptFetcherImpl::ProxyScriptFetcherImpl(
|
| @@ -155,7 +158,7 @@
|
| cur_request_id_(0),
|
| callback_(NULL),
|
| result_code_(OK),
|
| - result_bytes_(NULL) {
|
| + result_text_(NULL) {
|
| DCHECK(url_request_context);
|
| }
|
|
|
| @@ -165,13 +168,13 @@
|
| }
|
|
|
| int ProxyScriptFetcherImpl::Fetch(const GURL& url,
|
| - std::string* bytes,
|
| + string16* text,
|
| CompletionCallback* callback) {
|
| // It is invalid to call Fetch() while a request is already in progress.
|
| DCHECK(!cur_request_.get());
|
|
|
| DCHECK(callback);
|
| - DCHECK(bytes);
|
| + DCHECK(text);
|
|
|
| cur_request_.reset(new URLRequest(url, this));
|
| cur_request_->set_context(url_request_context_);
|
| @@ -186,9 +189,10 @@
|
|
|
| // Save the caller's info for notification on completion.
|
| callback_ = callback;
|
| - result_bytes_ = bytes;
|
| - result_bytes_->clear();
|
| + result_text_ = text;
|
|
|
| + bytes_read_so_far_.clear();
|
| +
|
| // Post a task to timeout this request if it takes too long.
|
| cur_request_id_ = ++next_id_;
|
| MessageLoop::current()->PostDelayedTask(FROM_HERE,
|
| @@ -269,13 +273,13 @@
|
| DCHECK(request == cur_request_.get());
|
| if (num_bytes > 0) {
|
| // Enforce maximum size bound.
|
| - if (num_bytes + result_bytes_->size() >
|
| + if (num_bytes + bytes_read_so_far_.size() >
|
| static_cast<size_t>(max_response_bytes)) {
|
| result_code_ = ERR_FILE_TOO_BIG;
|
| request->Cancel();
|
| return;
|
| }
|
| - result_bytes_->append(buf_->data(), num_bytes);
|
| + bytes_read_so_far_.append(buf_->data(), num_bytes);
|
| ReadBody(request);
|
| } else { // Error while reading, or EOF
|
| OnResponseCompleted(request);
|
| @@ -305,13 +309,13 @@
|
|
|
| void ProxyScriptFetcherImpl::FetchCompleted() {
|
| if (result_code_ == OK) {
|
| - // The caller expects the response to be encoded as UTF8.
|
| + // The caller expects the response to be encoded as UTF16.
|
| std::string charset;
|
| cur_request_->GetCharset(&charset);
|
| - ConvertResponseToUTF8(charset, result_bytes_);
|
| + ConvertResponseToUTF16(charset, bytes_read_so_far_, result_text_);
|
| } else {
|
| // On error, the caller expects empty string for bytes.
|
| - result_bytes_->clear();
|
| + result_text_->clear();
|
| }
|
|
|
| int result_code = result_code_;
|
| @@ -327,7 +331,7 @@
|
| cur_request_id_ = 0;
|
| callback_ = NULL;
|
| result_code_ = OK;
|
| - result_bytes_ = NULL;
|
| + result_text_ = NULL;
|
| }
|
|
|
| void ProxyScriptFetcherImpl::OnTimeout(int id) {
|
|
|