Просмотр исходного кода

Add unit test for new API function (#856)

bel2125 5 лет назад
Родитель
Сommit
201e9e80b2
2 измененных файлов с 79 добавлено и 6 удалено
  1. 20 6
      src/civetweb.c
  2. 59 0
      unittest/public_func.c

+ 20 - 6
src/civetweb.c

@@ -7323,15 +7323,25 @@ mg_split_form_encoded(char *data,
 			break;
 		}
 		form_fields[num].name = data;
-		b = strchr(data, '=');
-		if (b == NULL) {
-			/* key without value */
+		
+		/* find & or = */
+		b = data;
+		while ((*b != 0) && (*b != '&') && (*b != '=')) { 
+			b++;
+		}
+
+		if (*b == 0) {
+			/* last key without value */
+			form_fields[num].value = NULL;
+		} else if (*b == '&') {
+			/* mid key without value */
 			form_fields[num].value = NULL;
 		} else {
 			/* terminate string */
 			*b = 0;
 			/* value starts after '=' */
-			form_fields[num].value = b + 1;
+			data = b + 1;
+			form_fields[num].value = data;
 		}
 
 		/* new field is stored */
@@ -7352,8 +7362,12 @@ mg_split_form_encoded(char *data,
 
 	/* Decode all values */
 	for (i = 0; i < num; i++) {
-		url_decode_in_place((char*)form_fields[num].name);
-		url_decode_in_place((char *)form_fields[num].value);
+		if (form_fields[i].name) {
+			url_decode_in_place((char *)form_fields[i].name);
+		}
+		if (form_fields[i].value) {
+			url_decode_in_place((char *)form_fields[i].value);
+		}
 	}
 
 	/* return number of fields found */

+ 59 - 0
unittest/public_func.c

@@ -528,6 +528,64 @@ START_TEST(test_mg_url_decode)
 END_TEST
 
 
+START_TEST(test_mg_split_form_encoded)
+{
+	char buf[256] = {0};
+	struct mg_header form_fields[MG_MAX_FORM_FIELDS] = {0};
+	int ret;
+
+	ret = mg_split_form_encoded(NULL, form_fields);
+	ck_assert_int_eq(ret, -1);
+
+	strcpy(buf, "");
+	ret = mg_split_form_encoded(buf, form_fields);
+	ck_assert_int_eq(ret, 0);
+
+	strcpy(buf, "test");
+	ret = mg_split_form_encoded(buf, form_fields);
+	ck_assert_int_eq(ret, 1);
+	ck_assert_str_eq(form_fields[0].name, "test");
+	ck_assert_ptr_eq(form_fields[0].value, NULL);
+
+	strcpy(buf, "key=val");
+	ret = mg_split_form_encoded(buf, form_fields);
+	ck_assert_int_eq(ret, 1);
+	ck_assert_str_eq(form_fields[0].name, "key");
+	ck_assert_str_eq(form_fields[0].value, "val");
+
+	strcpy(buf, "key=val&key2=val2");
+	ret = mg_split_form_encoded(buf, form_fields);
+	ck_assert_int_eq(ret, 2);
+	ck_assert_str_eq(form_fields[0].name, "key");
+	ck_assert_str_eq(form_fields[0].value, "val");
+	ck_assert_str_eq(form_fields[1].name, "key2");
+	ck_assert_str_eq(form_fields[1].value, "val2");
+
+	strcpy(buf, "k1=v1&k2=v2&k3=&k4&k5=v5");
+	ret = mg_split_form_encoded(buf, form_fields);
+	ck_assert_int_eq(ret, 5);
+	ck_assert_str_eq(form_fields[0].name, "k1");
+	ck_assert_str_eq(form_fields[1].name, "k2");
+	ck_assert_str_eq(form_fields[2].name, "k3");
+	ck_assert_str_eq(form_fields[3].name, "k4");
+	ck_assert_str_eq(form_fields[4].name, "k5");
+	ck_assert_str_eq(form_fields[0].value, "v1");
+	ck_assert_str_eq(form_fields[1].value, "v2");
+	ck_assert_str_eq(form_fields[2].value, "");
+	ck_assert_ptr_eq(form_fields[3].value, NULL);
+	ck_assert_str_eq(form_fields[4].value, "v5");
+
+	strcpy(buf, "key=v+l1&key2=v%20l2");
+	ret = mg_split_form_encoded(buf, form_fields);
+	ck_assert_int_eq(ret, 2);
+	ck_assert_str_eq(form_fields[0].name, "key");
+	ck_assert_str_eq(form_fields[0].value, "v l1");
+	ck_assert_str_eq(form_fields[1].name, "key2");
+	ck_assert_str_eq(form_fields[1].value, "v l2");
+}
+END_TEST
+
+
 START_TEST(test_mg_get_response_code_text)
 {
 	int i;
@@ -595,6 +653,7 @@ make_public_func_suite(void)
 
 	tcase_add_test(tcase_urlencodingdecoding, test_mg_url_encode);
 	tcase_add_test(tcase_urlencodingdecoding, test_mg_url_decode);
+	tcase_add_test(tcase_urlencodingdecoding, test_mg_split_form_encoded);
 	tcase_set_timeout(tcase_urlencodingdecoding, civetweb_min_test_timeout);
 	suite_add_tcase(suite, tcase_urlencodingdecoding);