[Libosinfo] [libosinfo PATCH 1/2] Switch from libsoup to libcurl

Pino Toscano ptoscano at redhat.com
Mon Aug 7 16:18:34 UTC 2017


libsoup is used to check the validity of URLs in distributions in
osinfo-db; OTOH it supports only HTTP(S), so this limits the checks to
that protocol.

To overcome this limitation, switch to libcurl: while it requires
slightly more code to do the same task, it provides a bit more
flexibility, and support for other protocols.  No version check is
performed, since the APIs used are old enough.

Adapt also the README, and the packaging files.
---
 README                  |  2 +-
 configure.ac            | 12 +++---------
 libosinfo.spec.in       |  2 +-
 mingw-libosinfo.spec.in |  4 ++--
 tests/Makefile.am       |  4 ++--
 tests/test-mediauris.c  | 39 ++++++++++++++++++++++++---------------
 tests/test-treeuris.c   | 39 ++++++++++++++++++++++++---------------
 7 files changed, 57 insertions(+), 45 deletions(-)

diff --git a/README b/README
index b2c54ae..1d1f47a 100644
--- a/README
+++ b/README
@@ -21,7 +21,7 @@ Dependencies
 - Required:
   - gobject-2.0
   - gio-2.0
-  - libsoup-2.4
+  - libcurl
   - libxml-2.0
   - libxslt-1.0
 
diff --git a/configure.ac b/configure.ac
index c10e9e7..7cdf091 100644
--- a/configure.ac
+++ b/configure.ac
@@ -40,10 +40,6 @@ m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
 GLIB_MINIMUM_VERSION="2.36"
 GLIB_ENCODED_VERSION="GLIB_VERSION_2_36"
 
-# Keep these two definitions in agreement.
-SOUP_MINIMUM_VERSION="2.42"
-SOUP_ENCODED_VERSION="SOUP_VERSION_2_42"
-
 PKG_CHECK_MODULES([LIBXML], [libxml-2.0 >= 2.6.0])
 PKG_CHECK_MODULES([LIBXSLT], [libxslt >= 1.0.0])
 
@@ -53,11 +49,9 @@ GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MAX_ALLOWED=$GLIB_ENCODED_VERSION"
 AC_SUBST(GLIB_CFLAGS)
 AC_SUBST(GLIB_LIBS)
 
-PKG_CHECK_MODULES([SOUP], [libsoup-2.4 >= $SOUP_MINIMUM_VERSION])
-SOUP_CFLAGS="$SOUP_CFLAGS -DSOUP_VERSION_MIN_REQUIRED=$SOUP_ENCODED_VERSION"
-SOUP_CFLAGS="$SOUP_CFLAGS -DSOUP_VERSION_MAX_ALLOWED=$SOUP_ENCODED_VERSION"
-AC_SUBST(SOUP_CFLAGS)
-AC_SUBST(SOUP_LIBS)
+PKG_CHECK_MODULES([CURL], [libcurl])
+AC_SUBST(CURL_CFLAGS)
+AC_SUBST(CURL_LIBS)
 
 GTK_DOC_CHECK([1.10],[--flavour no-tmpl])
 
diff --git a/libosinfo.spec.in b/libosinfo.spec.in
index d553341..5a5e6f8 100644
--- a/libosinfo.spec.in
+++ b/libosinfo.spec.in
@@ -16,7 +16,7 @@ BuildRequires: libxml2-devel >= 2.6.0
 BuildRequires: libxslt-devel >= 1.0.0
 BuildRequires: vala
 BuildRequires: vala-tools
-BuildRequires: libsoup-devel
+BuildRequires: libcurl-devel
 BuildRequires: /usr/bin/pod2man
 BuildRequires: hwdata
 BuildRequires: gobject-introspection-devel
diff --git a/mingw-libosinfo.spec.in b/mingw-libosinfo.spec.in
index bd58f25..0653282 100644
--- a/mingw-libosinfo.spec.in
+++ b/mingw-libosinfo.spec.in
@@ -26,8 +26,8 @@ BuildRequires: mingw32-libxml2
 BuildRequires: mingw64-libxml2
 BuildRequires: mingw32-libxslt
 BuildRequires: mingw64-libxslt
-BuildRequires: mingw32-libsoup
-BuildRequires: mingw64-libsoup
+BuildRequires: mingw32-libcurl
+BuildRequires: mingw64-libcurl
 
 BuildRequires: pkgconfig
 
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 9d10ee5..e3df06b 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -25,7 +25,7 @@ COMMON_LDADD = \
 	$(COVERAGE_LDFLAGS) \
 	$(GLIB_LIBS) \
 	$(GOBJECT_LIBS) \
-	$(SOUP_LIBS) \
+	$(CURL_LIBS) \
 	$(CHECK_LIBS) \
 	../osinfo/libosinfo-1.0.la
 COMMON_CFLAGS = \
@@ -33,7 +33,7 @@ COMMON_CFLAGS = \
 	$(COVERAGE_CFLAGS) \
 	$(GLIB_CFLAGS) \
 	$(GOBJECT_CFLAGS) \
-	$(SOUP_CFLAGS) \
+	$(CURL_CFLAGS) \
 	-I$(top_srcdir) \
 	-DSRCDIR="\"$(abs_top_srcdir)\"" \
 	-DBUILDDIR="\"$(abs_top_builddir)\"" \
diff --git a/tests/test-mediauris.c b/tests/test-mediauris.c
index 837197c..366136f 100644
--- a/tests/test-mediauris.c
+++ b/tests/test-mediauris.c
@@ -25,9 +25,9 @@
 #include <stdlib.h>
 #include <osinfo/osinfo.h>
 #include <check.h>
-#include <libsoup/soup.h>
+#include <curl/curl.h>
 
-static void test_media(OsinfoMediaList *medialist, GError **error, SoupSession *session)
+static void test_media(OsinfoMediaList *medialist, GError **error, CURL *curl)
 {
     GList *mediael = NULL, *tmp;
 
@@ -35,8 +35,8 @@ static void test_media(OsinfoMediaList *medialist, GError **error, SoupSession *
     while (tmp) {
         OsinfoMedia *media = tmp->data;
         const gchar *url = osinfo_media_get_url(media);
-        SoupMessage *msg;
-        guint status;
+        CURLcode res;
+        long response_code;
 
         if (url == NULL || g_str_equal(url, "") ||
             (!g_str_has_prefix(url, "http://") && !g_str_has_prefix(url, "https://"))) {
@@ -45,12 +45,14 @@ static void test_media(OsinfoMediaList *medialist, GError **error, SoupSession *
         }
 
         g_print("%s\n", url);
-        msg = soup_message_new("HEAD", url);
-        status = soup_session_send_message(session, msg);
+        curl_easy_setopt(curl, CURLOPT_URL, url);
+        res = curl_easy_perform(curl);
+        if (res != CURLE_OK) {
+            curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
+        }
 
-        fail_unless(SOUP_STATUS_IS_SUCCESSFUL(status), "Failed HEAD (code=%u) on %s", status, url);
+        fail_unless(res == CURLE_OK, "Failed HEAD (res=%d, %s; code=%ld) on %s", res, curl_easy_strerror(res), response_code, url);
 
-        g_object_unref(msg);
         tmp = tmp->next;
     }
 
@@ -59,7 +61,7 @@ static void test_media(OsinfoMediaList *medialist, GError **error, SoupSession *
 
 START_TEST(test_uris)
 {
-    SoupSession *session;
+    CURL *curl;
     OsinfoLoader *loader = osinfo_loader_new();
     OsinfoDb *db = osinfo_loader_get_db(loader);
     GError *error = NULL;
@@ -67,15 +69,17 @@ START_TEST(test_uris)
     GList *osel = NULL, *tmp;
     const gchar *debugstr;
 
-    session = soup_session_new();
+    curl = curl_easy_init();
+    curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
+    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60L);
+    curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
+    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+    curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L);
 
     if ((debugstr = g_getenv("LIBOSINFO_TEST_DEBUG"))) {
-        SoupLogger *logger;
         int debug_level = atoi(debugstr);
 
-        logger = soup_logger_new(debug_level, -1);
-        soup_session_add_feature(session, SOUP_SESSION_FEATURE(logger));
-        g_object_unref(logger);
+        curl_easy_setopt(curl, CURLOPT_VERBOSE, debug_level > 0 ? 1L : 0L);
     }
 
     fail_unless(OSINFO_IS_LOADER(loader), "Loader is not a LOADER");
@@ -90,7 +94,7 @@ START_TEST(test_uris)
         OsinfoOs *os = tmp->data;
         OsinfoMediaList *medialist = osinfo_os_get_media_list(os);
 
-        test_media(medialist, &error, session);
+        test_media(medialist, &error, curl);
 
         fail_unless(error == NULL, error ? error->message : "none");
 
@@ -98,6 +102,8 @@ START_TEST(test_uris)
         tmp = tmp->next;
     }
 
+    curl_easy_cleanup(curl);
+
     g_list_free(osel);
     if (oslist)
         g_object_unref(oslist);
@@ -133,6 +139,7 @@ int main(void)
         return 77; /* Skip */
 
     /* Upfront so we don't confuse valgrind */
+    curl_global_init(CURL_GLOBAL_ALL);
     osinfo_entity_get_type();
     osinfo_db_get_type();
     osinfo_device_get_type();
@@ -148,6 +155,8 @@ int main(void)
     number_failed = srunner_ntests_failed(sr);
     srunner_free(sr);
 
+    curl_global_cleanup();
+
     return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
 }
 /*
diff --git a/tests/test-treeuris.c b/tests/test-treeuris.c
index 60692bc..defe3a7 100644
--- a/tests/test-treeuris.c
+++ b/tests/test-treeuris.c
@@ -25,9 +25,9 @@
 #include <stdlib.h>
 #include <osinfo/osinfo.h>
 #include <check.h>
-#include <libsoup/soup.h>
+#include <curl/curl.h>
 
-static void test_tree(OsinfoTreeList *treelist, GError **error, SoupSession *session)
+static void test_tree(OsinfoTreeList *treelist, GError **error, CURL *curl)
 {
     GList *treeel = NULL, *tmp;
 
@@ -35,8 +35,8 @@ static void test_tree(OsinfoTreeList *treelist, GError **error, SoupSession *ses
     while (tmp) {
         OsinfoTree *tree = tmp->data;
         const gchar *url = osinfo_tree_get_url(tree);
-        SoupMessage *msg;
-        guint status;
+        CURLcode res;
+        long response_code;
 
         if (url == NULL || g_str_equal(url, "")) {
             tmp = tmp->next;
@@ -44,12 +44,14 @@ static void test_tree(OsinfoTreeList *treelist, GError **error, SoupSession *ses
         }
 
         g_print("%s\n", url);
-        msg = soup_message_new("HEAD", url);
-        status = soup_session_send_message(session, msg);
+        curl_easy_setopt(curl, CURLOPT_URL, url);
+        res = curl_easy_perform(curl);
+        if (res != CURLE_OK) {
+            curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
+        }
 
-        fail_unless(SOUP_STATUS_IS_SUCCESSFUL(status), "Failed HEAD on %s", url);
+        fail_unless(res == CURLE_OK, "Failed HEAD (res=%d, %s; code=%ld) on %s", res, curl_easy_strerror(res), response_code, url);
 
-        g_object_unref(msg);
         tmp = tmp->next;
     }
 
@@ -58,7 +60,7 @@ static void test_tree(OsinfoTreeList *treelist, GError **error, SoupSession *ses
 
 START_TEST(test_uris)
 {
-    SoupSession *session;
+    CURL *curl;
     OsinfoLoader *loader = osinfo_loader_new();
     OsinfoDb *db = osinfo_loader_get_db(loader);
     GError *error = NULL;
@@ -66,15 +68,17 @@ START_TEST(test_uris)
     GList *osel = NULL, *tmp;
     const gchar *debugstr;
 
-    session = soup_session_new();
+    curl = curl_easy_init();
+    curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
+    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60L);
+    curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
+    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+    curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L);
 
     if ((debugstr = g_getenv("LIBOSINFO_TEST_DEBUG"))) {
-        SoupLogger *logger;
         int debug_level = atoi(debugstr);
 
-        logger = soup_logger_new(debug_level, -1);
-        soup_session_add_feature(session, SOUP_SESSION_FEATURE(logger));
-        g_object_unref(logger);
+        curl_easy_setopt(curl, CURLOPT_VERBOSE, debug_level > 0 ? 1L : 0L);
     }
 
     fail_unless(OSINFO_IS_LOADER(loader), "Loader is not a LOADER");
@@ -89,7 +93,7 @@ START_TEST(test_uris)
         OsinfoOs *os = tmp->data;
         OsinfoTreeList *treelist = osinfo_os_get_tree_list(os);
 
-        test_tree(treelist, &error, session);
+        test_tree(treelist, &error, curl);
 
         fail_unless(error == NULL, error ? error->message : "none");
 
@@ -97,6 +101,8 @@ START_TEST(test_uris)
         tmp = tmp->next;
     }
 
+    curl_easy_cleanup(curl);
+
     g_list_free(osel);
     if (oslist)
         g_object_unref(oslist);
@@ -132,6 +138,7 @@ int main(void)
         return 77; /* Skip */
 
     /* Upfront so we don't confuse valgrind */
+    curl_global_init(CURL_GLOBAL_ALL);
     osinfo_entity_get_type();
     osinfo_db_get_type();
     osinfo_device_get_type();
@@ -147,6 +154,8 @@ int main(void)
     number_failed = srunner_ntests_failed(sr);
     srunner_free(sr);
 
+    curl_global_cleanup();
+
     return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
 }
 /*
-- 
2.13.4




More information about the Libosinfo mailing list