Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package ulfius for openSUSE:Factory checked in at 2021-11-09 23:55:07 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ulfius (Old) and /work/SRC/openSUSE:Factory/.ulfius.new.1890 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ulfius" Tue Nov 9 23:55:07 2021 rev:23 rq:930500 version:2.7.6 Changes: -------- --- /work/SRC/openSUSE:Factory/ulfius/ulfius.changes 2021-11-02 19:19:45.351111174 +0100 +++ /work/SRC/openSUSE:Factory/.ulfius.new.1890/ulfius.changes 2021-11-09 23:55:34.107981915 +0100 @@ -1,0 +2,7 @@ +Fri Nov 5 17:54:03 UTC 2021 - Martin Hauke <[email protected]> + +- Update to version 2.7.6 + * Fix ulfius_websocket_wait_close + * Fix ulfius_send_http_request when url contains spaces + +------------------------------------------------------------------- Old: ---- ulfius-2.7.5.tar.gz New: ---- ulfius-2.7.6.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ulfius.spec ++++++ --- /var/tmp/diff_new_pack.Pcq7HG/_old 2021-11-09 23:55:34.575982154 +0100 +++ /var/tmp/diff_new_pack.Pcq7HG/_new 2021-11-09 23:55:34.575982154 +0100 @@ -20,7 +20,7 @@ %define _lto_cflags %{nil} %define sover 2_7 Name: ulfius -Version: 2.7.5 +Version: 2.7.6 Release: 0 Summary: Web Framework for REST Applications in C License: MIT ++++++ ulfius-2.7.5.tar.gz -> ulfius-2.7.6.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ulfius-2.7.5/CHANGELOG.md new/ulfius-2.7.6/CHANGELOG.md --- old/ulfius-2.7.5/CHANGELOG.md 2021-10-26 23:17:22.000000000 +0200 +++ new/ulfius-2.7.6/CHANGELOG.md 2021-11-05 14:17:31.000000000 +0100 @@ -1,5 +1,10 @@ # Ulfius Changelog +## 2.7.6 + +- Fix `ulfius_websocket_wait_close` +- Fix `ulfius_send_http_request` when url contains spaces + ## 2.7.5 - Fix cookie management in `ulfius_send_http_request` and `ulfius_send_http_streaming_request` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ulfius-2.7.5/CMakeLists.txt new/ulfius-2.7.6/CMakeLists.txt --- old/ulfius-2.7.5/CMakeLists.txt 2021-10-26 23:17:22.000000000 +0200 +++ new/ulfius-2.7.6/CMakeLists.txt 2021-11-05 14:17:31.000000000 +0100 @@ -30,7 +30,7 @@ set(PROJECT_BUGREPORT_PATH "https://github.com/babelouest/ulfius/issues") set(LIBRARY_VERSION_MAJOR "2") set(LIBRARY_VERSION_MINOR "7") -set(LIBRARY_VERSION_PATCH "5") +set(LIBRARY_VERSION_PATCH "6") set(PROJECT_VERSION "${LIBRARY_VERSION_MAJOR}.${LIBRARY_VERSION_MINOR}.${LIBRARY_VERSION_PATCH}") set(PROJECT_VERSION_MAJOR ${LIBRARY_VERSION_MAJOR}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ulfius-2.7.5/src/Makefile new/ulfius-2.7.6/src/Makefile --- old/ulfius-2.7.5/src/Makefile 2021-10-26 23:17:22.000000000 +0200 +++ new/ulfius-2.7.6/src/Makefile 2021-11-05 14:17:31.000000000 +0100 @@ -43,7 +43,7 @@ OUTPUT=libulfius.so VERSION_MAJOR=2 VERSION_MINOR=7 -VERSION_PATCH=5 +VERSION_PATCH=6 ifndef JANSSONFLAG DISABLE_JANSSON=0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ulfius-2.7.5/src/u_send_request.c new/ulfius-2.7.6/src/u_send_request.c --- old/ulfius-2.7.5/src/u_send_request.c 2021-10-26 23:17:22.000000000 +0200 +++ new/ulfius-2.7.6/src/u_send_request.c 2021-11-05 14:17:31.000000000 +0100 @@ -195,7 +195,7 @@ CURLcode res; CURL * curl_handle = NULL; struct curl_slist * header_list = NULL, * cookies_list = NULL; - char * key_esc = NULL, * value_esc = NULL, * cookie = NULL, * cookies = NULL, * header = NULL, * fp = "?", * np = "&"; + char * key_esc = NULL, * value_esc = NULL, * cookie = NULL, * cookies = NULL, * header = NULL, * fp = "?", * np = "&", * url = NULL; const char * value = NULL, ** keys = NULL; int i, has_params = 0, ret, exit_loop; struct _u_request * copy_request = NULL; @@ -300,7 +300,8 @@ } #endif - has_params = (o_strchr(copy_request->http_url, '?') != NULL); + url = str_replace(copy_request->http_url, " ", "%20"); + has_params = (o_strchr(url, '?') != NULL); if (u_map_count(copy_request->map_url) > 0) { // Append url parameters keys = u_map_enum_keys(copy_request->map_url); @@ -315,10 +316,10 @@ value_esc = curl_easy_escape(curl_handle, value, 0); if (value_esc != NULL) { if (!has_params) { - copy_request->http_url = mstrcatf(copy_request->http_url, "%s%s=%s", fp, key_esc, value_esc); + url = mstrcatf(url, "%s%s=%s", fp, key_esc, value_esc); has_params = 1; } else { - copy_request->http_url = mstrcatf(copy_request->http_url, "%s%s=%s", np, key_esc, value_esc); + url = mstrcatf(url, "%s%s=%s", np, key_esc, value_esc); } curl_free(value_esc); } else { @@ -327,10 +328,10 @@ } } else { if (!has_params) { - copy_request->http_url = mstrcatf(copy_request->http_url, "%s%s", fp, key_esc); + url = mstrcatf(url, "%s%s", fp, key_esc); has_params = 1; } else { - copy_request->http_url = mstrcatf(copy_request->http_url, "%s%s", np, key_esc); + url = mstrcatf(url, "%s%s", np, key_esc); } } curl_free(key_esc); @@ -481,7 +482,7 @@ } // Request parameters - if (curl_easy_setopt(curl_handle, CURLOPT_URL, copy_request->http_url) != CURLE_OK || + if (curl_easy_setopt(curl_handle, CURLOPT_URL, url) != CURLE_OK || curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, copy_request->http_verb!=NULL?copy_request->http_verb:"GET") != CURLE_OK || curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, header_list) != CURLE_OK) { y_log_message(Y_LOG_LEVEL_ERROR, "Ulfius - Error setting libcurl options (1)"); @@ -666,6 +667,7 @@ curl_slist_free_all(cookies_list); } } while (0); + o_free(url); } else { y_log_message(Y_LOG_LEVEL_ERROR, "Ulfius - Error curl_easy_init"); ret = U_ERROR_LIBCURL; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ulfius-2.7.5/src/u_websocket.c new/ulfius-2.7.6/src/u_websocket.c --- old/ulfius-2.7.5/src/u_websocket.c 2021-10-26 23:17:22.000000000 +0200 +++ new/ulfius-2.7.6/src/u_websocket.c 2021-11-05 14:17:31.000000000 +0100 @@ -2234,8 +2234,12 @@ if (websocket_manager->connected) { if (timeout) { clock_gettime(CLOCK_REALTIME, &abstime); - abstime.tv_nsec += ((timeout%1000) * 1000000); abstime.tv_sec += (timeout / 1000); + abstime.tv_nsec += ((timeout%1000) * 1000000); + if (abstime.tv_nsec > 999999999) { + abstime.tv_nsec %= 1000000000; + abstime.tv_sec ++; + } pthread_mutex_lock(&websocket_manager->status_lock); ret = pthread_cond_timedwait(&websocket_manager->status_cond, &websocket_manager->status_lock, &abstime); pthread_mutex_unlock(&websocket_manager->status_lock); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ulfius-2.7.5/test/framework.c new/ulfius-2.7.6/test/framework.c --- old/ulfius-2.7.5/test/framework.c 2021-10-26 23:17:22.000000000 +0200 +++ new/ulfius-2.7.6/test/framework.c 2021-11-05 14:17:31.000000000 +0100 @@ -11,6 +11,7 @@ #include <sys/time.h> #include <sys/types.h> #include <netinet/tcp.h> +#include <ifaddrs.h> #ifndef _WIN32 #include <sys/socket.h> @@ -49,6 +50,16 @@ #define SUBJECT "subject" #define BODY "mail body" +#define KEY1 "key1" +#define KEY2 "k??y2" +#define KEY3 "key 3" +#define KEY4 "key%204" + +#define VALUE1 "value1" +#define VALUE2 "value2:'with$%stuff" +#define VALUE3 "value 3" +#define VALUE4 "valu??(4)" + struct smtp_manager { char * mail_data; unsigned int port; @@ -268,37 +279,22 @@ return buffer; } -/** - * decode a u_map into a string - */ -char * print_map(const struct _u_map * map) { - char * line, * to_return = NULL; - const char **keys, * value; - int len, i; - if (map != NULL) { - keys = u_map_enum_keys(map); - for (i=0; keys[i] != NULL; i++) { - value = u_map_get(map, keys[i]); - len = snprintf(NULL, 0, "key is %s, value is %s", keys[i], value); - line = o_malloc((len+1)*sizeof(char)); - snprintf(line, (len+1), "key is %s, value is %s", keys[i], value); - if (to_return != NULL) { - len = o_strlen(to_return) + o_strlen(line) + 1; - to_return = o_realloc(to_return, (len+1)*sizeof(char)); - if (o_strlen(to_return) > 0) { - strcat(to_return, "\n"); - } - } else { - to_return = o_malloc((o_strlen(line) + 1)*sizeof(char)); - to_return[0] = 0; +static int has_ipv6() { + struct ifaddrs * ifaddr, * ifa; + + if (getifaddrs(&ifaddr) == -1) { + return 0; + } + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + if (ifa->ifa_addr != NULL) { + if (ifa->ifa_addr->sa_family == AF_INET6) { + freeifaddrs(ifaddr); + return 1; } - strcat(to_return, line); - o_free(line); } - return to_return; - } else { - return NULL; } + freeifaddrs(ifaddr); + return 0; } int callback_function_empty(const struct _u_request * request, struct _u_response * response, void * user_data) { @@ -522,6 +518,33 @@ return U_CALLBACK_CONTINUE; } +int callback_send_request_no_rest(const struct _u_request * request, struct _u_response * response, void * user_data) { + struct _u_request * request_orig = (struct _u_request *)user_data; + const char ** keys; + size_t i; + + ck_assert_int_eq(u_map_count(request->map_url), u_map_count(request_orig->map_url)); + keys = u_map_enum_keys(request->map_url); + for (i=0; keys[i]!=NULL; i++) { + if (o_strlen(u_map_get(request->map_url, keys[i]))) { + ck_assert_str_eq(u_map_get(request->map_url, keys[i]), u_map_get(request_orig->map_url, keys[i])); + } + } + response->status = 208; + + return U_CALLBACK_CONTINUE; +} + +int callback_send_request_rest(const struct _u_request * request, struct _u_response * response, void * user_data) { + ck_assert_int_eq(u_map_count(request->map_url), 3); + ck_assert_str_eq(VALUE1, u_map_get(request->map_url, KEY1)); + ck_assert_str_eq(VALUE3, u_map_get(request->map_url, KEY2)); + ck_assert_str_eq(VALUE4, u_map_get(request->map_url, KEY3)); + response->status = 208; + + return U_CALLBACK_CONTINUE; +} + int via_free_with_test = 0; void free_with_test(void * ptr) { @@ -749,14 +772,16 @@ ulfius_clean_request(&request); ulfius_clean_response(&response); - ulfius_init_request(&request); - request.http_url = o_strdup("http://[::1]:8080/empty"); - request.network_type = U_USE_IPV6; - ulfius_init_response(&response); - ck_assert_int_eq(ulfius_send_http_request(&request, &response), U_OK); - ck_assert_int_eq(response.status, 200); - ulfius_clean_request(&request); - ulfius_clean_response(&response); + if (has_ipv6()) { + ulfius_init_request(&request); + request.http_url = o_strdup("http://[::1]:8080/empty"); + request.network_type = U_USE_IPV6; + ulfius_init_response(&response); + ck_assert_int_eq(ulfius_send_http_request(&request, &response), U_OK); + ck_assert_int_eq(response.status, 200); + ulfius_clean_request(&request); + ulfius_clean_response(&response); + } ulfius_stop_framework(&u_instance); ulfius_clean_instance(&u_instance); @@ -772,14 +797,16 @@ ck_assert_int_ne(ulfius_send_http_request(&request, NULL), U_OK); ulfius_clean_request(&request); - ulfius_init_request(&request); - request.http_url = o_strdup("http://[::1]:8080/empty"); - request.network_type = U_USE_IPV6; - ulfius_init_response(&response); - ck_assert_int_eq(ulfius_send_http_request(&request, &response), U_OK); - ck_assert_int_eq(response.status, 200); - ulfius_clean_request(&request); - ulfius_clean_response(&response); + if (has_ipv6()) { + ulfius_init_request(&request); + request.http_url = o_strdup("http://[::1]:8080/empty"); + request.network_type = U_USE_IPV6; + ulfius_init_response(&response); + ck_assert_int_eq(ulfius_send_http_request(&request, &response), U_OK); + ck_assert_int_eq(response.status, 200); + ulfius_clean_request(&request); + ulfius_clean_response(&response); + } ulfius_stop_framework(&u_instance); ulfius_clean_instance(&u_instance); @@ -798,11 +825,13 @@ ulfius_clean_request(&request); ulfius_clean_response(&response); - ulfius_init_request(&request); - request.http_url = o_strdup("http://[::1]:8080/empty"); - request.network_type = U_USE_IPV6; - ck_assert_int_ne(ulfius_send_http_request(&request, NULL), U_OK); - ulfius_clean_request(&request); + if (has_ipv6()) { + ulfius_init_request(&request); + request.http_url = o_strdup("http://[::1]:8080/empty"); + request.network_type = U_USE_IPV6; + ck_assert_int_ne(ulfius_send_http_request(&request, NULL), U_OK); + ulfius_clean_request(&request); + } ulfius_stop_framework(&u_instance); ulfius_clean_instance(&u_instance); @@ -825,41 +854,45 @@ ulfius_clean_request(&request); ulfius_clean_response(&response); - ulfius_init_request(&request); - request.http_url = o_strdup("http://[::1]:8080/empty"); - request.network_type = U_USE_IPV6; - ck_assert_int_ne(ulfius_send_http_request(&request, NULL), U_OK); - ulfius_clean_request(&request); + if (has_ipv6()) { + ulfius_init_request(&request); + request.http_url = o_strdup("http://[::1]:8080/empty"); + request.network_type = U_USE_IPV6; + ck_assert_int_ne(ulfius_send_http_request(&request, NULL), U_OK); + ulfius_clean_request(&request); + } ulfius_stop_framework(&u_instance); ulfius_clean_instance(&u_instance); - // Test network binding to an IPV6 address - memset(&ipv6addr, 0, sizeof(ipv6addr)); - ipv6addr.sin6_family = AF_INET6; - ipv6addr.sin6_port = htons(8080); - ipv6addr.sin6_addr = in6addr_loopback; - ck_assert_int_eq(ulfius_init_instance_ipv6(&u_instance, 8080, &ipv6addr, U_USE_IPV6, NULL), U_OK); - ck_assert_int_eq(ulfius_add_endpoint_by_val(&u_instance, "GET", "empty", NULL, 0, &callback_function_empty, NULL), U_OK); - ck_assert_int_eq(ulfius_start_framework(&u_instance), U_OK); - - ulfius_init_request(&request); - request.http_url = o_strdup("http://127.0.0.1:8080/empty"); - request.network_type = U_USE_IPV4; - ck_assert_int_ne(ulfius_send_http_request(&request, NULL), U_OK); - ulfius_clean_request(&request); - - ulfius_init_request(&request); - request.http_url = o_strdup("http://[::1]:8080/empty"); - request.network_type = U_USE_IPV6; - ulfius_init_response(&response); - ck_assert_int_eq(ulfius_send_http_request(&request, &response), U_OK); - ck_assert_int_eq(response.status, 200); - ulfius_clean_request(&request); - ulfius_clean_response(&response); + if (has_ipv6()) { + // Test network binding to an IPV6 address + memset(&ipv6addr, 0, sizeof(ipv6addr)); + ipv6addr.sin6_family = AF_INET6; + ipv6addr.sin6_port = htons(8080); + ipv6addr.sin6_addr = in6addr_loopback; + ck_assert_int_eq(ulfius_init_instance_ipv6(&u_instance, 8080, &ipv6addr, U_USE_IPV6, NULL), U_OK); + ck_assert_int_eq(ulfius_add_endpoint_by_val(&u_instance, "GET", "empty", NULL, 0, &callback_function_empty, NULL), U_OK); + ck_assert_int_eq(ulfius_start_framework(&u_instance), U_OK); + + ulfius_init_request(&request); + request.http_url = o_strdup("http://127.0.0.1:8080/empty"); + request.network_type = U_USE_IPV4; + ck_assert_int_ne(ulfius_send_http_request(&request, NULL), U_OK); + ulfius_clean_request(&request); + + ulfius_init_request(&request); + request.http_url = o_strdup("http://[::1]:8080/empty"); + request.network_type = U_USE_IPV6; + ulfius_init_response(&response); + ck_assert_int_eq(ulfius_send_http_request(&request, &response), U_OK); + ck_assert_int_eq(response.status, 200); + ulfius_clean_request(&request); + ulfius_clean_response(&response); - ulfius_stop_framework(&u_instance); - ulfius_clean_instance(&u_instance); + ulfius_stop_framework(&u_instance); + ulfius_clean_instance(&u_instance); + } } END_TEST #endif @@ -1379,7 +1412,6 @@ } END_TEST - START_TEST(test_ulfius_malformed_requests) { struct _u_instance u_instance; @@ -1442,6 +1474,44 @@ } END_TEST +START_TEST(test_ulfius_send_http_request) +{ + struct _u_instance u_instance; + struct _u_request request; + struct _u_response response; + + ck_assert_int_eq(ulfius_init_request(&request), U_OK); + ck_assert_int_eq(ulfius_init_instance(&u_instance, 8080, NULL, NULL), U_OK); + ck_assert_int_eq(ulfius_add_endpoint_by_val(&u_instance, "GET", "/norest", "*", 0, &callback_send_request_no_rest, &request), U_OK); + ck_assert_int_eq(ulfius_add_endpoint_by_val(&u_instance, "GET", "/rest", "/:"KEY1"/:"KEY2"/:"KEY3"/", 0, &callback_send_request_rest, NULL), U_OK); + ck_assert_int_eq(ulfius_start_framework(&u_instance), U_OK); + + ck_assert_int_eq(ulfius_init_response(&response), U_OK); + ck_assert_int_eq(ulfius_set_request_properties(&request, U_OPT_HTTP_URL, "http://localhost:8080/norest/test_request/give me some space/", + U_OPT_URL_PARAMETER, KEY1, VALUE1, + U_OPT_URL_PARAMETER, KEY2, VALUE2, + U_OPT_URL_PARAMETER, KEY3, VALUE3, + U_OPT_URL_PARAMETER, KEY4, NULL, + U_OPT_NONE), U_OK); + ck_assert_int_eq(ulfius_send_http_request(&request, &response), U_OK); + ck_assert_int_eq(208, response.status); + ulfius_clean_request(&request); + ulfius_clean_response(&response); + + ck_assert_int_eq(ulfius_init_request(&request), U_OK); + ck_assert_int_eq(ulfius_init_response(&response), U_OK); + ck_assert_int_eq(ulfius_set_request_properties(&request, U_OPT_HTTP_URL, "http://localhost:8080/rest/" VALUE1 "/" VALUE3 "/" VALUE4, + U_OPT_NONE), U_OK); + ck_assert_int_eq(ulfius_send_http_request(&request, &response), U_OK); + ck_assert_int_eq(208, response.status); + ulfius_clean_request(&request); + ulfius_clean_response(&response); + + ulfius_stop_framework(&u_instance); + ulfius_clean_instance(&u_instance); +} +END_TEST + #ifndef U_DISABLE_GNUTLS START_TEST(test_ulfius_server_ca_trust) { @@ -1569,6 +1639,7 @@ tcase_add_test(tc_core, test_ulfius_follow_redirect); tcase_add_test(tc_core, test_ulfius_shared_data); tcase_add_test(tc_core, test_ulfius_malformed_requests); + tcase_add_test(tc_core, test_ulfius_send_http_request); #ifndef U_DISABLE_GNUTLS tcase_add_test(tc_core, test_ulfius_server_ca_trust); tcase_add_test(tc_core, test_ulfius_client_certificate);
