Encode characters for 'q' parameter to get passed and parsed correctly - gopher… | |
git clone git://git.codemadness.org/gopherproxy-c | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit e96ccc93928250ede30995cff7bf0e11758b2602 | |
parent 21855e485f7a47b90546f9039fec6a4b4f382567 | |
Author: Julian Schweinsberg <[email protected]> | |
Date: Wed, 13 Nov 2024 18:41:56 +0000 | |
Encode characters for 'q' parameter to get passed and parsed correctly | |
Without encoding the characters '&' and '=' they would be interpreted by | |
getparam(), this is not correct because these characters are part of the | |
selector of the gopher URI and shouldn't be interpreted by the | |
gopherproxy but the gopher server. | |
Additionally '#' gets escaped or it wouldn't be passed to the | |
gopherproxy and by this not to the gopher server. | |
The additional characters get URL escaped, so that no xmlenode is | |
needed. | |
For the character '&' gopher://gopherddit.com/1 is a good test case. | |
Diffstat: | |
M gopherproxy.c | 26 +++++++++++++++++++++++++- | |
1 file changed, 25 insertions(+), 1 deletion(-) | |
--- | |
diff --git a/gopherproxy.c b/gopherproxy.c | |
@@ -91,6 +91,30 @@ xmlencode(const char *s) | |
} | |
} | |
+/* Percent-encode characters so that the string can be used as a value for a | |
+ query string. | |
+ Additional characters get encoded so that no xmlencode() is needed */ | |
+void | |
+encodeparam(const char *s) | |
+{ | |
+ for (; *s; s++) { | |
+ switch (*s) { | |
+ case '<': | |
+ case '>': | |
+ case '\'': | |
+ case '&': | |
+ case '"': | |
+ case '#': | |
+ case '=': | |
+ printf("%%%02X", (unsigned char)*s); | |
+ break; | |
+ default: | |
+ putchar(*s); | |
+ break; | |
+ } | |
+ } | |
+} | |
+ | |
int | |
edial(const char *host, const char *port) | |
{ | |
@@ -371,7 +395,7 @@ servedir(const char *server, const char *port, const char *… | |
xmlencode(v.path + sizeof("URL:") - 1); | |
} else { | |
fputs("?q=", stdout); | |
- xmlencode(uri); | |
+ encodeparam(uri); | |
} | |
fputs("\">", stdout); | |
xmlencode(v.username); |