From 2eabd25d0d45546b39699b9e91e5080503ade3a3 Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Wed, 5 Mar 2025 10:25:21 +0200 Subject: [PATCH 1/2] net: http: server: The detail length of wildcard detail was wrong The path length of the detail resource was not set properly. Signed-off-by: Jukka Rissanen (cherry picked from commit 33cf7dc78a976677f8693018eae90c0d0024d07b) --- subsys/net/lib/http/http_server_core.c | 13 ++++++++++++- tests/net/lib/http_server/common/src/main.c | 21 +++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/subsys/net/lib/http/http_server_core.c b/subsys/net/lib/http/http_server_core.c index 9b41d76d98339..dff004f8e0686 100644 --- a/subsys/net/lib/http/http_server_core.c +++ b/subsys/net/lib/http/http_server_core.c @@ -678,6 +678,17 @@ static int compare_strings(const char *s1, const char *s2) return 1; /* Strings are not equal */ } +static int path_len_without_query(const char *path) +{ + int len = 0; + + while ((path[len] != '\0') && (path[len] != '?')) { + len++; + } + + return len; +} + static bool skip_this(struct http_resource_desc *resource, bool is_websocket) { struct http_resource_detail *detail; @@ -713,7 +724,7 @@ struct http_resource_detail *get_resource_detail(const char *path, ret = fnmatch(resource->resource, path, (FNM_PATHNAME | FNM_LEADING_DIR)); if (ret == 0) { - *path_len = strlen(resource->resource); + *path_len = path_len_without_query(path); return resource->detail; } } diff --git a/tests/net/lib/http_server/common/src/main.c b/tests/net/lib/http_server/common/src/main.c index 5c4ab204873a0..a0c46fd08151a 100644 --- a/tests/net/lib/http_server/common/src/main.c +++ b/tests/net/lib/http_server/common/src/main.c @@ -77,6 +77,8 @@ HTTP_RESOURCE_DEFINE(resource_6, service_D, "/fo*", RES(1)); HTTP_RESOURCE_DEFINE(resource_7, service_D, "/f[ob]o3.html", RES(1)); HTTP_RESOURCE_DEFINE(resource_8, service_D, "/fb?3.htm", RES(0)); HTTP_RESOURCE_DEFINE(resource_9, service_D, "/f*4.html", RES(3)); +HTTP_RESOURCE_DEFINE(resource_11, service_D, "/foo/*", RES(3)); +HTTP_RESOURCE_DEFINE(resource_12, service_D, "/foo/b?r", RES(3)); ZTEST(http_service, test_HTTP_SERVICE_DEFINE) { @@ -345,6 +347,25 @@ ZTEST(http_service, test_HTTP_RESOURCE_WILDCARD) zassert_not_null(res, "Cannot find resource"); zassert_true(len > 0, "Length not set"); zassert_equal(res, RES(5), "Resource mismatch"); + + res = CHECK_PATH("/foo/bar", &len); + zassert_not_null(res, "Resource not found"); + zassert_true(len == (sizeof("/foo/bar") - 1), "Length not set correctly"); + zassert_equal(res, RES(3), "Resource mismatch"); + + res = CHECK_PATH("/foo/bar?param=value", &len); + zassert_not_null(res, "Resource not found"); + zassert_true(len == (sizeof("/foo/bar") - 1), "Length not set correctly"); + zassert_equal(res, RES(3), "Resource mismatch"); + + res = CHECK_PATH("/bar?foo=value", &len); + zassert_is_null(res, "Resource found"); + zassert_equal(len, 0, "Length set"); + + res = CHECK_PATH("/foo/bar?param=value", &len); + zassert_not_null(res, "Resource not found"); + zassert_true(len == (sizeof("/foo/bar") - 1), "Length not set correctly"); + zassert_equal(res, RES(3), "Resource mismatch"); } extern void http_server_get_content_type_from_extension(char *url, char *content_type, From e13bc364776121b22e878f2b3a5440a09309db26 Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Wed, 5 Mar 2025 10:44:09 +0200 Subject: [PATCH 2/2] net: http: server: Select POSIX_C_LIB_EXT instead of FNMATCH The CONFIG_POSIX_C_LIB_EXT will get support for fnmatch() function. The old CONFIG_FNMATCH is deprecated. Signed-off-by: Jukka Rissanen (cherry picked from commit 0f90affcdfd376f0360317d34b44ce85f28c4294) --- subsys/net/lib/http/Kconfig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/subsys/net/lib/http/Kconfig b/subsys/net/lib/http/Kconfig index 98d8f72f0ded7..cecc4e6ac9d6d 100644 --- a/subsys/net/lib/http/Kconfig +++ b/subsys/net/lib/http/Kconfig @@ -163,7 +163,8 @@ config HTTP_SERVER_WEBSOCKET config HTTP_SERVER_RESOURCE_WILDCARD bool "Allow wildcard matching of resources" - select FNMATCH + # The POSIX_C_LIB_EXT will get fnmatch() support + select POSIX_C_LIB_EXT help Allow user to specify wildcards when setting up resource strings. This means that instead of specifying multiple resources with exact