#include "base/TextException.h"
#include "Debug.h"
#include "http/one/TeChunkedParser.h"
+#include "http/one/Tokenizer.h"
#include "http/ProtocolVersion.h"
#include "MemBuf.h"
-#include "parser/Tokenizer.h"
#include "Parsing.h"
Http::One::TeChunkedParser::TeChunkedParser()
if (parsingStage_ == Http1::HTTP_PARSE_NONE)
parsingStage_ = Http1::HTTP_PARSE_CHUNK_SZ;
- ::Parser::Tokenizer tok(buf_);
+ Http1::Tokenizer tok(buf_);
// loop for as many chunks as we can
// use do-while instead of while so that we can incrementally
/// RFC 7230 section 4.1 chunk-size
bool
-Http::One::TeChunkedParser::parseChunkSize(::Parser::Tokenizer &tok)
+Http::One::TeChunkedParser::parseChunkSize(Http1::Tokenizer &tok)
{
Must(theChunkSize <= 0); // Should(), really
* ICAP 'use-original-body=N' extension is supported.
*/
bool
-Http::One::TeChunkedParser::parseChunkExtension(::Parser::Tokenizer &tok, bool skipKnown)
+Http::One::TeChunkedParser::parseChunkExtension(Http1::Tokenizer &tok, bool skipKnown)
{
- // TODO implement a proper quoted-string Tokenizer method
- static const CharacterSet qString = CharacterSet("qString","\"\r\n").add('\0').complement();
-
SBuf ext;
+ SBuf value;
while (tok.skip(';') && tok.prefix(ext, CharacterSet::TCHAR)) {
// whole value part is optional. if no '=' expect next chunk-ext
debugs(94, 5, "skipping unknown chunk extension " << ext);
- // unknown might have a value token ...
- if (tok.skipAll(CharacterSet::TCHAR) && !tok.atEnd()) {
- buf_ = tok.remaining(); // parse checkpoint
- continue;
- }
-
- // ... or a quoted-string
- if (tok.skipOne(CharacterSet::DQUOTE) && tok.skipAll(qString) && tok.skipOne(CharacterSet::DQUOTE)) {
+ // unknown might have a value token or quoted-string
+ if (tok.quotedStringOrToken(value) && !tok.atEnd()) {
buf_ = tok.remaining(); // parse checkpoint
continue;
}
}
bool
-Http::One::TeChunkedParser::parseChunkBody(::Parser::Tokenizer &tok)
+Http::One::TeChunkedParser::parseChunkBody(Http1::Tokenizer &tok)
{
Must(theLeftBodySize > 0); // Should, really
}
bool
-Http::One::TeChunkedParser::parseChunkEnd(::Parser::Tokenizer &tok)
+Http::One::TeChunkedParser::parseChunkEnd(Http1::Tokenizer &tok)
{
Must(theLeftBodySize == 0); // Should(), really
virtual Parser::size_type firstLineSize() const {return 0;} // has no meaning with multiple chunks
private:
- bool parseChunkSize(::Parser::Tokenizer &tok);
- bool parseChunkExtension(::Parser::Tokenizer &tok, bool skipKnown);
- bool parseChunkBody(::Parser::Tokenizer &tok);
- bool parseChunkEnd(::Parser::Tokenizer &tok);
+ bool parseChunkSize(Http1::Tokenizer &tok);
+ bool parseChunkExtension(Http1::Tokenizer &tok, bool skipKnown);
+ bool parseChunkBody(Http1::Tokenizer &tok);
+ bool parseChunkEnd(Http1::Tokenizer &tok);
MemBuf *theOut;
uint64_t theChunkSize;