diff --git a/mongoose.c b/mongoose.c
index 1b54cf8194b17b6a3f2e984e877a1f1490922e99..510fee0e28513e2476f0516ed6a6659599a0f22f 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -1926,19 +1926,30 @@ const char *mg_next_comma_list_entry(const char *, struct mg_str *,
                                      struct mg_str *) WEAK;
 const char *mg_next_comma_list_entry(const char *list, struct mg_str *val,
                                      struct mg_str *eq_val) {
-  if (list == NULL || *list == '\0') {
+  struct mg_str ret = mg_next_comma_list_entry_n(mg_mk_str(list), val, eq_val);
+  return ret.p;
+}
+
+struct mg_str mg_next_comma_list_entry_n(struct mg_str list, struct mg_str *val,
+                                         struct mg_str *eq_val) WEAK;
+struct mg_str mg_next_comma_list_entry_n(struct mg_str list, struct mg_str *val,
+                                         struct mg_str *eq_val) {
+  if (list.len == 0) {
     /* End of the list */
-    list = NULL;
+    list = mg_mk_str(NULL);
   } else {
-    val->p = list;
-    if ((list = strchr(val->p, ',')) != NULL) {
+    const char *chr = NULL;
+    *val = list;
+
+    if ((chr = mg_strchr(*val, ',')) != NULL) {
       /* Comma found. Store length and shift the list ptr */
-      val->len = list - val->p;
-      list++;
+      val->len = chr - val->p;
+      chr++;
+      list.len -= (chr - list.p);
+      list.p = chr;
     } else {
       /* This value is the last one */
-      list = val->p + strlen(val->p);
-      val->len = list - val->p;
+      list = mg_mk_str_n(list.p + list.len, 0);
     }
 
     if (eq_val != NULL) {
diff --git a/mongoose.h b/mongoose.h
index daae6ec04d38f8c72c4c9e12ae927b0114c7b694..5e4313919888396cd1283e80a4cf987f9f419bff 100644
--- a/mongoose.h
+++ b/mongoose.h
@@ -2104,6 +2104,8 @@ int mg_avprintf(char **buf, size_t size, const char *fmt, va_list ap);
  */
 const char *mg_next_comma_list_entry(const char *list, struct mg_str *val,
                                      struct mg_str *eq_val);
+struct mg_str mg_next_comma_list_entry_n(struct mg_str list, struct mg_str *val,
+                                         struct mg_str *eq_val);
 
 /*
  * Matches 0-terminated string (mg_match_prefix) or string with given length