BinaryTokenizer.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2023 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_PARSER_BINARYTOKENIZER_H
10#define SQUID_SRC_PARSER_BINARYTOKENIZER_H
11
12#include "ip/forward.h"
13#include "parser/forward.h"
14#include "sbuf/SBuf.h"
15
16namespace Parser
17{
18
19class BinaryTokenizer;
20
23{
24public:
26 explicit BinaryTokenizerContext(BinaryTokenizer &tk, const char *aName);
28
30 inline void close();
31
33 inline void success();
34
37 const char *const name;
38 uint64_t start;
39};
40
47{
48public:
50 typedef uint64_t size_type; // enough for the largest supported offset
51
53 explicit BinaryTokenizer(const SBuf &data, const bool expectMore = false);
54
57 void reset(const SBuf &data, const bool expectMore);
58
61 void reinput(const SBuf &data, const bool expectMore) { data_ = data; expectMore_ = expectMore; }
62
64 void commit();
65
67 void rollback();
68
70 bool atEnd() const;
71
73 uint8_t uint8(const char *description);
74
76 uint16_t uint16(const char *description);
77
79 uint32_t uint24(const char *description);
80
82 uint32_t uint32(const char *description);
83
85 SBuf area(uint64_t size, const char *description);
86
88 Ip::Address inet4(const char *description);
89
91 Ip::Address inet6(const char *description);
92
93 /*
94 * Variable-length arrays (a.k.a. Pascal or prefix strings).
95 * pstringN() extracts and returns N-bit length followed by length bytes
96 */
97 SBuf pstring8(const char *description);
98 SBuf pstring16(const char *description);
99 SBuf pstring24(const char *description);
100
102 void skip(uint64_t size, const char *description);
103
105 uint64_t parsed() const { return parsed_; }
106
108 SBuf leftovers() const { return data_.substr(parsed_); }
109
111 void got(uint64_t size, const char *description) const;
112
114
115protected:
116 uint32_t octet();
117 void want(uint64_t size, const char *description) const;
118 void got(uint32_t value, uint64_t size, const char *description) const;
119 void got(const SBuf &value, uint64_t size, const char *description) const;
120 void got(const Ip::Address &value, uint64_t size, const char *description) const;
121 void skipped(uint64_t size, const char *description) const;
122
123private:
124 template <class InAddr>
125 Ip::Address inetAny(const char *description);
126
128 uint64_t parsed_;
129 uint64_t syncPoint_;
131};
132
133/* BinaryTokenizerContext */
134
135inline
137 tokenizer(tk),
138 parent(tk.context),
139 name(aName),
140 start(tk.parsed())
141{
142 tk.context = this;
143}
144
145inline
146void
149}
150
151inline
152void
155 close();
156}
157
158} /* namespace Parser */
159
160#endif // SQUID_SRC_PARSER_BINARYTOKENIZER_H
161
int size
Definition: ModDevPoll.cc:75
enables efficient debugging with concise field names: Hello.version.major
uint64_t start
context parsing begins at this tokenizer position
const char *const name
this context description or nullptr
void close()
ends parsing named object; repeated calls OK
BinaryTokenizerContext(BinaryTokenizer &tk, const char *aName)
starts parsing named object
void success()
reports successful parsing of a named object and calls close()
BinaryTokenizer & tokenizer
tokenizer being used for parsing
const BinaryTokenizerContext *const parent
enclosing context or nullptr
uint64_t parsed_
number of data bytes parsed or skipped
SBuf area(uint64_t size, const char *description)
parse size consecutive bytes as an opaque blob
SBuf leftovers() const
yet unparsed bytes
Ip::Address inet4(const char *description)
interpret the next 4 bytes as a raw in_addr structure
void got(uint64_t size, const char *description) const
debugging helper for parsed multi-field structures
SBuf pstring8(const char *description)
up to 255 byte-long p-string
uint64_t syncPoint_
where to re-start the next parsing attempt
void commit()
make progress: future parsing failures will not rollback beyond this point
bool atEnd() const
no more bytes to parse or skip
void reinput(const SBuf &data, const bool expectMore)
void skip(uint64_t size, const char *description)
ignore the next size bytes
void reset(const SBuf &data, const bool expectMore)
bool expectMore_
whether more data bytes may arrive in the future
uint32_t uint32(const char *description)
parse a four-byte unsigned integer
uint32_t uint24(const char *description)
parse a three-byte unsigned integer (returned as uint32_t)
uint64_t parsed() const
the number of already parsed bytes
void want(uint64_t size, const char *description) const
logs and throws if fewer than size octets remain; no other side effects
uint16_t uint16(const char *description)
parse a two-byte unsigned integer
void rollback()
resume [incremental] parsing from the last commit point
Ip::Address inet6(const char *description)
interpret the next 16 bytes as a raw in6_addr structure
uint8_t uint8(const char *description)
parse a single-byte unsigned integer
void skipped(uint64_t size, const char *description) const
debugging helper for skipped fields
Ip::Address inetAny(const char *description)
const BinaryTokenizerContext * context
debugging: thing being parsed
SBuf pstring16(const char *description)
up to 64 KiB-long p-string
SBuf pstring24(const char *description)
up to 16 MiB-long p-string!
::Parser::InsufficientInput InsufficientInput
thrown by modern "incremental" parsers when they need more data
Definition: forward.h:18
Definition: SBuf.h:94
SBuf substr(size_type pos, size_type n=npos) const
Definition: SBuf.cc:576
Generic protocol-agnostic parsing tools.
Definition: RequestParser.h:15

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors