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);