Browse Source

bugfix redesign mg_get_cookie

Peter Förster 9 năm trước cách đây
mục cha
commit
96fc9c4b12
1 tập tin đã thay đổi với 56 bổ sung44 xóa
  1. 56 44
      src/civetweb.c

+ 56 - 44
src/civetweb.c

@@ -4845,50 +4845,62 @@ mg_get_var2(const char *data,
 }
 
 
-int
-mg_get_cookie(const char *cookie_header,
-              const char *var_name,
-              char *dst,
-              size_t dst_size)
-{
-	const char *s, *p, *end;
-	int name_len, len = -1;
-
-	if (dst == NULL || dst_size == 0) {
-		len = -2;
-	} else if (var_name == NULL || (s = cookie_header) == NULL) {
-		len = -1;
-		dst[0] = '\0';
-	} else {
-		name_len = (int)strlen(var_name);
-		end = s + strlen(s);
-		dst[0] = '\0';
-
-		for (; (s = mg_strcasestr(s, var_name)) != NULL; s += name_len) {
-			if (s[name_len] == '=') {
-				s += name_len + 1;
-				if ((p = strchr(s, ' ')) == NULL) {
-					p = end;
-				}
-				if (p[-1] == ';') {
-					p--;
-				}
-				if (*s == '"' && p[-1] == '"' && p > s + 1) {
-					s++;
-					p--;
-				}
-				if ((size_t)(p - s) < dst_size) {
-					len = (int)(p - s);
-					mg_strlcpy(dst, s, (size_t)len + 1);
-				} else {
-					len = -3;
-				}
-				break;
-			}
-		}
-	}
-	return len;
-}
+/* HCP24: some changes to compare hole var_name */
+int
+mg_get_cookie(const char *cookie_header,
+  const char *var_name,
+  char *dst,
+  size_t dst_size)
+{
+  const char *s, *p, *end;
+  size_t name_len, len;
+
+  if (dst == NULL || dst_size == 0) {
+    return -2;
+  }
+  *dst = '\0';
+  if (var_name == NULL || (s = cookie_header) == NULL) {
+    return -1;
+  }
+
+  name_len = strlen(var_name);
+  end = s + strlen(s);
+  /* ignore starting spaces */
+  while (*s == ' ') s++;
+  /* first search '=' */
+  while ((p = strchr(s, '=')) != NULL) {
+    len = (p - s);
+    if (len == name_len) {
+      if (mg_strncasecmp(s, var_name, name_len) == 0) {
+        /* var_name found */
+        s = p + 1;
+        /* s points to value */
+        /* cookie must be : name1=value1; name2=value2*/
+        /* TODO: very simple scanning if values with '; ' exists it does not work */
+        /*        but in the moment much better then search only ' '*/
+        p = strstr(s, "; ");
+        if (p == NULL) {
+          p = end;
+        }
+        if (*s == '"' && p[-1] == '"' && p > s + 1) {
+          s++;
+          p--;
+        }
+        len = (p - s);
+        if (len < dst_size) {
+          mg_strlcpy(dst, s, len + 1);
+          return (int)len;
+        }
+        return -3;
+      }
+    }
+    /* not found goto next */
+    if ((s = strstr(p, "; ")) == NULL)
+      break; /* no more - finish */
+    s += 2; /* move to name ( after "; ") */
+  }
+  return -1;
+}
 
 
 #if defined(USE_WEBSOCKET) || defined(USE_LUA)