From b6c7d8f58e44447a90d6ecd7c7398fb5389bf718 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner <lorenz.stechauner@necronda.net> Date: Sun, 24 Jan 2021 21:20:48 +0100 Subject: [PATCH] URL UTF-8 Bugfix --- src/client.c | 2 +- src/utils.c | 7 +++++-- src/utils.h | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/client.c b/src/client.c index 3223149..8d06702 100644 --- a/src/client.c +++ b/src/client.c @@ -146,7 +146,7 @@ int client_request_handler(sock *client, unsigned long client_num, unsigned int if (strcmp(uri.uri, buf0) != 0 || change_proto) { res.status = http_get_status(308); size = sizeof(buf0); - encode_url(uri.uri, buf0, &size); + url_encode(uri.uri, buf0, &size); if (change_proto) { sprintf(buf1, "https://%s%s", host, buf0); http_add_header_field(&res.hdr, "Location", buf1); diff --git a/src/utils.c b/src/utils.c index a8e7b36..feb2d66 100644 --- a/src/utils.c +++ b/src/utils.c @@ -23,7 +23,7 @@ char *format_duration(unsigned long micros, char *buf) { return buf; } -int url_encode(const char *str, char *enc, ssize_t *size) { +int url_encode_component(const char *str, char *enc, ssize_t *size) { char *ptr = enc; char ch; memset(enc, 0, *size); @@ -50,7 +50,7 @@ int url_encode(const char *str, char *enc, ssize_t *size) { return 0; } -int encode_url(const char *str, char *enc, ssize_t *size) { +int url_encode(const char *str, char *enc, ssize_t *size) { char *ptr = enc; unsigned char ch; memset(enc, 0, *size); @@ -89,6 +89,9 @@ int url_decode(const char *str, char *dec, ssize_t *size) { buf[2] = 0; ch = (char) strtol(buf, NULL, 16); i += 2; + } else if (ch == '?') { + strcpy(ptr, str + i); + break; } ptr[0] = ch; } diff --git a/src/utils.h b/src/utils.h index 375ae04..2bcb7c4 100644 --- a/src/utils.h +++ b/src/utils.h @@ -22,9 +22,9 @@ char *log_prefix; char *format_duration(unsigned long micros, char *buf); -int url_encode(const char *str, char *enc, ssize_t *size); +int url_encode_component(const char *str, char *enc, ssize_t *size); -int encode_url(const char *str, char *enc, ssize_t *size); +int url_encode(const char *str, char *enc, ssize_t *size); int url_decode(const char *str, char *dec, ssize_t *size);