diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-09-23 20:59:34 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-09-23 20:59:34 +0900 |
| commit | dd7014a6121c0985e94451e2492a112402501335 (patch) | |
| tree | f3f1ac5a8fd5a11091c28122003f31f4c172fa19 /src/HttpHeaderProcessor.cc | |
| parent | 0b4dec02505a0be3dabcd01eab98f015f115bed8 (diff) | |
Store only interesting HTTP headers in HttpHeader
In this change, we defined HTTP header fields we are interested in.
We only store those headers in HttpHeader object. Accessing HTTP
headers in HttpHeader object is now done through enum values.
Diffstat (limited to 'src/HttpHeaderProcessor.cc')
| -rw-r--r-- | src/HttpHeaderProcessor.cc | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/src/HttpHeaderProcessor.cc b/src/HttpHeaderProcessor.cc index 6baf7595..6b85524a 100644 --- a/src/HttpHeaderProcessor.cc +++ b/src/HttpHeaderProcessor.cc @@ -78,6 +78,7 @@ HttpHeaderProcessor::HttpHeaderProcessor(ParserMode mode) : mode_(mode), state_(mode == CLIENT_PARSER ? PREV_RES_VERSION : PREV_METHOD), lastBytesProcessed_(0), + lastFieldHdKey_(HttpHeader::MAX_INTERESTING_HEADER), result_(new HttpHeader()) {} @@ -118,6 +119,16 @@ size_t getText(std::string& buf, } } // namespace +namespace { +size_t ignoreText(std::string& buf, + const unsigned char* data, size_t length, size_t off) +{ + size_t j; + for(j = off; j < length && !util::isCRLF(data[j]); ++j); + return j-1; +} +} // namespace + bool HttpHeaderProcessor::parse(const unsigned char* data, size_t length) { size_t i; @@ -276,9 +287,11 @@ bool HttpHeaderProcessor::parse(const unsigned char* data, size_t length) state_ = FIELD_VALUE; } else { if(!lastFieldName_.empty()) { - util::lowercase(lastFieldName_); - result_->put(lastFieldName_, util::strip(buf_)); + if(lastFieldHdKey_ != HttpHeader::MAX_INTERESTING_HEADER) { + result_->put(lastFieldHdKey_, util::strip(buf_)); + } lastFieldName_.clear(); + lastFieldHdKey_ = HttpHeader::MAX_INTERESTING_HEADER; buf_.clear(); } if(c == '\n') { @@ -297,6 +310,8 @@ bool HttpHeaderProcessor::parse(const unsigned char* data, size_t length) if(util::isLws(c) || util::isCRLF(c)) { throw DL_ABORT_EX("Bad HTTP header: missing ':'"); } else if(c == ':') { + util::lowercase(lastFieldName_); + lastFieldHdKey_ = idInterestingHeader(lastFieldName_.c_str()); state_ = PREV_FIELD_VALUE; } else { i = getFieldNameToken(lastFieldName_, data, length, i); @@ -309,7 +324,11 @@ bool HttpHeaderProcessor::parse(const unsigned char* data, size_t length) state_ = PREV_FIELD_NAME; } else if(!util::isLws(c)) { state_ = FIELD_VALUE; - i = getText(buf_, data, length, i); + if(lastFieldHdKey_ == HttpHeader::MAX_INTERESTING_HEADER) { + i = ignoreText(buf_, data, length, i); + } else { + i = getText(buf_, data, length, i); + } } break; case FIELD_VALUE: @@ -318,7 +337,11 @@ bool HttpHeaderProcessor::parse(const unsigned char* data, size_t length) } else if(c == '\n') { state_ = PREV_FIELD_NAME; } else { - i = getText(buf_, data, length, i); + if(lastFieldHdKey_ == HttpHeader::MAX_INTERESTING_HEADER) { + i = ignoreText(buf_, data, length, i); + } else { + i = getText(buf_, data, length, i); + } } break; case PREV_EOH: @@ -363,6 +386,7 @@ void HttpHeaderProcessor::clear() lastBytesProcessed_ = 0; buf_.clear(); lastFieldName_.clear(); + lastFieldHdKey_ = HttpHeader::MAX_INTERESTING_HEADER; result_.reset(new HttpHeader()); headers_.clear(); } |
