-
/*
- * DEBUG: section 74 HTTP Message
- * AUTHOR: Alex Rousskov
- *
- * SQUID Web Proxy Cache http://www.squid-cache.org/
- * ----------------------------------------------------------
- *
- * Squid is the result of efforts by numerous individuals from
- * the Internet community; see the CONTRIBUTORS file for full
- * details. Many organizations have provided support for Squid's
- * development; see the SPONSORS file for full details. Squid is
- * Copyrighted (C) 2001 by the Regents of the University of
- * California; see the COPYRIGHT file for full details. Squid
- * incorporates software developed and/or copyrighted by other
- * sources; see the CREDITS file for full details.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+ * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
*
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
*/
+/* DEBUG: section 74 HTTP Message */
+
#include "squid.h"
#include "Debug.h"
#include "HttpHeaderTools.h"
#include "profiler/Profiler.h"
#include "SquidConfig.h"
-HttpMsg::HttpMsg(http_hdr_owner_type owner): header(owner),
- cache_control(NULL), hdr_sz(0), content_length(0), protocol(AnyP::PROTO_NONE),
- pstate(psReadyToParseStartLine)
+HttpMsg::HttpMsg(http_hdr_owner_type owner):
+ http_ver(Http::ProtocolVersion()),
+ header(owner),
+ cache_control(NULL),
+ hdr_sz(0),
+ content_length(0),
+ pstate(psReadyToParseStartLine)
{}
HttpMsg::~HttpMsg()
}
/* find end of headers */
-int
+static int
httpMsgIsolateHeaders(const char **parse_start, int l, const char **blk_start, const char **blk_end)
{
/*
* NOT point to a CR or NL character, then return failure
*/
if (**parse_start != '\r' && **parse_start != '\n')
- return 0; /* failure */
+ return 0; /* failure */
/*
* If we didn't find the end of headers, and parse_start does point
return 1;
}
-// negative return is the negated HTTP_ error code
+// negative return is the negated Http::StatusCode error code
// zero return means need more data
// positive return is the size of parsed headers
-bool HttpMsg::parse(MemBuf *buf, bool eof, http_status *error)
+bool
+HttpMsg::parse(MemBuf *buf, bool eof, Http::StatusCode *error)
{
assert(error);
- *error = HTTP_STATUS_NONE;
+ *error = Http::scNone;
// httpMsgParseStep() and debugging require 0-termination, unfortunately
buf->terminate(); // does not affect content size
if (!sanityCheckStartLine(buf, hdr_len, error)) {
// NP: sanityCheck sets *error and sends debug warnings on syntax errors.
// if we have seen the connection close, this is an error too
- if (eof && *error==HTTP_STATUS_NONE)
- *error = HTTP_INVALID_HEADER;
+ if (eof && *error == Http::scNone)
+ *error = Http::scInvalidHeader;
return false;
}
// TODO: move to httpReplyParseStep()
if (hdr_len > Config.maxReplyHeaderSize || (hdr_len <= 0 && (size_t)buf->contentSize() > Config.maxReplyHeaderSize)) {
debugs(58, DBG_IMPORTANT, "HttpMsg::parse: Too large reply header (" << hdr_len << " > " << Config.maxReplyHeaderSize);
- *error = HTTP_HEADER_TOO_LARGE;
+ *error = Http::scHeaderTooLarge;
return false;
}
debugs(58, 3, "HttpMsg::parse: failed to find end of headers (eof: " << eof << ") in '" << buf->content() << "'");
if (eof) // iff we have seen the end, this is an error
- *error = HTTP_INVALID_HEADER;
+ *error = Http::scInvalidHeader;
return false;
}
if (res < 0) { // error
debugs(58, 3, "HttpMsg::parse: cannot parse isolated headers in '" << buf->content() << "'");
- *error = HTTP_INVALID_HEADER;
+ *error = Http::scInvalidHeader;
return false;
}
if (res == 0) {
debugs(58, 2, "HttpMsg::parse: strange, need more data near '" << buf->content() << "'");
- *error = HTTP_INVALID_HEADER;
+ *error = Http::scInvalidHeader;
return false; // but this should not happen due to headersEnd() above
}
if (pstate == psReadyToParseHeaders) {
if (!httpMsgIsolateHeaders(&parse_start, parse_len, &blk_start, &blk_end)) {
if (atEnd) {
- blk_start = parse_start, blk_end = blk_start + strlen(blk_start);
+ blk_start = parse_start;
+ blk_end = blk_start + strlen(blk_start);
} else {
PROF_stop(HttpMsg_httpMsgParseStep);
return 0;
}
}
- if (!header.parse(blk_start, blk_end)) {
+ if (!header.parse(blk_start, blk_end-blk_start)) {
PROF_stop(HttpMsg_httpMsgParseStep);
return httpMsgParseError();
}
bool
HttpMsg::persistent() const
{
- if (http_ver > HttpVersion(1, 0)) {
+ if (http_ver > Http::ProtocolVersion(1,0)) {
/*
* for modern versions of HTTP: persistent unless there is
* a "Connection: close" header.
packerClean(&p);
}
-// use HTTPMSGLOCK() instead of calling this directly
-HttpMsg *
-HttpMsg::_lock()
-{
- lock();
- return this;
-}
-
-// use HTTPMSGUNLOCK() instead of calling this directly
-void
-HttpMsg::_unlock()
-{
- if (unlock() == 0)
- delete this;
-}