mirror of
https://github.com/mirror/wget.git
synced 2024-12-28 05:40:08 +08:00
Add unit test for parse_content_range() method
* http.c (test_parse_range_header): New function to test the function for parsing the HTTP/1.1 Content-Range header. * test.[ch]: Same * http.c (parse_content_range): Fix parsing code. Fail on scenarios mentioned in rfc 7233.
This commit is contained in:
parent
c809398e8c
commit
b06fca60ac
53
src/http.c
53
src/http.c
@ -909,9 +909,13 @@ parse_content_range (const char *hdr, wgint *first_byte_ptr,
|
|||||||
++hdr;
|
++hdr;
|
||||||
for (num = 0; c_isdigit (*hdr); hdr++)
|
for (num = 0; c_isdigit (*hdr); hdr++)
|
||||||
num = 10 * num + (*hdr - '0');
|
num = 10 * num + (*hdr - '0');
|
||||||
if (*hdr != '/' || !c_isdigit (*(hdr + 1)))
|
if (*hdr != '/')
|
||||||
return false;
|
return false;
|
||||||
*last_byte_ptr = num;
|
*last_byte_ptr = num;
|
||||||
|
if (!(c_isdigit (*(hdr + 1)) || *(hdr + 1) == '*'))
|
||||||
|
return false;
|
||||||
|
if (*last_byte_ptr < *first_byte_ptr)
|
||||||
|
return false;
|
||||||
++hdr;
|
++hdr;
|
||||||
if (*hdr == '*')
|
if (*hdr == '*')
|
||||||
num = -1;
|
num = -1;
|
||||||
@ -919,6 +923,8 @@ parse_content_range (const char *hdr, wgint *first_byte_ptr,
|
|||||||
for (num = 0; c_isdigit (*hdr); hdr++)
|
for (num = 0; c_isdigit (*hdr); hdr++)
|
||||||
num = 10 * num + (*hdr - '0');
|
num = 10 * num + (*hdr - '0');
|
||||||
*entity_length_ptr = num;
|
*entity_length_ptr = num;
|
||||||
|
if ((*entity_length_ptr <= *last_byte_ptr) && *entity_length_ptr != -1)
|
||||||
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4897,6 +4903,51 @@ ensure_extension (struct http_stat *hs, const char *ext, int *dt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TESTING
|
#ifdef TESTING
|
||||||
|
|
||||||
|
const char *
|
||||||
|
test_parse_range_header(void)
|
||||||
|
{
|
||||||
|
static const struct {
|
||||||
|
const char * rangehdr;
|
||||||
|
const wgint firstbyte;
|
||||||
|
const wgint lastbyte;
|
||||||
|
const wgint length;
|
||||||
|
const bool shouldPass;
|
||||||
|
} test_array[] = {
|
||||||
|
{ "bytes 0-1000/1000", 0, 1000, 1000, false },
|
||||||
|
{ "bytes 0-999/1000", 0, 999, 1000, true },
|
||||||
|
{ "bytes 100-99/1000", 100, 99, 1000, false },
|
||||||
|
{ "bytes 100-100/1000", 100, 100, 1000, true },
|
||||||
|
{ "bytes 0-1000/100000000", 0, 1000, 100000000, true },
|
||||||
|
{ "bytes 1-999/1000", 1, 999, 1000, true },
|
||||||
|
{ "bytes 42-1233/1234", 42, 1233, 1234, true },
|
||||||
|
{ "bytes 42-1233/*", 42, 1233, -1, true },
|
||||||
|
{ "bytes 0-2147483648/2147483649", 0, 2147483648, 2147483649, true },
|
||||||
|
{ "bytes 2147483648-4294967296/4294967297", 2147483648, 4294967296, 4294967297, true }
|
||||||
|
};
|
||||||
|
|
||||||
|
wgint firstbyteptr[sizeof(wgint)];
|
||||||
|
wgint lastbyteptr[sizeof(wgint)];
|
||||||
|
wgint lengthptr[sizeof(wgint)];
|
||||||
|
bool result;
|
||||||
|
for (unsigned i = 0; i < countof (test_array); i++)
|
||||||
|
{
|
||||||
|
result = parse_content_range (test_array[i].rangehdr, firstbyteptr, lastbyteptr, lengthptr);
|
||||||
|
#if 0
|
||||||
|
printf ("%ld %ld\n", test_array[i].firstbyte, *firstbyteptr);
|
||||||
|
printf ("%ld %ld\n", test_array[i].lastbyte, *lastbyteptr);
|
||||||
|
printf ("%ld %ld\n", test_array[i].length, *lengthptr);
|
||||||
|
printf ("\n");
|
||||||
|
#endif
|
||||||
|
mu_assert ("test_parse_range_header: False Negative", result == test_array[i].shouldPass);
|
||||||
|
mu_assert ("test_parse_range_header: Bad parse", test_array[i].firstbyte == *firstbyteptr &&
|
||||||
|
test_array[i].lastbyte == *lastbyteptr &&
|
||||||
|
test_array[i].length == *lengthptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
test_parse_content_disposition(void)
|
test_parse_content_disposition(void)
|
||||||
{
|
{
|
||||||
|
@ -54,6 +54,7 @@ all_tests(void)
|
|||||||
mu_run_test (test_has_key);
|
mu_run_test (test_has_key);
|
||||||
#endif
|
#endif
|
||||||
mu_run_test (test_parse_content_disposition);
|
mu_run_test (test_parse_content_disposition);
|
||||||
|
mu_run_test (test_parse_range_header);
|
||||||
mu_run_test (test_subdir_p);
|
mu_run_test (test_subdir_p);
|
||||||
mu_run_test (test_dir_matches_p);
|
mu_run_test (test_dir_matches_p);
|
||||||
mu_run_test (test_commands_sorted);
|
mu_run_test (test_commands_sorted);
|
||||||
|
@ -48,6 +48,7 @@ const char *test_has_key (void);
|
|||||||
const char *test_find_key_value (void);
|
const char *test_find_key_value (void);
|
||||||
const char *test_find_key_values (void);
|
const char *test_find_key_values (void);
|
||||||
const char *test_parse_content_disposition(void);
|
const char *test_parse_content_disposition(void);
|
||||||
|
const char *test_parse_range_header(void);
|
||||||
const char *test_commands_sorted(void);
|
const char *test_commands_sorted(void);
|
||||||
const char *test_cmd_spec_restrict_file_names(void);
|
const char *test_cmd_spec_restrict_file_names(void);
|
||||||
const char *test_is_robots_txt_url(void);
|
const char *test_is_robots_txt_url(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user