| Index: webkit/glue/ftp_directory_listing_response_delegate.cc
|
| diff --git a/webkit/glue/ftp_directory_listing_response_delegate.cc b/webkit/glue/ftp_directory_listing_response_delegate.cc
|
| index 0a2542bd4c360c7d5b3bf1ff74324f8839e73b9d..a94d299806def9d161a4a886705c9124c163613a 100644
|
| --- a/webkit/glue/ftp_directory_listing_response_delegate.cc
|
| +++ b/webkit/glue/ftp_directory_listing_response_delegate.cc
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2011 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.
|
|
|
| @@ -17,7 +17,6 @@
|
| #include "net/base/net_errors.h"
|
| #include "net/base/net_util.h"
|
| #include "net/ftp/ftp_directory_listing_parser.h"
|
| -#include "net/ftp/ftp_server_type_histograms.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderClient.h"
|
|
|
| @@ -60,37 +59,40 @@ FtpDirectoryListingResponseDelegate::FtpDirectoryListingResponseDelegate(
|
| WebURLLoader* loader,
|
| const WebURLResponse& response)
|
| : client_(client),
|
| - loader_(loader),
|
| - original_response_(response),
|
| - buffer_(base::Time::Now()),
|
| - updated_histograms_(false),
|
| - had_parsing_error_(false) {
|
| - Init();
|
| + loader_(loader) {
|
| + Init(response.url());
|
| }
|
|
|
| void FtpDirectoryListingResponseDelegate::OnReceivedData(const char* data,
|
| int data_len) {
|
| - if (had_parsing_error_)
|
| - return;
|
| -
|
| - if (buffer_.ConsumeData(data, data_len) == net::OK)
|
| - ProcessReceivedEntries();
|
| - else
|
| - had_parsing_error_ = true;
|
| + buffer_.append(data, data_len);
|
| }
|
|
|
| void FtpDirectoryListingResponseDelegate::OnCompletedRequest() {
|
| - if (!had_parsing_error_ && buffer_.ProcessRemainingData() == net::OK)
|
| - ProcessReceivedEntries();
|
| - else
|
| - had_parsing_error_ = true;
|
| -
|
| - if (had_parsing_error_)
|
| + std::vector<FtpDirectoryListingEntry> entries;
|
| + int rv = net::ParseFtpDirectoryListing(buffer_, base::Time::Now(), &entries);
|
| + if (rv != net::OK) {
|
| SendDataToClient("<script>onListingParsingError();</script>\n");
|
| + return;
|
| + }
|
| + for (size_t i = 0; i < entries.size(); i++) {
|
| + FtpDirectoryListingEntry entry = entries[i];
|
| +
|
| + // Skip the current and parent directory entries in the listing. Our header
|
| + // always includes them.
|
| + if (EqualsASCII(entry.name, ".") || EqualsASCII(entry.name, ".."))
|
| + continue;
|
| +
|
| + bool is_directory = (entry.type == FtpDirectoryListingEntry::DIRECTORY);
|
| + int64 size = entry.size;
|
| + if (entry.type != FtpDirectoryListingEntry::FILE)
|
| + size = 0;
|
| + SendDataToClient(net::GetDirectoryListingEntry(
|
| + entry.name, entry.raw_name, is_directory, size, entry.last_modified));
|
| + }
|
| }
|
|
|
| -void FtpDirectoryListingResponseDelegate::Init() {
|
| - GURL response_url(original_response_.url());
|
| +void FtpDirectoryListingResponseDelegate::Init(const GURL& response_url) {
|
| UnescapeRule::Type unescape_rules = UnescapeRule::SPACES |
|
| UnescapeRule::URL_SPECIAL_CHARS;
|
| std::string unescaped_path = UnescapeURLComponent(response_url.path(),
|
| @@ -106,51 +108,6 @@ void FtpDirectoryListingResponseDelegate::Init() {
|
| }
|
| }
|
|
|
| -bool FtpDirectoryListingResponseDelegate::ConvertToServerEncoding(
|
| - const string16& filename, std::string* raw_bytes) const {
|
| - if (buffer_.encoding().empty()) {
|
| - *raw_bytes = std::string();
|
| - return true;
|
| - }
|
| -
|
| - return base::UTF16ToCodepage(filename, buffer_.encoding().c_str(),
|
| - base::OnStringConversionError::FAIL,
|
| - raw_bytes);
|
| -}
|
| -
|
| -void FtpDirectoryListingResponseDelegate::ProcessReceivedEntries() {
|
| - if (!updated_histograms_ && buffer_.EntryAvailable()) {
|
| - // Only log the server type if we got enough data to reliably detect it.
|
| - net::UpdateFtpServerTypeHistograms(buffer_.GetServerType());
|
| - updated_histograms_ = true;
|
| - }
|
| -
|
| - while (buffer_.EntryAvailable()) {
|
| - FtpDirectoryListingEntry entry = buffer_.PopEntry();
|
| -
|
| - // Skip the current and parent directory entries in the listing. Our header
|
| - // always includes them.
|
| - if (EqualsASCII(entry.name, ".") || EqualsASCII(entry.name, ".."))
|
| - continue;
|
| -
|
| - bool is_directory = (entry.type == FtpDirectoryListingEntry::DIRECTORY);
|
| - int64 size = entry.size;
|
| - if (entry.type != FtpDirectoryListingEntry::FILE)
|
| - size = 0;
|
| - std::string raw_bytes;
|
| - if (ConvertToServerEncoding(entry.name, &raw_bytes)) {
|
| - SendDataToClient(net::GetDirectoryListingEntry(
|
| - entry.name, raw_bytes, is_directory, size, entry.last_modified));
|
| - } else {
|
| - // Consider an encoding problem a non-fatal error. The server's support
|
| - // for non-ASCII characters might be buggy. Display an error message,
|
| - // but keep trying to display the rest of the listing (most file names
|
| - // are ASCII anyway, we could be just unlucky with this one).
|
| - had_parsing_error_ = true;
|
| - }
|
| - }
|
| -}
|
| -
|
| void FtpDirectoryListingResponseDelegate::SendDataToClient(
|
| const std::string& data) {
|
| client_->didReceiveData(loader_, data.data(), data.length());
|
|
|