commit 3bf1e3a: [Minor] Fix several issues in the parsing of the timeout in Keep-Alive header
Vsevolod Stakhov
vsevolod at rspamd.com
Sat Jul 9 19:49:04 UTC 2022
Author: Vsevolod Stakhov
Date: 2022-07-09 20:39:33 +0100
URL: https://github.com/rspamd/rspamd/commit/3bf1e3a890638b4b908da3597bae4f434fc79144
[Minor] Fix several issues in the parsing of the timeout in Keep-Alive header
---
src/libserver/http/http_context.c | 63 +++++++++++++++++++++++----------------
1 file changed, 38 insertions(+), 25 deletions(-)
diff --git a/src/libserver/http/http_context.c b/src/libserver/http/http_context.c
index 87ee9268e..81e22bb52 100644
--- a/src/libserver/http/http_context.c
+++ b/src/libserver/http/http_context.c
@@ -572,6 +572,40 @@ rspamd_http_keepalive_handler (gint fd, short what, gpointer ud)
g_free (cbdata);
}
+/* Non-static for unit testing */
+long
+rspamd_http_parse_keepalive_timeout (const rspamd_ftok_t *tok)
+{
+ long timeout = -1;
+ goffset pos = rspamd_substring_search (tok->begin,
+ tok->len, "timeout=", sizeof ("timeout=") - 1);
+
+ if (pos != -1) {
+ pos += sizeof ("timeout=") - 1;
+
+ gchar *end_pos = memchr (tok->begin + pos, ',', tok->len - pos);
+ glong real_timeout;
+
+ if (end_pos) {
+ if (rspamd_strtol (tok->begin + pos + 1,
+ (end_pos - tok->begin) - pos - 1, &real_timeout) &&
+ real_timeout > 0) {
+ timeout = real_timeout;
+ msg_debug_http_context ("got timeout attr %.2f", timeout);
+ }
+ }
+ else {
+ if (rspamd_strtol (tok->begin + pos + 1,
+ tok->len - pos, &real_timeout) && real_timeout > 0) {
+ timeout = real_timeout;
+ msg_debug_http_context ("got timeout attr %.2f", timeout);
+ }
+ }
+ }
+
+ return timeout;
+}
+
void
rspamd_http_context_push_keepalive (struct rspamd_http_context *ctx,
struct rspamd_http_connection *conn,
@@ -609,31 +643,10 @@ rspamd_http_context_push_keepalive (struct rspamd_http_context *ctx,
tok = rspamd_http_message_find_header (msg, "Keep-Alive");
if (tok) {
- goffset pos = rspamd_substring_search_caseless (tok->begin,
- tok->len, "timeout=", sizeof ("timeout=") - 1);
-
- if (pos != -1) {
- pos += sizeof ("timeout=");
-
- gchar *end_pos = memchr (tok->begin + pos, ',', tok->len - pos);
- glong real_timeout;
-
- if (end_pos) {
- if (rspamd_strtol (tok->begin + pos + 1,
- (end_pos - tok->begin) - pos - 1, &real_timeout) &&
- real_timeout > 0) {
- timeout = real_timeout;
- msg_debug_http_context ("got timeout attr %.2f", timeout);
- }
- }
- else {
- if (rspamd_strtol (tok->begin + pos + 1,
- tok->len - pos - 1, &real_timeout) &&
- real_timeout > 0) {
- timeout = real_timeout;
- msg_debug_http_context ("got timeout attr %.2f", timeout);
- }
- }
+ long maybe_timeout = rspamd_http_parse_keepalive_timeout(tok);
+
+ if (maybe_timeout > 0) {
+ timeout = maybe_timeout;
}
}
}
More information about the Commits
mailing list