Denys Vlasenko
2013-09-09 12:31:42 UTC
Signed-off-by: Denys Vlasenko <dvlasenk-H+wXaHxf7aLQT0dZR+***@public.gmane.org>
---
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);
---
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
1.8.1.4