[monitoring-plugins] fixed -ffollow for HTTP/2.0 (Fixes #1685): added ...
Andreas Baumann
git at monitoring-plugins.org
Thu Jan 27 10:10:12 CET 2022
Module: monitoring-plugins
Branch: fix1685
Commit: dd170a4b1b55298da12fdc38c514b13aaf47fcbc
Author: Andreas Baumann <mail at andreasbaumann.cc>
Date: Thu Jan 27 10:00:58 2022 +0100
URL: https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=dd170a4
fixed -ffollow for HTTP/2.0 (Fixes #1685): added major_version parsing to PicoHTTPParser
---
plugins/check_curl.c | 6 +++---
plugins/picohttpparser/picohttpparser.c | 30 ++++++++++++++++++------------
plugins/picohttpparser/picohttpparser.h | 4 ++--
3 files changed, 23 insertions(+), 17 deletions(-)
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
index 14cc846..7df01c5 100644
--- a/plugins/check_curl.c
+++ b/plugins/check_curl.c
@@ -1054,7 +1054,7 @@ redir (curlhelp_write_curlbuf* header_buf)
char *new_url;
int res = phr_parse_response (header_buf->buf, header_buf->buflen,
- &status_line.http_minor, &status_line.http_code, &status_line.msg, &msglen,
+ &status_line.http_major, &status_line.http_minor, &status_line.http_code, &status_line.msg, &msglen,
headers, &nof_headers, 0);
location = get_header_value (headers, nof_headers, "location");
@@ -2188,7 +2188,7 @@ check_document_dates (const curlhelp_write_curlbuf *header_buf, char (*msg)[DEFA
size_t msglen;
int res = phr_parse_response (header_buf->buf, header_buf->buflen,
- &status_line.http_minor, &status_line.http_code, &status_line.msg, &msglen,
+ &status_line.http_major, &status_line.http_minor, &status_line.http_code, &status_line.msg, &msglen,
headers, &nof_headers, 0);
server_date = get_header_value (headers, nof_headers, "date");
@@ -2246,7 +2246,7 @@ get_content_length (const curlhelp_write_curlbuf* header_buf, const curlhelp_wri
curlhelp_statusline status_line;
int res = phr_parse_response (header_buf->buf, header_buf->buflen,
- &status_line.http_minor, &status_line.http_code, &status_line.msg, &msglen,
+ &status_line.http_major, &status_line.http_minor, &status_line.http_code, &status_line.msg, &msglen,
headers, &nof_headers, 0);
content_length_s = get_header_value (headers, nof_headers, "content-length");
diff --git a/plugins/picohttpparser/picohttpparser.c b/plugins/picohttpparser/picohttpparser.c
index 74ccc3e..d9680b7 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
} while (0)
/* returned pointer is always within [buf, buf_end), or null */
-static const char *parse_http_version(const char *buf, const char *buf_end, int *minor_version, int *ret)
+static const char *parse_http_version(const char *buf, const char *buf_end, int *major_version, int *minor_version, int *ret)
{
/* we want at least [HTTP/1.<two chars>] to try to parse */
if (buf_end - buf < 9) {
@@ -254,9 +254,13 @@ static const char *parse_http_version(const char *buf, const char *buf_end, int
EXPECT_CHAR_NO_CHECK('T');
EXPECT_CHAR_NO_CHECK('P');
EXPECT_CHAR_NO_CHECK('/');
- EXPECT_CHAR_NO_CHECK('1');
- EXPECT_CHAR_NO_CHECK('.');
- PARSE_INT(minor_version, 1);
+ PARSE_INT(major_version, 1);
+ if (*major_version == 1) {
+ EXPECT_CHAR_NO_CHECK('.');
+ PARSE_INT(minor_version, 1);
+ } else {
+ *minor_version = 0;
+ }
return buf;
}
@@ -339,7 +343,7 @@ static const char *parse_headers(const char *buf, const char *buf_end, struct ph
}
static const char *parse_request(const char *buf, const char *buf_end, const char **method, size_t *method_len, const char **path,
- size_t *path_len, int *minor_version, struct phr_header *headers, size_t *num_headers,
+ size_t *path_len, int *major_version, int *minor_version, struct phr_header *headers, size_t *num_headers,
size_t max_headers, int *ret)
{
/* 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
*ret = -1;
return NULL;
}
- if ((buf = parse_http_version(buf, buf_end, minor_version, ret)) == NULL) {
+ if ((buf = parse_http_version(buf, buf_end, major_version, minor_version, ret)) == NULL) {
return NULL;
}
if (*buf == '\015') {
@@ -381,7 +385,7 @@ static const char *parse_request(const char *buf, const char *buf_end, const cha
}
int phr_parse_request(const char *buf_start, size_t len, const char **method, size_t *method_len, const char **path,
- size_t *path_len, int *minor_version, struct phr_header *headers, size_t *num_headers, size_t last_len)
+ size_t *path_len, int *major_version, int *minor_version, struct phr_header *headers, size_t *num_headers, size_t last_len)
{
const char *buf = buf_start, *buf_end = buf_start + len;
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
*method_len = 0;
*path = NULL;
*path_len = 0;
+ *major_version = -1;
*minor_version = -1;
*num_headers = 0;
@@ -400,7 +405,7 @@ int phr_parse_request(const char *buf_start, size_t len, const char **method, si
return r;
}
- if ((buf = parse_request(buf, buf_end, method, method_len, path, path_len, minor_version, headers, num_headers, max_headers,
+ if ((buf = parse_request(buf, buf_end, method, method_len, path, path_len, major_version, minor_version, headers, num_headers, max_headers,
&r)) == NULL) {
return r;
}
@@ -408,11 +413,11 @@ int phr_parse_request(const char *buf_start, size_t len, const char **method, si
return (int)(buf - buf_start);
}
-static const char *parse_response(const char *buf, const char *buf_end, int *minor_version, int *status, const char **msg,
+static const char *parse_response(const char *buf, const char *buf_end, int *major_version, int *minor_version, int *status, const char **msg,
size_t *msg_len, struct phr_header *headers, size_t *num_headers, size_t max_headers, int *ret)
{
/* parse "HTTP/1.x" */
- if ((buf = parse_http_version(buf, buf_end, minor_version, ret)) == NULL) {
+ if ((buf = parse_http_version(buf, buf_end, major_version, minor_version, ret)) == NULL) {
return NULL;
}
/* skip space */
@@ -451,13 +456,14 @@ static const char *parse_response(const char *buf, const char *buf_end, int *min
return parse_headers(buf, buf_end, headers, num_headers, max_headers, ret);
}
-int phr_parse_response(const char *buf_start, size_t len, int *minor_version, int *status, const char **msg, size_t *msg_len,
+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,
struct phr_header *headers, size_t *num_headers, size_t last_len)
{
const char *buf = buf_start, *buf_end = buf + len;
size_t max_headers = *num_headers;
int r;
+ *major_version = -1;
*minor_version = -1;
*status = 0;
*msg = NULL;
@@ -470,7 +476,7 @@ int phr_parse_response(const char *buf_start, size_t len, int *minor_version, in
return r;
}
- if ((buf = parse_response(buf, buf_end, minor_version, status, msg, msg_len, headers, num_headers, max_headers, &r)) == NULL) {
+ if ((buf = parse_response(buf, buf_end, major_version, minor_version, status, msg, msg_len, headers, num_headers, max_headers, &r)) == NULL) {
return r;
}
diff --git a/plugins/picohttpparser/picohttpparser.h b/plugins/picohttpparser/picohttpparser.h
index 0849f84..8f13b36 100644
--- a/plugins/picohttpparser/picohttpparser.h
+++ b/plugins/picohttpparser/picohttpparser.h
@@ -49,10 +49,10 @@ struct phr_header {
/* returns number of bytes consumed if successful, -2 if request is partial,
* -1 if failed */
int phr_parse_request(const char *buf, size_t len, const char **method, size_t *method_len, const char **path, size_t *path_len,
- int *minor_version, struct phr_header *headers, size_t *num_headers, size_t last_len);
+ int *major_version, int *minor_version, struct phr_header *headers, size_t *num_headers, size_t last_len);
/* ditto */
-int phr_parse_response(const char *_buf, size_t len, int *minor_version, int *status, const char **msg, size_t *msg_len,
+int phr_parse_response(const char *_buf, size_t len, int *major_version, int *minor_version, int *status, const char **msg, size_t *msg_len,
struct phr_header *headers, size_t *num_headers, size_t last_len);
/* ditto */
More information about the Commits
mailing list