diff --git a/examples/unit_test.c b/examples/unit_test.c index 64e350cc649d4ef96959a0deafca9ca828bff953..d0bcdda384b3ab3a4a2ebc3e7eddd870c53fec06 100644 --- a/examples/unit_test.c +++ b/examples/unit_test.c @@ -502,6 +502,21 @@ static const char *test_rewrites(void) { return NULL; } +static const char *test_mg_parse_url(void) { + unsigned short port; + char a[100], b[100]; + ASSERT(parse_url("", a, sizeof(a), b, sizeof(b), &port) == 0); + ASSERT(parse_url("ws://foo ", a, sizeof(a), b, sizeof(b), &port) == 8); + ASSERT(strcmp(a, "ws") == 0 && strcmp(b, "foo") == 0 && port == 80); + ASSERT(parse_url("xx://y:123 ", a, sizeof(a), b, sizeof(b), &port) == 10); + ASSERT(strcmp(a, "xx") == 0 && strcmp(b, "y") == 0 && port == 123); + ASSERT(parse_url(" foo ", a, sizeof(a), b, sizeof(b), &port) == 0); + ASSERT(parse_url(" foo:44 ", a, sizeof(a), b, sizeof(b), &port) == 0); + ASSERT(parse_url("foo:44 ", a, sizeof(a), b, sizeof(b), &port) == 6); + ASSERT(strcmp(a, "") == 0 && strcmp(b, "foo") == 0 && port == 44); + return NULL; +} + static const char *run_all_tests(void) { RUN_TEST(test_should_keep_alive); RUN_TEST(test_match_prefix); @@ -518,6 +533,7 @@ static const char *run_all_tests(void) { RUN_TEST(test_mg_set_option); RUN_TEST(test_server); RUN_TEST(test_rewrites); + RUN_TEST(test_mg_parse_url); return NULL; } diff --git a/mongoose.c b/mongoose.c index ad058a7f4cc206c0a43e06a647625155c9af691d..ac4ce2d68fca5181d07d717e0c104ca8ddacf020 100644 --- a/mongoose.c +++ b/mongoose.c @@ -3992,11 +3992,12 @@ static int parse_url(const char *url, char *proto, size_t plen, snprintf(fmt3, sizeof(fmt3), "%%%zu[^: ]:%%hu%%n", hlen); if (sscanf(url, fmt1, proto, host, port, &n) == 3 || - sscanf(url, fmt2, proto, host, &n) == 2 || - sscanf(url, fmt3, host, port, &n) == 2) { + sscanf(url, fmt2, proto, host, &n) == 2) { + return n; + } else if (sscanf(url, fmt3, host, port, &n) == 2) { + proto[0] = '\0'; return n; } - return 0; }