Signed-off-by: Denys Vlasenko <dvlas...@redhat.com>
---
 src/plugins/abrt-dedup-client.c   |  24 ++++---
 src/plugins/abrt-retrace-client.c | 134 ++++++++++++--------------------------
 src/plugins/https-utils.c         |  17 ++++-
 src/plugins/https-utils.h         |   4 +-
 4 files changed, 72 insertions(+), 107 deletions(-)

diff --git a/src/plugins/abrt-dedup-client.c b/src/plugins/abrt-dedup-client.c
index 835d551..830efda 100644
--- a/src/plugins/abrt-dedup-client.c
+++ b/src/plugins/abrt-dedup-client.c
@@ -171,19 +171,17 @@ int main(int argc, char **argv)
                        "Host: %s\r\n"
                        "Content-Type: application/x-www-form-urlencoded\r\n"
                        "Content-Length: %d\r\n"
-                       "Connection: close\r\n",
-                       cfg.url, request_body->len);
-
-    if (lang.encoding)
-        strbuf_append_strf(request, "Accept-Charset: %s\r\n", lang.encoding);
-
-    if (lang.locale)
-    {
-        strbuf_append_strf(request, "Accept-Language: %s\r\n", lang.locale);
-        free(lang.locale);
-    }
-
-    strbuf_append_strf(request, "\r\n%s", request_body->buf);
+                       "Connection: close\r\n"
+                       "%s"
+                       "%s"
+                       "\r\n",
+                       cfg.url,
+                       request_body->len,
+                       lang.accept_charset,
+                       lang.accept_language
+    );
+
+    strbuf_append_str(request, request_body->buf);
     strbuf_free(request_body);
 
     /* Initialize NSS */
diff --git a/src/plugins/abrt-retrace-client.c 
b/src/plugins/abrt-retrace-client.c
index 940939b..cc0b802 100644
--- a/src/plugins/abrt-retrace-client.c
+++ b/src/plugins/abrt-retrace-client.c
@@ -29,6 +29,8 @@ enum
     TASK_VMCORE,
 };
 
+static struct language lang;
+
 struct retrace_settings
 {
     int running_tasks;
@@ -369,8 +371,6 @@ static int check_package(const char *nvr, const char *arch, 
map_string_t *osinfo
 {
     char *releaseid = get_release_id(osinfo, arch);
 
-    struct language lang;
-    get_language(&lang);
     PRFileDesc *tcp_sock, *ssl_sock;
     ssl_connect(&cfg, &tcp_sock, &ssl_sock);
     struct strbuf *http_request = strbuf_new();
@@ -382,21 +382,14 @@ static int check_package(const char *nvr, const char 
*arch, map_string_t *osinfo
                        "X-Package-NVR: %s\r\n"
                        "X-Package-Arch: %s\r\n"
                        "X-OS-Release: %s\r\n",
-                       cfg.url, nvr, arch, releaseid);
-
-    if (lang.encoding)
-        strbuf_append_strf(http_request,
-                           "Accept-Charset: %s\r\n",
-                           lang.encoding);
-    if (lang.locale)
-    {
-        strbuf_append_strf(http_request,
-                           "Accept-Language: %s\r\n",
-                           lang.locale);
-        free(lang.locale);
-    }
+                       "%s"
+                       "%s"
+                       "\r\n",
+                       cfg.url, nvr, arch, releaseid,
+                       lang.accept_charset,
+                       lang.accept_language
+    );
 
-    strbuf_append_str(http_request, "\r\n");
     PRInt32 written = PR_Send(tcp_sock, http_request->buf, http_request->len,
                               /*flags:*/0, PR_INTERVAL_NO_TIMEOUT);
     if (written == -1)
@@ -446,9 +439,6 @@ static int create(bool delete_temp_archive,
                   char **task_id,
                   char **task_password)
 {
-    struct language lang;
-    get_language(&lang);
-
     if (delay)
     {
         puts(_("Querying server settings"));
@@ -659,22 +649,14 @@ static int create(bool delete_temp_archive,
                        "Content-Type: application/x-xz-compressed-tar\r\n"
                        "Content-Length: %lld\r\n"
                        "Connection: close\r\n"
-                       "X-Task-Type: %d\r\n",
-                       cfg.url, (long long)file_stat.st_size, task_type);
-
-    if (lang.encoding)
-        strbuf_append_strf(http_request,
-                           "Accept-Charset: %s\r\n",
-                           lang.encoding);
-    if (lang.locale)
-    {
-        strbuf_append_strf(http_request,
-                           "Accept-Language: %s\r\n",
-                           lang.locale);
-        free(lang.locale);
-    }
-
-    strbuf_append_str(http_request, "\r\n");
+                       "X-Task-Type: %d\r\n"
+                       "%s"
+                       "%s"
+                       "\r\n",
+                       cfg.url, (long long)file_stat.st_size, task_type,
+                       lang.accept_charset,
+                       lang.accept_language
+    );
 
     PRInt32 written = PR_Send(tcp_sock, http_request->buf, http_request->len,
                               /*flags:*/0, PR_INTERVAL_NO_TIMEOUT);
@@ -825,9 +807,6 @@ static void status(const char *task_id,
                    char **task_status,
                    char **status_message)
 {
-    struct language lang;
-    get_language(&lang);
-
     PRFileDesc *tcp_sock, *ssl_sock;
     ssl_connect(&cfg, &tcp_sock, &ssl_sock);
     struct strbuf *http_request = strbuf_new();
@@ -836,22 +815,14 @@ static void status(const char *task_id,
                        "Host: %s\r\n"
                        "X-Task-Password: %s\r\n"
                        "Content-Length: 0\r\n"
-                       "Connection: close\r\n",
-                       task_id, cfg.url, task_password);
-
-    if (lang.encoding)
-        strbuf_append_strf(http_request,
-                           "Accept-Charset: %s\r\n",
-                           lang.encoding);
-    if (lang.locale)
-    {
-        strbuf_append_strf(http_request,
-                           "Accept-Language: %s\r\n",
-                           lang.locale);
-        free(lang.locale);
-    }
-
-    strbuf_append_str(http_request, "\r\n");
+                       "Connection: close\r\n"
+                       "%s"
+                       "%s"
+                       "\r\n",
+                       task_id, cfg.url, task_password,
+                       lang.accept_charset,
+                       lang.accept_language
+    );
 
     PRInt32 written = PR_Send(tcp_sock, http_request->buf, http_request->len,
                               /*flags:*/0, PR_INTERVAL_NO_TIMEOUT);
@@ -903,9 +874,6 @@ static void run_status(const char *task_id, const char 
*task_password)
 static void backtrace(const char *task_id, const char *task_password,
                       char **backtrace)
 {
-    struct language lang;
-    get_language(&lang);
-
     PRFileDesc *tcp_sock, *ssl_sock;
     ssl_connect(&cfg, &tcp_sock, &ssl_sock);
     struct strbuf *http_request = strbuf_new();
@@ -914,22 +882,14 @@ static void backtrace(const char *task_id, const char 
*task_password,
                        "Host: %s\r\n"
                        "X-Task-Password: %s\r\n"
                        "Content-Length: 0\r\n"
-                       "Connection: close\r\n",
-                       task_id, cfg.url, task_password);
-
-    if (lang.encoding)
-        strbuf_append_strf(http_request,
-                           "Accept-Charset: %s\r\n",
-                           lang.encoding);
-    if (lang.locale)
-    {
-        strbuf_append_strf(http_request,
-                           "Accept-Language: %s\r\n",
-                           lang.locale);
-        free(lang.locale);
-    }
-
-    strbuf_append_str(http_request, "\r\n");
+                       "Connection: close\r\n"
+                       "%s"
+                       "%s"
+                       "\r\n",
+                       task_id, cfg.url, task_password,
+                       lang.accept_charset,
+                       lang.accept_language
+    );
 
     PRInt32 written = PR_Send(tcp_sock, http_request->buf, http_request->len,
                               /*flags:*/0, PR_INTERVAL_NO_TIMEOUT);
@@ -971,9 +931,6 @@ static void run_backtrace(const char *task_id, const char 
*task_password)
 
 static void run_log(const char *task_id, const char *task_password)
 {
-    struct language lang;
-    get_language(&lang);
-
     PRFileDesc *tcp_sock, *ssl_sock;
     ssl_connect(&cfg, &tcp_sock, &ssl_sock);
     struct strbuf *http_request = strbuf_new();
@@ -982,22 +939,14 @@ static void run_log(const char *task_id, const char 
*task_password)
                        "Host: %s\r\n"
                        "X-Task-Password: %s\r\n"
                        "Content-Length: 0\r\n"
-                       "Connection: close\r\n",
-                       task_id, cfg.url, task_password);
-
-    if (lang.encoding)
-        strbuf_append_strf(http_request,
-                           "Accept-Charset: %s\r\n",
-                           lang.encoding);
-    if (lang.locale)
-    {
-        strbuf_append_strf(http_request,
-                           "Accept-Language: %s\r\n",
-                           lang.locale);
-        free(lang.locale);
-    }
-
-    strbuf_append_str(http_request, "\r\n");
+                       "Connection: close\r\n"
+                       "%s"
+                       "%s"
+                       "\r\n",
+                       task_id, cfg.url, task_password,
+                       lang.accept_charset,
+                       lang.accept_language
+    );
 
     PRInt32 written = PR_Send(tcp_sock, http_request->buf, http_request->len,
                               /*flags:*/0, PR_INTERVAL_NO_TIMEOUT);
@@ -1114,6 +1063,7 @@ int main(int argc, char **argv)
 #endif
 
     abrt_init(argv);
+    get_language(&lang);
 
     const char *task_id = NULL;
     const char *task_password = NULL;
diff --git a/src/plugins/https-utils.c b/src/plugins/https-utils.c
index 85d3f80..cb3c606 100644
--- a/src/plugins/https-utils.c
+++ b/src/plugins/https-utils.c
@@ -26,19 +26,34 @@ void get_language(struct language *lang)
 {
     lang->locale = NULL;
     lang->encoding = NULL;
+    /*
+     * Note: ->accept_language and ->accept_charset will always be non-NULL:
+     * if we don't know them, they'll be ""; otherwise,
+     * they will be fully formed HTTP headers, with \r\n at the end.
+     * IOW: they are formatted for adding them to HTTP headers as-is.
+     */
 
     char *locale = setlocale(LC_ALL, NULL);
     if (!locale)
+    {
+        lang->accept_language = xzalloc(1);
+        lang->accept_charset = xzalloc(1);
         return;
+    }
 
     lang->locale = xstrdup(locale);
-    lang->encoding = strchr(lang->locale, '.');
+    lang->accept_language = xasprintf("Accept-Language: %s\r\n", locale);
 
+    lang->encoding = strchr(lang->locale, '.');
     if (!lang->encoding)
+    {
+        lang->accept_charset = xzalloc(1);
         return;
+    }
 
     *lang->encoding = '\0';
     ++lang->encoding;
+    lang->accept_charset = xasprintf("Accept-Charset: %s\r\n", lang->encoding);
 }
 
 void alert_server_error(const char *peer_name)
diff --git a/src/plugins/https-utils.h b/src/plugins/https-utils.h
index 7f73ab9..8ff9aed 100644
--- a/src/plugins/https-utils.h
+++ b/src/plugins/https-utils.h
@@ -39,7 +39,10 @@ struct language
 {
     char *locale;
     char *encoding;
+    char *accept_charset;
+    char *accept_language;
 };
+void get_language(struct language *lang);
 
 struct https_cfg
 {
@@ -48,7 +51,6 @@ struct https_cfg
     bool ssl_allow_insecure;
 };
 
-void get_language(struct language *lang);
 void alert_server_error(const char *peer_name);
 void alert_connection_error(const char *peer_name);
 void ssl_connect(struct https_cfg *cfg, PRFileDesc **tcp_sock, PRFileDesc 
**ssl_sock);
-- 
1.8.1.4

Reply via email to