diff options
author | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-28 20:30:09 +0000 |
---|---|---|
committer | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-28 20:30:09 +0000 |
commit | c2972193bd0d0c2354d0862444b7ce4662d52d77 (patch) | |
tree | a6cbb8ce07493d2dd6aa9062f44a741e5082739a /net/ftp/ftp_ctrl_response_buffer.h | |
parent | 1b2bb88355feef67a2b67968f0c4a91d16799e38 (diff) | |
download | chromium_src-c2972193bd0d0c2354d0862444b7ce4662d52d77.zip chromium_src-c2972193bd0d0c2354d0862444b7ce4662d52d77.tar.gz chromium_src-c2972193bd0d0c2354d0862444b7ce4662d52d77.tar.bz2 |
Rework FTP control response parsing code and fix socket Write misuse.
It also fixes other minor issues in the code, and makes ftp.vim.org work!
TEST=Visit ftp.vim.org on Linux with Chromium compiled in Debug mode. You should see directory listing after a short while.
BUG=http://crbug.com/15792
Review URL: http://codereview.chromium.org/149368
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@21881 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/ftp/ftp_ctrl_response_buffer.h')
-rw-r--r-- | net/ftp/ftp_ctrl_response_buffer.h | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/net/ftp/ftp_ctrl_response_buffer.h b/net/ftp/ftp_ctrl_response_buffer.h new file mode 100644 index 0000000..33f04b9 --- /dev/null +++ b/net/ftp/ftp_ctrl_response_buffer.h @@ -0,0 +1,101 @@ +// Copyright (c) 2009 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. + +#ifndef NET_FTP_FTP_CTRL_RESPONSE_BUFFER_H_ +#define NET_FTP_FTP_CTRL_RESPONSE_BUFFER_H_ + +#include <queue> +#include <string> +#include <vector> + +#include "base/basictypes.h" + +namespace net { + +struct FtpCtrlResponse { + static const int kInvalidStatusCode; + + FtpCtrlResponse() : status_code(kInvalidStatusCode) { + } + + int status_code; // Three-digit status code. + std::vector<std::string> lines; // Response lines, without CRLFs. +}; + +class FtpCtrlResponseBuffer { + public: + FtpCtrlResponseBuffer() {} + + // Called when data is received from the control socket. Returns error code. + int ConsumeData(const char* data, int data_length); + + bool ResponseAvailable() const { + return !responses_.empty(); + } + + // Returns the next response. It is an error to call this function + // unless ResponseAvailable returns true. + FtpCtrlResponse PopResponse() { + FtpCtrlResponse result = responses_.front(); + responses_.pop(); + return result; + } + + private: + struct ParsedLine { + ParsedLine() + : has_status_code(false), + is_multiline(false), + is_complete(false), + status_code(FtpCtrlResponse::kInvalidStatusCode) { + } + + // Indicates that this line begins with a valid 3-digit status code. + bool has_status_code; + + // Indicates that this line has the dash (-) after the code, which + // means a multiline response. + bool is_multiline; + + // Indicates that this line could be parsed as a complete and valid + // response line, without taking into account preceding lines (which + // may change its meaning into a continuation of the previous line). + bool is_complete; + + // Part of response parsed as status code. + int status_code; + + // Part of response parsed as status text. + std::string status_text; + + // Text before parsing, without ending CRLF. + std::string raw_text; + }; + + static ParsedLine ParseLine(const std::string& line); + + void ExtractFullLinesFromBuffer(); + + // We keep not-yet-parsed data in a string buffer. + std::string buffer_; + + std::queue<ParsedLine> lines_; + + // When parsing a multiline response, we don't know beforehand if a line + // will have a continuation. So always store last line of multiline response + // so we can append the continuation to it. + std::string line_buf_; + + // Keep the response data while we add all lines to it. + FtpCtrlResponse response_buf_; + + // As we read full responses (possibly multiline), we add them to the queue. + std::queue<FtpCtrlResponse> responses_; + + DISALLOW_COPY_AND_ASSIGN(FtpCtrlResponseBuffer); +}; + +} // namespace net + +#endif // NET_FTP_FTP_CTRL_RESPONSE_BUFFER_H_ |