]> git.ipfire.org Git - thirdparty/squid.git/blob - src/http/one/Parser.h
SourceFormat Enforcement
[thirdparty/squid.git] / src / http / one / Parser.h
1 /*
2 * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9 #ifndef _SQUID_SRC_HTTP_ONE_PARSER_H
10 #define _SQUID_SRC_HTTP_ONE_PARSER_H
11
12 #include "anyp/ProtocolVersion.h"
13 #include "http/one/forward.h"
14 #include "SBuf.h"
15
16 namespace Http {
17 namespace One {
18
19 // Parser states
20 enum ParseState {
21 HTTP_PARSE_NONE, ///< initialized, but nothing usefully parsed yet
22 HTTP_PARSE_FIRST, ///< HTTP/1 message first-line
23 HTTP_PARSE_MIME, ///< HTTP/1 mime-header block
24 HTTP_PARSE_DONE ///< parsed a message header, or reached a terminal syntax error
25 };
26
27 /** HTTP/1.x protocol parser
28 *
29 * Works on a raw character I/O buffer and tokenizes the content into
30 * the major CRLF delimited segments of an HTTP/1 procotol message:
31 *
32 * \item first-line (request-line / simple-request / status-line)
33 * \item mime-header 0*( header-name ':' SP field-value CRLF)
34 */
35 class Parser : public RefCountable
36 {
37 public:
38 typedef SBuf::size_type size_type;
39
40 Parser() : parsingStage_(HTTP_PARSE_NONE) {}
41 virtual ~Parser() {}
42
43 /// Set this parser back to a default state.
44 /// Will DROP any reference to a buffer (does not free).
45 virtual void clear() = 0;
46
47 /// attempt to parse a message from the buffer
48 /// \retval true if a full message was found and parsed
49 /// \retval false if incomplete, invalid or no message was found
50 virtual bool parse(const SBuf &aBuf) = 0;
51
52 /** Whether the parser is waiting on more data to complete parsing a message.
53 * Use to distinguish between incomplete data and error results
54 * when parse() returns false.
55 */
56 bool needsMoreData() const {return parsingStage_!=HTTP_PARSE_DONE;}
57
58 /// size in bytes of the first line including CRLF terminator
59 virtual size_type firstLineSize() const = 0;
60
61 /// size in bytes of the message headers including CRLF terminator(s)
62 /// but excluding first-line bytes
63 size_type headerBlockSize() const {return mimeHeaderBlock_.length();}
64
65 /// size in bytes of HTTP message block, includes first-line and mime headers
66 /// excludes any body/entity/payload bytes
67 /// excludes any garbage prefix before the first-line
68 size_type messageHeaderSize() const {return firstLineSize() + headerBlockSize();}
69
70 /// buffer containing HTTP mime headers, excluding message first-line.
71 SBuf mimeHeader() const {return mimeHeaderBlock_;}
72
73 /// the protocol label for this message
74 const AnyP::ProtocolVersion & messageProtocol() const {return msgProtocol_;}
75
76 /**
77 * Scan the mime header block (badly) for a header with teh given name.
78 *
79 * BUG: omits lines when searching for headers with obs-fold or multiple entries.
80 *
81 * BUG: limits output to just 1KB when Squid accepts up to 64KB line length.
82 *
83 * \return A pointer to a field-value of the first matching field-name, or NULL.
84 */
85 char *getHeaderField(const char *name);
86
87 /// the remaining unprocessed section of buffer
88 const SBuf &remaining() const {return buf_;}
89
90 protected:
91 /// RFC 7230 section 2.6 - 7 magic octets
92 static const SBuf Http1magic;
93
94 /// bytes remaining to be parsed
95 SBuf buf_;
96
97 /// what stage the parser is currently up to
98 ParseState parsingStage_;
99
100 /// what protocol label has been found in the first line (if any)
101 AnyP::ProtocolVersion msgProtocol_;
102
103 /// buffer holding the mime headers (if any)
104 SBuf mimeHeaderBlock_;
105 };
106
107 } // namespace One
108 } // namespace Http
109
110 #endif /* _SQUID_SRC_HTTP_ONE_PARSER_H */
111