From ae3d645863e4fc5c8269cea69b91c0772f74ea42 Mon Sep 17 00:00:00 2001
From: Alex <a1ex@dismail.de>
Date: Wed, 15 Apr 2026 17:25:20 +0000
Subject: [PATCH] Add user-controllable Sec-GPC header

Sec-GPC is an HTTP header which indicates that the user does not want to
be tracked. This can be turned on or off with a dillorc option of
'http_sec_gpc' (default is ON). Also add an option to control the
existing DNT (Do Not Track) header (which remains ON by default):
'http_dnt'.
---
 dillorc            |  6 ++++++
 src/IO/http.c      | 12 ++++++++----
 src/prefs.c        |  2 ++
 src/prefs.h        |  2 ++
 src/prefsparser.cc |  2 ++
 5 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/dillorc b/dillorc
index 15c229bd..c3379e26 100644
--- a/dillorc
+++ b/dillorc
@@ -294,6 +294,12 @@ search_url="mj Mojeek https://www.mojeek.com/search?q=%s"
 # http_user_agent="Wget/1.13.4 (linux-gnu)"
 #The default is "Dillo/"+current_version_number
 
+# Send DNT (Do Not Track) header
+#http_dnt=YES
+
+# Send Sec-GPC (Global Privacy Control) header
+#http_sec_gpc=YES
+
 #-------------------------------------------------------------------------
 #                            COLORS SECTION
 #-------------------------------------------------------------------------
diff --git a/src/IO/http.c b/src/IO/http.c
index 6c11c9f7..09d40620 100644
--- a/src/IO/http.c
+++ b/src/IO/http.c
@@ -416,6 +416,12 @@ static Dstr *Http_make_query_str(DilloWeb *web, bool_t use_proxy, bool_t use_tls
    cookies = a_Cookies_get_query(url, web->requester, web->flags & WEB_RootUrl);
    auth = a_Auth_get_auth_str(url, request_uri->str);
    referer = Http_get_referer(url);
+   char *http_dnt = dStrdup("");
+   if (prefs.http_dnt)
+      http_dnt = dStrdup("DNT: 1\r\n");
+   char *http_sec_gpc = dStrdup("");
+   if (prefs.http_sec_gpc)
+      http_sec_gpc = dStrdup("Sec-GPC: 1\r\n");
    if (URL_FLAGS(url) & URL_Post) {
       Dstr *content_type = Http_make_content_type(url);
       dStr_sprintfa(
@@ -431,7 +437,6 @@ static Dstr *Http_make_query_str(DilloWeb *web, bool_t use_proxy, bool_t use_tls
 #endif
          "\r\n"
          "%s" /* auth */
-         "DNT: 1\r\n"
          "%s" /* proxy auth */
          "%s" /* referer */
          "Connection: %s\r\n"
@@ -442,7 +447,7 @@ static Dstr *Http_make_query_str(DilloWeb *web, bool_t use_proxy, bool_t use_tls
          request_uri->str, URL_AUTHORITY(url), prefs.http_user_agent,
          accept_hdr_value, HTTP_Language_hdr, auth ? auth : "",
          proxy_auth->str, referer, connection_hdr_val, content_type->str,
-         (long)URL_DATA(url)->len, cookies);
+         http_dnt, http_sec_gpc, (long)URL_DATA(url)->len, cookies);
       dStr_append_l(query, URL_DATA(url)->str, URL_DATA(url)->len);
       dStr_free(content_type, TRUE);
    } else {
@@ -459,7 +464,6 @@ static Dstr *Http_make_query_str(DilloWeb *web, bool_t use_proxy, bool_t use_tls
 #endif
          "\r\n"
          "%s" /* auth */
-         "DNT: 1\r\n"
          "%s" /* proxy auth */
          "%s" /* referer */
          "Connection: %s\r\n"
@@ -468,7 +472,7 @@ static Dstr *Http_make_query_str(DilloWeb *web, bool_t use_proxy, bool_t use_tls
          "\r\n",
          request_uri->str, URL_AUTHORITY(url), prefs.http_user_agent,
          accept_hdr_value, HTTP_Language_hdr, auth ? auth : "",
-         proxy_auth->str, referer, connection_hdr_val,
+         proxy_auth->str, referer, connection_hdr_val, http_dnt, http_sec_gpc,
          (URL_FLAGS(url) & URL_E2EQuery) ?
             "Pragma: no-cache\r\nCache-Control: no-cache\r\n" : "",
          cookies);
diff --git a/src/prefs.c b/src/prefs.c
index 4741ef30..20129e97 100644
--- a/src/prefs.c
+++ b/src/prefs.c
@@ -72,6 +72,8 @@ void a_Prefs_init(void)
    prefs.http_strict_transport_security = TRUE;
    prefs.http_force_https = FALSE;
    prefs.http_user_agent = dStrdup(PREFS_HTTP_USER_AGENT);
+   prefs.http_dnt = TRUE;
+   prefs.http_sec_gpc = TRUE;
    prefs.limit_text_width = FALSE;
    prefs.adjust_min_width = TRUE;
    prefs.adjust_table_min_width = TRUE;
diff --git a/src/prefs.h b/src/prefs.h
index 7b7ab869..4cff03f1 100644
--- a/src/prefs.h
+++ b/src/prefs.h
@@ -105,6 +105,8 @@ typedef struct {
    bool_t http_persistent_conns;
    bool_t http_strict_transport_security;
    bool_t http_force_https;
+   bool_t http_dnt;
+   bool_t http_sec_gpc;
    int32_t buffered_drawing;
    char *font_serif;
    char *font_sans_serif;
diff --git a/src/prefsparser.cc b/src/prefsparser.cc
index ddc5f173..b67c9783 100644
--- a/src/prefsparser.cc
+++ b/src/prefsparser.cc
@@ -181,6 +181,8 @@ void PrefsParser::parse(FILE *fp)
         PREFS_BOOL, 0 },
       { "http_force_https", &prefs.http_force_https, PREFS_BOOL, 0 },
       { "http_user_agent", &prefs.http_user_agent, PREFS_STRING, 0 },
+      { "http_dnt", &prefs.http_dnt, PREFS_BOOL, 0 },
+      { "http_sec_gpc", &prefs.http_sec_gpc, PREFS_BOOL, 0 },
       { "limit_text_width", &prefs.limit_text_width, PREFS_BOOL, 0 },
       { "adjust_min_width", &prefs.adjust_min_width, PREFS_BOOL, 0 },
       { "adjust_table_min_width", &prefs.adjust_table_min_width, PREFS_BOOL, 0 },
-- 
2.51.0

