diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2022-01-27 10:00:58 +0100 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2022-01-27 10:00:58 +0100 |
commit | dd170a4b1b55298da12fdc38c514b13aaf47fcbc (patch) | |
tree | 70b01dc1f402161d2359b8af0172225865046fe9 /plugins/picohttpparser/picohttpparser.c | |
parent | e2397167c7e5c7a02b68de45de946f63706e7d12 (diff) | |
download | monitoring-plugins-dd170a4b1b55298da12fdc38c514b13aaf47fcbc.tar.gz |
fixed -ffollow for HTTP/2.0 (Fixes #1685): added major_version parsing to PicoHTTPParser
Diffstat (limited to 'plugins/picohttpparser/picohttpparser.c')
-rw-r--r-- | plugins/picohttpparser/picohttpparser.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/plugins/picohttpparser/picohttpparser.c b/plugins/picohttpparser/picohttpparser.c index 74ccc3ef..d9680b79 100644 --- a/plugins/picohttpparser/picohttpparser.c +++ b/plugins/picohttpparser/picohttpparser.c | |||
@@ -242,7 +242,7 @@ static const char *is_complete(const char *buf, const char *buf_end, size_t last | |||
242 | } while (0) | 242 | } while (0) |
243 | 243 | ||
244 | /* returned pointer is always within [buf, buf_end), or null */ | 244 | /* returned pointer is always within [buf, buf_end), or null */ |
245 | static const char *parse_http_version(const char *buf, const char *buf_end, int *minor_version, int *ret) | 245 | static const char *parse_http_version(const char *buf, const char *buf_end, int *major_version, int *minor_version, int *ret) |
246 | { | 246 | { |
247 | /* we want at least [HTTP/1.<two chars>] to try to parse */ | 247 | /* we want at least [HTTP/1.<two chars>] to try to parse */ |
248 | if (buf_end - buf < 9) { | 248 | if (buf_end - buf < 9) { |
@@ -254,9 +254,13 @@ static const char *parse_http_version(const char *buf, const char *buf_end, int | |||
254 | EXPECT_CHAR_NO_CHECK('T'); | 254 | EXPECT_CHAR_NO_CHECK('T'); |
255 | EXPECT_CHAR_NO_CHECK('P'); | 255 | EXPECT_CHAR_NO_CHECK('P'); |
256 | EXPECT_CHAR_NO_CHECK('/'); | 256 | EXPECT_CHAR_NO_CHECK('/'); |
257 | EXPECT_CHAR_NO_CHECK('1'); | 257 | PARSE_INT(major_version, 1); |
258 | EXPECT_CHAR_NO_CHECK('.'); | 258 | if (*major_version == 1) { |
259 | PARSE_INT(minor_version, 1); | 259 | EXPECT_CHAR_NO_CHECK('.'); |
260 | PARSE_INT(minor_version, 1); | ||
261 | } else { | ||
262 | *minor_version = 0; | ||
263 | } | ||
260 | return buf; | 264 | return buf; |
261 | } | 265 | } |
262 | 266 | ||
@@ -339,7 +343,7 @@ static const char *parse_headers(const char *buf, const char *buf_end, struct ph | |||
339 | } | 343 | } |
340 | 344 | ||
341 | static const char *parse_request(const char *buf, const char *buf_end, const char **method, size_t *method_len, const char **path, | 345 | static const char *parse_request(const char *buf, const char *buf_end, const char **method, size_t *method_len, const char **path, |
342 | size_t *path_len, int *minor_version, struct phr_header *headers, size_t *num_headers, | 346 | size_t *path_len, int *major_version, int *minor_version, struct phr_header *headers, size_t *num_headers, |
343 | size_t max_headers, int *ret) | 347 | size_t max_headers, int *ret) |
344 | { | 348 | { |
345 | /* skip first empty line (some clients add CRLF after POST content) */ | 349 | /* skip first empty line (some clients add CRLF after POST content) */ |
@@ -364,7 +368,7 @@ static const char *parse_request(const char *buf, const char *buf_end, const cha | |||
364 | *ret = -1; | 368 | *ret = -1; |
365 | return NULL; | 369 | return NULL; |
366 | } | 370 | } |
367 | if ((buf = parse_http_version(buf, buf_end, minor_version, ret)) == NULL) { | 371 | if ((buf = parse_http_version(buf, buf_end, major_version, minor_version, ret)) == NULL) { |
368 | return NULL; | 372 | return NULL; |
369 | } | 373 | } |
370 | if (*buf == '\015') { | 374 | if (*buf == '\015') { |
@@ -381,7 +385,7 @@ static const char *parse_request(const char *buf, const char *buf_end, const cha | |||
381 | } | 385 | } |
382 | 386 | ||
383 | int phr_parse_request(const char *buf_start, size_t len, const char **method, size_t *method_len, const char **path, | 387 | int phr_parse_request(const char *buf_start, size_t len, const char **method, size_t *method_len, const char **path, |
384 | size_t *path_len, int *minor_version, struct phr_header *headers, size_t *num_headers, size_t last_len) | 388 | size_t *path_len, int *major_version, int *minor_version, struct phr_header *headers, size_t *num_headers, size_t last_len) |
385 | { | 389 | { |
386 | const char *buf = buf_start, *buf_end = buf_start + len; | 390 | const char *buf = buf_start, *buf_end = buf_start + len; |
387 | size_t max_headers = *num_headers; | 391 | size_t max_headers = *num_headers; |
@@ -391,6 +395,7 @@ int phr_parse_request(const char *buf_start, size_t len, const char **method, si | |||
391 | *method_len = 0; | 395 | *method_len = 0; |
392 | *path = NULL; | 396 | *path = NULL; |
393 | *path_len = 0; | 397 | *path_len = 0; |
398 | *major_version = -1; | ||
394 | *minor_version = -1; | 399 | *minor_version = -1; |
395 | *num_headers = 0; | 400 | *num_headers = 0; |
396 | 401 | ||
@@ -400,7 +405,7 @@ int phr_parse_request(const char *buf_start, size_t len, const char **method, si | |||
400 | return r; | 405 | return r; |
401 | } | 406 | } |
402 | 407 | ||
403 | if ((buf = parse_request(buf, buf_end, method, method_len, path, path_len, minor_version, headers, num_headers, max_headers, | 408 | if ((buf = parse_request(buf, buf_end, method, method_len, path, path_len, major_version, minor_version, headers, num_headers, max_headers, |
404 | &r)) == NULL) { | 409 | &r)) == NULL) { |
405 | return r; | 410 | return r; |
406 | } | 411 | } |
@@ -408,11 +413,11 @@ int phr_parse_request(const char *buf_start, size_t len, const char **method, si | |||
408 | return (int)(buf - buf_start); | 413 | return (int)(buf - buf_start); |
409 | } | 414 | } |
410 | 415 | ||
411 | static const char *parse_response(const char *buf, const char *buf_end, int *minor_version, int *status, const char **msg, | 416 | static const char *parse_response(const char *buf, const char *buf_end, int *major_version, int *minor_version, int *status, const char **msg, |
412 | size_t *msg_len, struct phr_header *headers, size_t *num_headers, size_t max_headers, int *ret) | 417 | size_t *msg_len, struct phr_header *headers, size_t *num_headers, size_t max_headers, int *ret) |
413 | { | 418 | { |
414 | /* parse "HTTP/1.x" */ | 419 | /* parse "HTTP/1.x" */ |
415 | if ((buf = parse_http_version(buf, buf_end, minor_version, ret)) == NULL) { | 420 | if ((buf = parse_http_version(buf, buf_end, major_version, minor_version, ret)) == NULL) { |
416 | return NULL; | 421 | return NULL; |
417 | } | 422 | } |
418 | /* skip space */ | 423 | /* skip space */ |
@@ -451,13 +456,14 @@ static const char *parse_response(const char *buf, const char *buf_end, int *min | |||
451 | return parse_headers(buf, buf_end, headers, num_headers, max_headers, ret); | 456 | return parse_headers(buf, buf_end, headers, num_headers, max_headers, ret); |
452 | } | 457 | } |
453 | 458 | ||
454 | int phr_parse_response(const char *buf_start, size_t len, int *minor_version, int *status, const char **msg, size_t *msg_len, | 459 | int phr_parse_response(const char *buf_start, size_t len, int *major_version, int *minor_version, int *status, const char **msg, size_t *msg_len, |
455 | struct phr_header *headers, size_t *num_headers, size_t last_len) | 460 | struct phr_header *headers, size_t *num_headers, size_t last_len) |
456 | { | 461 | { |
457 | const char *buf = buf_start, *buf_end = buf + len; | 462 | const char *buf = buf_start, *buf_end = buf + len; |
458 | size_t max_headers = *num_headers; | 463 | size_t max_headers = *num_headers; |
459 | int r; | 464 | int r; |
460 | 465 | ||
466 | *major_version = -1; | ||
461 | *minor_version = -1; | 467 | *minor_version = -1; |
462 | *status = 0; | 468 | *status = 0; |
463 | *msg = NULL; | 469 | *msg = NULL; |
@@ -470,7 +476,7 @@ int phr_parse_response(const char *buf_start, size_t len, int *minor_version, in | |||
470 | return r; | 476 | return r; |
471 | } | 477 | } |
472 | 478 | ||
473 | if ((buf = parse_response(buf, buf_end, minor_version, status, msg, msg_len, headers, num_headers, max_headers, &r)) == NULL) { | 479 | if ((buf = parse_response(buf, buf_end, major_version, minor_version, status, msg, msg_len, headers, num_headers, max_headers, &r)) == NULL) { |
474 | return r; | 480 | return r; |
475 | } | 481 | } |
476 | 482 | ||