]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Fix several issues in the parsing of the timeout in Keep-Alive header
authorVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 9 Jul 2022 19:39:33 +0000 (20:39 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 9 Jul 2022 19:39:33 +0000 (20:39 +0100)
src/libserver/http/http_context.c

index 87ee9268e63b453a56ad9d935cd4e4f5d5a5c76f..81e22bb52329fe6c6d2a36f14b3a7d7561f2bce9 100644 (file)
@@ -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;
                        }
                }
        }