proxygen
proxygen::StructuredHeadersBuffer Class Reference

#include <StructuredHeadersBuffer.h>

Public Member Functions

 StructuredHeadersBuffer (const std::string &s)
 
StructuredHeaders::DecodeError parseIdentifier (StructuredHeaderItem &result)
 
StructuredHeaders::DecodeError parseIdentifier (std::string &result)
 
StructuredHeaders::DecodeError parseItem (StructuredHeaderItem &result)
 
DecodeError removeSymbol (const std::string &symbol, bool strict)
 
DecodeError removeOptionalWhitespace ()
 
bool isEmpty ()
 
DecodeError handleDecodeError (const DecodeError &err)
 

Private Member Functions

DecodeError parseBinaryContent (StructuredHeaderItem &result)
 
DecodeError parseNumber (StructuredHeaderItem &result)
 
DecodeError parseString (StructuredHeaderItem &result)
 
DecodeError parseInteger (const std::string &input, StructuredHeaderItem &result)
 
DecodeError parseFloat (const std::string &input, StructuredHeaderItem &result)
 
char peek ()
 
void advanceCursor ()
 
int32_t getNumCharsParsed ()
 

Private Attributes

folly::StringPiece content_
 
folly::StringPiece originalContent_
 

Detailed Description

Definition at line 20 of file StructuredHeadersBuffer.h.

Constructor & Destructor Documentation

proxygen::StructuredHeadersBuffer::StructuredHeadersBuffer ( const std::string s)
inlineexplicit

Definition at line 23 of file StructuredHeadersBuffer.h.

References int32_t, folly::gen::isEmpty, and string.

23  :
24  content_(s),
static set< string > s

Member Function Documentation

void proxygen::StructuredHeadersBuffer::advanceCursor ( )
private

Definition at line 281 of file StructuredHeadersBuffer.cpp.

281  {
282  content_.advance(1);
283 }
void advance(size_type n)
Definition: Range.h:672
int32_t proxygen::StructuredHeadersBuffer::getNumCharsParsed ( )
private

Definition at line 289 of file StructuredHeadersBuffer.cpp.

289  {
290  return std::distance(originalContent_.begin(), content_.begin());
291 }
constexpr Iter begin() const
Definition: Range.h:452
DecodeError proxygen::StructuredHeadersBuffer::handleDecodeError ( const DecodeError err)

Definition at line 269 of file StructuredHeadersBuffer.cpp.

References proxygen::StructuredHeaders::decodeErrorDescription, and proxygen::ERROR.

269  {
270  LOG_EVERY_N(ERROR, 1000) << "Error message: " <<
271  decodeErrorDescription.at(err) <<
272  ". Number of characters parsed before error:" <<
273  getNumCharsParsed() << ". Header Content:" << originalContent_.str();
274  return err;
275 }
std::string str() const
Definition: Range.h:591
static const std::map< DecodeError, std::string > decodeErrorDescription
bool proxygen::StructuredHeadersBuffer::isEmpty ( )

Definition at line 285 of file StructuredHeadersBuffer.cpp.

285  {
286  return content_.begin() == content_.end();
287 }
constexpr Iter end() const
Definition: Range.h:455
constexpr Iter begin() const
Definition: Range.h:452
DecodeError proxygen::StructuredHeadersBuffer::parseBinaryContent ( StructuredHeaderItem result)
private

Definition at line 97 of file StructuredHeadersBuffer.cpp.

References proxygen::StructuredHeaders::StructuredHeaderItem::BINARYCONTENT, current, proxygen::StructuredHeaders::decodeBase64(), proxygen::StructuredHeaders::encodeBase64(), proxygen::StructuredHeaders::INVALID_CHARACTER, folly::gen::isEmpty, proxygen::StructuredHeaders::isValidEncodedBinaryContent(), proxygen::StructuredHeaders::isValidEncodedBinaryContentChar(), folly::gen::move, proxygen::StructuredHeaders::OK, string, proxygen::StructuredHeaders::StructuredHeaderItem::tag, proxygen::StructuredHeaders::UNDECODEABLE_BINARY_CONTENT, proxygen::StructuredHeaders::UNEXPECTED_END_OF_BUFFER, and proxygen::StructuredHeaders::StructuredHeaderItem::value.

98  {
99 
100  std::string outputString;
101  if (isEmpty()) {
102  return handleDecodeError(DecodeError::UNEXPECTED_END_OF_BUFFER);
103  }
104 
105  if (peek() != '*') {
106  return handleDecodeError(DecodeError::INVALID_CHARACTER);
107  }
108 
109  advanceCursor();
110 
111  while (!isEmpty()) {
112  char current = peek();
113  advanceCursor();
114  if (current == '*') {
116  outputString)) {
117  return handleDecodeError(DecodeError::UNDECODEABLE_BINARY_CONTENT);
118  }
119 
120  std::string decodedContent = decodeBase64(outputString);
121  if (encodeBase64(decodedContent) != outputString) {
122  return handleDecodeError(DecodeError::UNDECODEABLE_BINARY_CONTENT);
123  }
124 
125  result.value = std::move(decodedContent);
126  result.tag = StructuredHeaderItem::Type::BINARYCONTENT;
127  return DecodeError::OK;
129  current)) {
130  return handleDecodeError(DecodeError::INVALID_CHARACTER);
131  } else {
132  outputString.push_back(current);
133  }
134  }
135 
136  return handleDecodeError(DecodeError::UNEXPECTED_END_OF_BUFFER);
137 }
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::string encodeBase64(const std::string &input)
int current
std::string decodeBase64(const std::string &encoded)
DecodeError handleDecodeError(const DecodeError &err)
const char * string
Definition: Conv.cpp:212
bool isValidEncodedBinaryContent(const std::string &s)
DecodeError proxygen::StructuredHeadersBuffer::parseFloat ( const std::string input,
StructuredHeaderItem result 
)
private

Definition at line 191 of file StructuredHeadersBuffer.cpp.

References proxygen::StructuredHeaders::StructuredHeaderItem::DOUBLE, proxygen::StructuredHeaders::OK, proxygen::StructuredHeaders::StructuredHeaderItem::tag, proxygen::StructuredHeaders::UNPARSEABLE_NUMERIC_TYPE, and proxygen::StructuredHeaders::StructuredHeaderItem::value.

192  {
193 
194  try {
195  result.value = boost::lexical_cast<double>(input);
196  result.tag = StructuredHeaderItem::Type::DOUBLE;
197  } catch (boost::bad_lexical_cast &) {
198  return handleDecodeError(DecodeError::UNPARSEABLE_NUMERIC_TYPE);
199  }
200  return DecodeError::OK;
201 }
DecodeError handleDecodeError(const DecodeError &err)
DecodeError proxygen::StructuredHeadersBuffer::parseIdentifier ( StructuredHeaderItem result)

Definition at line 139 of file StructuredHeadersBuffer.cpp.

References proxygen::StructuredHeaders::StructuredHeaderItem::IDENTIFIER, proxygen::StructuredHeaders::OK, string, proxygen::StructuredHeaders::StructuredHeaderItem::tag, and proxygen::StructuredHeaders::StructuredHeaderItem::value.

Referenced by proxygen::TEST_F().

140  {
141 
142  std::string outputString;
143 
144  auto err = parseIdentifier(outputString);
145  if (err != DecodeError::OK) {
146  return err;
147  }
148 
149  result.value = outputString;
150  result.tag = StructuredHeaderItem::Type::IDENTIFIER;
151 
152  return DecodeError::OK;
153 }
const char * string
Definition: Conv.cpp:212
StructuredHeaders::DecodeError parseIdentifier(StructuredHeaderItem &result)
DecodeError proxygen::StructuredHeadersBuffer::parseIdentifier ( std::string result)

Definition at line 155 of file StructuredHeadersBuffer.cpp.

References current, proxygen::StructuredHeaders::INVALID_CHARACTER, folly::gen::isEmpty, proxygen::StructuredHeaders::isLcAlpha(), proxygen::StructuredHeaders::isValidIdentifierChar(), proxygen::StructuredHeaders::OK, and proxygen::StructuredHeaders::UNEXPECTED_END_OF_BUFFER.

156  {
157 
158  if (isEmpty()) {
159  return handleDecodeError(DecodeError::UNEXPECTED_END_OF_BUFFER);
160  }
161 
162  if (!isLcAlpha(peek())) {
163  return handleDecodeError(DecodeError::INVALID_CHARACTER);
164  }
165 
166  while (!isEmpty()) {
167  char current = peek();
168  if (!isValidIdentifierChar(current)) {
169  break;
170  } else {
171  advanceCursor();
172  result.push_back(current);
173  }
174  }
175 
176  return DecodeError::OK;
177 }
int current
DecodeError handleDecodeError(const DecodeError &err)
DecodeError proxygen::StructuredHeadersBuffer::parseInteger ( const std::string input,
StructuredHeaderItem result 
)
private

Definition at line 179 of file StructuredHeadersBuffer.cpp.

References proxygen::StructuredHeaders::StructuredHeaderItem::INT64, int64_t, proxygen::StructuredHeaders::OK, proxygen::StructuredHeaders::StructuredHeaderItem::tag, proxygen::StructuredHeaders::UNPARSEABLE_NUMERIC_TYPE, and proxygen::StructuredHeaders::StructuredHeaderItem::value.

180  {
181 
182  try {
183  result.value = boost::lexical_cast<int64_t>(input);
184  result.tag = StructuredHeaderItem::Type::INT64;
185  } catch (boost::bad_lexical_cast &) {
186  return handleDecodeError(DecodeError::UNPARSEABLE_NUMERIC_TYPE);
187  }
188  return DecodeError::OK;
189 }
DecodeError handleDecodeError(const DecodeError &err)
DecodeError proxygen::StructuredHeadersBuffer::parseItem ( StructuredHeaderItem result)

Definition at line 19 of file StructuredHeadersBuffer.cpp.

References proxygen::StructuredHeaders::INVALID_CHARACTER, folly::gen::isEmpty, and proxygen::StructuredHeaders::UNEXPECTED_END_OF_BUFFER.

Referenced by proxygen::TEST_F().

19  {
20 
22 
23  if (isEmpty()) {
24  return handleDecodeError(DecodeError::UNEXPECTED_END_OF_BUFFER);
25  } else {
26  char firstCharacter = peek();
27  if (firstCharacter == '"') {
28  return parseString(result);
29  } else if (firstCharacter == '*') {
30  return parseBinaryContent(result);
31  } else if (std::isdigit(firstCharacter) || firstCharacter == '-') {
32  return parseNumber(result);
33  } else {
34  return handleDecodeError(DecodeError::INVALID_CHARACTER);
35  }
36  }
37 }
DecodeError parseBinaryContent(StructuredHeaderItem &result)
DecodeError parseString(StructuredHeaderItem &result)
DecodeError handleDecodeError(const DecodeError &err)
DecodeError parseNumber(StructuredHeaderItem &result)
DecodeError proxygen::StructuredHeadersBuffer::parseNumber ( StructuredHeaderItem result)
private

Definition at line 39 of file StructuredHeadersBuffer.cpp.

References current, proxygen::StructuredHeaders::StructuredHeaderItem::DOUBLE, proxygen::StructuredHeaders::StructuredHeaderItem::INT64, proxygen::StructuredHeaders::INVALID_CHARACTER, folly::gen::isEmpty, proxygen::StructuredHeaders::kMaxValidFloatLength, proxygen::StructuredHeaders::kMaxValidIntegerLength, proxygen::StructuredHeaders::OK, string, type, proxygen::StructuredHeaders::UNEXPECTED_END_OF_BUFFER, and proxygen::StructuredHeaders::VALUE_TOO_LONG.

39  {
40  auto type = StructuredHeaderItem::Type::INT64;
41 
42  bool positive = true;
43  std::string input;
44 
45  if (isEmpty()) {
46  return handleDecodeError(DecodeError::UNEXPECTED_END_OF_BUFFER);
47  }
48 
49  if (peek() == '-') {
50  advanceCursor();
51  positive = false;
52  input.push_back('-');
53  }
54 
55  if (isEmpty()) {
56  return handleDecodeError(DecodeError::UNEXPECTED_END_OF_BUFFER);
57  }
58 
59  if (!std::isdigit(peek())) {
60  return handleDecodeError(DecodeError::INVALID_CHARACTER);
61  }
62 
63  while (!isEmpty()) {
64  char current = peek();
65  if (std::isdigit(current)) {
66  input.push_back(current);
67  advanceCursor();
68  } else if (type == StructuredHeaderItem::Type::INT64 && current == '.') {
69  type = StructuredHeaderItem::Type::DOUBLE;
70  input.push_back(current);
71  advanceCursor();
72  } else {
73  break;
74  }
75 
76  int numDigits = input.length() - (positive ? 0 : 1);
77  if (type == StructuredHeaderItem::Type::INT64 &&
79  return handleDecodeError(DecodeError::VALUE_TOO_LONG);
80  } else if (type == StructuredHeaderItem::Type::DOUBLE &&
82  return handleDecodeError(DecodeError::VALUE_TOO_LONG);
83  }
84  }
85 
86  if (type == StructuredHeaderItem::Type::INT64) {
87  return parseInteger(input, result);
88  } else if (input.back() == '.') {
89  return handleDecodeError(DecodeError::INVALID_CHARACTER);
90  } else {
91  return parseFloat(input, result);
92  }
93 
94  return DecodeError::OK;
95 }
PskType type
DecodeError parseFloat(const std::string &input, StructuredHeaderItem &result)
int current
DecodeError handleDecodeError(const DecodeError &err)
const char * string
Definition: Conv.cpp:212
DecodeError parseInteger(const std::string &input, StructuredHeaderItem &result)
DecodeError proxygen::StructuredHeadersBuffer::parseString ( StructuredHeaderItem result)
private

Definition at line 203 of file StructuredHeadersBuffer.cpp.

References current, proxygen::StructuredHeaders::INVALID_CHARACTER, folly::gen::isEmpty, proxygen::StructuredHeaders::isValidStringChar(), proxygen::StructuredHeaders::OK, proxygen::StructuredHeaders::StructuredHeaderItem::STRING, string, proxygen::StructuredHeaders::StructuredHeaderItem::tag, proxygen::StructuredHeaders::UNEXPECTED_END_OF_BUFFER, and proxygen::StructuredHeaders::StructuredHeaderItem::value.

203  {
204 
205  std::string outputString;
206 
207  if (isEmpty()) {
208  return handleDecodeError(DecodeError::UNEXPECTED_END_OF_BUFFER);
209  }
210 
211  if (peek() != '"') {
212  return handleDecodeError(DecodeError::INVALID_CHARACTER);
213  }
214 
215  advanceCursor();
216 
217  while (!isEmpty()) {
218  char current = peek();
219  if (current == '\\') {
220  advanceCursor();
221  if (isEmpty()) {
222  return handleDecodeError(DecodeError::UNEXPECTED_END_OF_BUFFER);
223  } else {
224  char nextChar = peek();
225  advanceCursor();
226  if (nextChar != '"' && nextChar != '\\') {
227  return handleDecodeError(DecodeError::INVALID_CHARACTER);
228  }
229  outputString.push_back(nextChar);
230  }
231  } else if (current == '"') {
232  advanceCursor();
233  result.value = outputString;
235  return DecodeError::OK;
236  } else if (!isValidStringChar(current)) {
237  return handleDecodeError(DecodeError::INVALID_CHARACTER);
238  } else {
239  advanceCursor();
240  outputString.push_back(current);
241  }
242  }
243 
244  return handleDecodeError(DecodeError::UNEXPECTED_END_OF_BUFFER);
245 }
#define STRING
int current
DecodeError handleDecodeError(const DecodeError &err)
const char * string
Definition: Conv.cpp:212
char proxygen::StructuredHeadersBuffer::peek ( )
private

Definition at line 277 of file StructuredHeadersBuffer.cpp.

277  {
278  return *content_.begin();
279 }
constexpr Iter begin() const
Definition: Range.h:452
DecodeError proxygen::StructuredHeadersBuffer::removeOptionalWhitespace ( )

Definition at line 247 of file StructuredHeadersBuffer.cpp.

References proxygen::StructuredHeaders::OK.

247  {
248  while (peek() == ' ' || peek() == '\t') {
249  advanceCursor();
250  }
251  return DecodeError::OK;
252 }
DecodeError proxygen::StructuredHeadersBuffer::removeSymbol ( const std::string symbol,
bool  strict 
)

Definition at line 254 of file StructuredHeadersBuffer.cpp.

References proxygen::StructuredHeaders::INVALID_CHARACTER, and proxygen::StructuredHeaders::OK.

Referenced by proxygen::TEST_F().

255  {
256 
257  if (content_.startsWith(symbol)) {
258  content_.advance(symbol.length());
259  return DecodeError::OK;
260  } else {
261  if (strict) {
262  // Do some error logging
263  return handleDecodeError(DecodeError::INVALID_CHARACTER);
264  }
265  return DecodeError::INVALID_CHARACTER;
266  }
267 }
void advance(size_type n)
Definition: Range.h:672
DecodeError handleDecodeError(const DecodeError &err)
bool startsWith(const const_range_type &other) const
Definition: Range.h:828

Member Data Documentation

folly::StringPiece proxygen::StructuredHeadersBuffer::content_
private

Definition at line 67 of file StructuredHeadersBuffer.h.

folly::StringPiece proxygen::StructuredHeadersBuffer::originalContent_
private

Definition at line 68 of file StructuredHeadersBuffer.h.


The documentation for this class was generated from the following files: