From e3ce461fec70fd638b415edef4ce3aa9d939d772 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Mon, 9 Sep 2024 10:38:13 +0200
Subject: Collect the quantity of data received or sent with cURL.

---
 src/common/curl.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/core/global.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/core/global.h |  6 ++++++
 3 files changed, 116 insertions(+)

diff --git a/src/common/curl.c b/src/common/curl.c
index 2cf7f3a..e9fb92f 100644
--- a/src/common/curl.c
+++ b/src/common/curl.c
@@ -28,6 +28,12 @@
 #include <string.h>
 
 
+#include "../core/global.h"
+
+
+
+/* Mémorise un volume de données transférées. */
+static int track_curl_data_transfers(CURL *, curl_infotype, char *, size_t, void *);
 
 /* Mémorise les données reçues en réponse à une requête. */
 static size_t receive_data_from_internet(void *, size_t, size_t, sized_binary_t *);
@@ -36,6 +42,48 @@ static size_t receive_data_from_internet(void *, size_t, size_t, sized_binary_t
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : handle = gestionnaire de la requête cURL concernée.          *
+*                type   = type de transfert réalisé.                          *
+*                data   = pointeur vers les données manipulées.               *
+*                size   = quantité de données transférées.                    *
+*                unused = adresse non utilisée ici.                           *
+*                                                                             *
+*  Description : Mémorise un volume de données transférées.                   *
+*                                                                             *
+*  Retour      : CURLE_OK.                                                    *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static int track_curl_data_transfers(CURL *handle, curl_infotype type, char *data, size_t size, void *unused)
+{
+    switch (type)
+    {
+        case CURLINFO_HEADER_IN:
+        case CURLINFO_DATA_IN:
+        /*case CURLINFO_SSL_DATA_IN:*/
+            update_network_stats(size, 0);
+            break;
+
+        case CURLINFO_HEADER_OUT:
+        case CURLINFO_DATA_OUT:
+        /*case CURLINFO_SSL_DATA_OUT:*/
+            update_network_stats(0, size);
+            break;
+
+        default:
+            break;
+
+    }
+
+    return 0;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : contents = contenu nouveau en arrivance d'Internet.          *
 *                size     = taille d'un élément reçu.                         *
 *                nmemb    = quantité de ces éléments.                         *
@@ -100,6 +148,9 @@ bool send_http_get_request(const char *url, char * const headers[], size_t hcoun
     req = curl_easy_init();
     if (req == NULL) goto exit;
 
+    curl_easy_setopt(req, CURLOPT_DEBUGFUNCTION, track_curl_data_transfers);
+    curl_easy_setopt(req, CURLOPT_VERBOSE, 1L);
+
     curl_easy_setopt(req, CURLOPT_URL, url);
 
     /* Entêtes à transmettre */
@@ -179,6 +230,9 @@ bool send_http_post_request(const char *url, char * const headers[], size_t hcou
     req = curl_easy_init();
     if (req == NULL) goto exit;
 
+    curl_easy_setopt(req, CURLOPT_DEBUGFUNCTION, track_curl_data_transfers);
+    curl_easy_setopt(req, CURLOPT_VERBOSE, 1L);
+
     curl_easy_setopt(req, CURLOPT_URL, url);
 
     /* Entêtes à transmettre */
diff --git a/src/core/global.c b/src/core/global.c
index 83d8f4a..d38656b 100644
--- a/src/core/global.c
+++ b/src/core/global.c
@@ -28,10 +28,66 @@
 
 
 
+/* Décompte des émissions et réceptions */
+static GMutex _network_mutex;
+static size_t _bytes_received = 0;
+static size_t _bytes_sent = 0;
+
 /* Gestionnaire de tâches parallèles */
 static GWorkQueue *_queue = NULL;
 
 
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : received = quantité d'octets reçus jusqu'à présent. [OUT]    *
+*                sent     = quantité d'octets émis jusqu'à présent. [OUT]     *
+*                                                                             *
+*  Description : Fournit les volumes d'octets échangés sur le réseau.         *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void get_network_stats(size_t *received, size_t *sent)
+{
+    g_mutex_lock(&_network_mutex);
+
+    *received = _bytes_received;
+    *sent = _bytes_sent;
+
+    g_mutex_unlock(&_network_mutex);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : received = quantité d'octets reçus supplémentaire.           *
+*                sent     = quantité d'octets émis supplémentaire.            *
+*                                                                             *
+*  Description : Augmente les volumes d'octets échangés sur le réseau.        *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void update_network_stats(size_t received, size_t sent)
+{
+    g_mutex_lock(&_network_mutex);
+
+    _bytes_received += received;
+    _bytes_sent += sent;
+
+    g_mutex_unlock(&_network_mutex);
+
+}
+
+
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : queue = nouveau gestionnaire à mémoriser ou NULL.            *
diff --git a/src/core/global.h b/src/core/global.h
index 61b7712..b861ad8 100644
--- a/src/core/global.h
+++ b/src/core/global.h
@@ -29,6 +29,12 @@
 
 
 
+/* Fournit les volumes d'octets échangés sur le réseau. */
+void get_network_stats(size_t *, size_t *);
+
+/* Augmente les volumes d'octets échangés sur le réseau. */
+void update_network_stats(size_t, size_t);
+
 /* Définit le gestionnaire de traitements parallèles courant. */
 void set_work_queue(/* __steal */GWorkQueue *);
 
-- 
cgit v0.11.2-87-g4458