diff options
author | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-26 22:42:52 +0000 |
---|---|---|
committer | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-26 22:42:52 +0000 |
commit | 586acc5fe142f498261f52c66862fa417c3d52d2 (patch) | |
tree | c98b3417a883f2477029c8cd5888f4078681e24e /net/http/http_chunked_decoder.h | |
parent | a814a8d55429605fe6d7045045cd25b6bf624580 (diff) | |
download | chromium_src-586acc5fe142f498261f52c66862fa417c3d52d2.zip chromium_src-586acc5fe142f498261f52c66862fa417c3d52d2.tar.gz chromium_src-586acc5fe142f498261f52c66862fa417c3d52d2.tar.bz2 |
Add net to the repository.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@14 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/http/http_chunked_decoder.h')
-rw-r--r-- | net/http/http_chunked_decoder.h | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/net/http/http_chunked_decoder.h b/net/http/http_chunked_decoder.h new file mode 100644 index 0000000..799ebfd --- /dev/null +++ b/net/http/http_chunked_decoder.h @@ -0,0 +1,107 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla. + * + * The Initial Developer of the Original Code is + * Netscape Communications. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Darin Fisher <darin@netscape.com> (original author) + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// Derived from: +// mozilla/netwerk/protocol/http/src/nsHttpChunkedDecoder.h + +#ifndef NET_HTTP_HTTP_CHUNKED_DECODER_H_ +#define NET_HTTP_HTTP_CHUNKED_DECODER_H_ + +#include <string> + +namespace net { + +// From RFC2617 section 3.6.1, the chunked transfer coding is defined as: +// +// Chunked-Body = *chunk +// last-chunk +// trailer +// CRLF +// chunk = chunk-size [ chunk-extension ] CRLF +// chunk-data CRLF +// chunk-size = 1*HEX +// last-chunk = 1*("0") [ chunk-extension ] CRLF +// +// chunk-extension = *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) +// chunk-ext-name = token +// chunk-ext-val = token | quoted-string +// chunk-data = chunk-size(OCTET) +// trailer = *(entity-header CRLF) +// +// The chunk-size field is a string of hex digits indicating the size of the +// chunk. The chunked encoding is ended by any chunk whose size is zero, +// followed by the trailer, which is terminated by an empty line. +// +// NOTE: This implementation does not bother to parse trailers since they are +// not used on the web. +// +class HttpChunkedDecoder { + public: + HttpChunkedDecoder(); + + // Indicates that a previous call to FilterBuf encountered the final CRLF. + bool reached_eof() const { return reached_eof_; } + + // Called to filter out the chunk markers from buf and to check for end-of- + // file. This method modifies |buf| inline if necessary to remove chunk + // markers. The return value indicates the final size of decoded data stored + // in |buf|. Call reached_eof() after this method to check if end-of-file + // was encountered. + int FilterBuf(char* buf, int buf_len); + + private: + // Scan |buf| for the next chunk delimiter. This method returns the number + // of bytes consumed from |buf|. If found, |chunk_remaining_| holds the + // value for the next chunk size. + int ScanForChunkRemaining(char* buf, int buf_len); + + // Indicates the number of bytes remaining for the current chunk. + int chunk_remaining_; + + // A small buffer used to store a partial chunk marker. + std::string line_buf_; + + // Set to true when FilterBuf encounters the last-chunk. + bool reached_last_chunk_; + + // Set to true when FilterBuf encounters the final CRLF. + bool reached_eof_; +}; + +} // namespace net + +#endif // NET_HTTP_HTTP_CHUNKED_DECODER_H_ |