diff --git a/mongoose.c b/mongoose.c
index 1db2ab1065f3e459f9c9fb17a0c8ca116a30a490..534009b745a67d2ed9d62d273dd325140a38bc52 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -7208,7 +7208,7 @@ void mg_printf_html_escape(struct mg_connection *nc, const char *fmt, ...) {
 static void mg_http_parse_header_internal(struct mg_str *hdr,
                                           const char *var_name,
                                           struct altbuf *ab) {
-  int ch = ' ', ch1 = ',', n = strlen(var_name);
+  int ch = ' ', ch1 = ',', ch2 = ';', n = strlen(var_name);
   const char *p, *end = hdr ? hdr->p + hdr->len : NULL, *s = NULL;
 
   /* Find where variable starts */
@@ -7221,10 +7221,10 @@ static void mg_http_parse_header_internal(struct mg_str *hdr,
   if (s != NULL && &s[n + 1] < end) {
     s += n + 1;
     if (*s == '"' || *s == '\'') {
-      ch = ch1 = *s++;
+      ch = ch1 = ch2 = *s++;
     }
     p = s;
-    while (p < end && p[0] != ch && p[0] != ch1) {
+    while (p < end && p[0] != ch && p[0] != ch1 && p[0] != ch2) {
       if (ch != ' ' && p[0] == '\\' && p[1] == ch) p++;
       altbuf_append(ab, *p++);
     }
diff --git a/src/mg_http.c b/src/mg_http.c
index 1fd27d2acd73a7edb389125a75786feef877ce63..57531c96778d66fa71e46f2994d7fafd60a6c386 100644
--- a/src/mg_http.c
+++ b/src/mg_http.c
@@ -1644,7 +1644,7 @@ void mg_printf_html_escape(struct mg_connection *nc, const char *fmt, ...) {
 static void mg_http_parse_header_internal(struct mg_str *hdr,
                                           const char *var_name,
                                           struct altbuf *ab) {
-  int ch = ' ', ch1 = ',', n = strlen(var_name);
+  int ch = ' ', ch1 = ',', ch2 = ';', n = strlen(var_name);
   const char *p, *end = hdr ? hdr->p + hdr->len : NULL, *s = NULL;
 
   /* Find where variable starts */
@@ -1657,10 +1657,10 @@ static void mg_http_parse_header_internal(struct mg_str *hdr,
   if (s != NULL && &s[n + 1] < end) {
     s += n + 1;
     if (*s == '"' || *s == '\'') {
-      ch = ch1 = *s++;
+      ch = ch1 = ch2 = *s++;
     }
     p = s;
-    while (p < end && p[0] != ch && p[0] != ch1) {
+    while (p < end && p[0] != ch && p[0] != ch1 && p[0] != ch2) {
       if (ch != ' ' && p[0] == '\\' && p[1] == ch) p++;
       altbuf_append(ab, *p++);
     }
diff --git a/test/unit_test.c b/test/unit_test.c
index 446217b1ce6a88ca1b618d2c33adb677a771ba9f..f496b27c5517b16eec55798f0a4ace79d338f5b3 100644
--- a/test/unit_test.c
+++ b/test/unit_test.c
@@ -4973,7 +4973,7 @@ static const char *test_buffer_limit(void) {
 
 static const char *test_http_parse_header(void) {
   static struct mg_str h = MG_MK_STR(
-      "xx=1 kl yy, ert=234 kl=123, "
+      "xx=1 kl yy, ert=234 kl=123, qq=ww;"
       "uri=\"/?naii=x,y\";ii=\"12\\\"34\" zz='aa bb',tt=2,gf=\"xx d=1234");
   char buf[20];
   char *buf2;
@@ -5021,6 +5021,9 @@ static const char *test_http_parse_header(void) {
   ASSERT_EQ(mg_http_parse_header(&h, "tt", buf, sizeof(buf)), 1);
   ASSERT_STREQ(buf, "2");
   ASSERT(mg_http_parse_header(&h, "uri", buf, sizeof(buf)) > 0);
+  ASSERT_STREQ(buf, "/?naii=x,y");
+  ASSERT(mg_http_parse_header(&h, "qq", buf, sizeof(buf)) > 0);
+  ASSERT_STREQ(buf, "ww");
 
   return NULL;
 }