make URI parsing a bit more flexible again + sync some URI parse parts - gopher… | |
git clone git://git.codemadness.org/gopherproxy-c | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 838e8638e0f943519b4575b30175eae223483f9d | |
parent e9b0ad3f6eaef101ec93e70846460f9a4127e129 | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Sat, 19 Mar 2022 11:48:14 +0100 | |
make URI parsing a bit more flexible again + sync some URI parse parts | |
Diffstat: | |
M gopherproxy.c | 35 +++++++++++++++++++----------… | |
1 file changed, 22 insertions(+), 13 deletions(-) | |
--- | |
diff --git a/gopherproxy.c b/gopherproxy.c | |
@@ -452,7 +452,7 @@ checkparam(const char *s) | |
return 1; | |
} | |
-/* check if string has a non-empty scheme / protocol part */ | |
+/* Check if string has a non-empty scheme / protocol part. */ | |
int | |
uri_hasscheme(const char *s) | |
{ | |
@@ -465,6 +465,8 @@ uri_hasscheme(const char *s) | |
return (*p == ':' && p != s); | |
} | |
+/* Parse URI string `s` into an uri structure `u`. | |
+ Returns 0 on success or -1 on failure */ | |
int | |
uri_parse(const char *s, struct uri *u) | |
{ | |
@@ -582,9 +584,9 @@ int | |
main(void) | |
{ | |
struct uri u; | |
- const char *p, *qs, *path, *uri = ""; | |
- char query[1024] = "", param[1024] = ""; | |
- int _type = '1'; | |
+ const char *p, *qs, *path, *showuri = ""; | |
+ char query[1024] = "", param[1024] = "", fulluri[4096]; | |
+ int r, _type = '1'; | |
if (pledge("stdio inet dns", NULL) == -1) | |
die(500, "pledge: %s\n", strerror(errno)); | |
@@ -604,14 +606,21 @@ main(void) | |
path = "/"; | |
if (query[0]) { | |
- if (!strncmp(query, "gopher://", sizeof("gopher://") - 1)) | |
- uri = query + sizeof("gopher://") - 1; | |
- else | |
- uri = query; | |
- | |
- if (!uri_hasscheme(uri) || | |
- uri_parse(uri, &u) == -1) | |
- die(400, "Invalid uri: %s\n", uri); | |
+ if (!strncmp(query, "gopher://", sizeof("gopher://") - 1)) { | |
+ showuri = query + sizeof("gopher://") - 1; | |
+ r = snprintf(fulluri, sizeof(fulluri), "%s", query); | |
+ } else { | |
+ showuri = query; | |
+ r = snprintf(fulluri, sizeof(fulluri), "gopher://%s", … | |
+ } | |
+ if (r < 0 || (size_t)r >= sizeof(fulluri)) | |
+ die(400, "invalid URI: too long\n"); | |
+ | |
+ if (!uri_hasscheme(fulluri) || | |
+ uri_parse(fulluri, &u) == -1) | |
+ die(400, "Invalid or unsupported URI: %s\n", showuri); | |
+ if (strcmp(u.proto, "gopher://")) | |
+ die(400, "Invalid protocol: only gopher is supported\n… | |
if (u.host[0] == '\0') | |
die(400, "Invalid hostname\n"); | |
@@ -700,7 +709,7 @@ main(void) | |
"<body>\n" | |
"<form method=\"get\" action=\"\"><pre>" | |
" URI: <input type=\"search\" name=\"q\" value=\"", stdout); | |
- xmlencode(uri); | |
+ xmlencode(showuri); | |
fputs( | |
"\" placeholder=\"URI...\" size=\"72\" autofocus=\"autofocus\"… | |
"<input type=\"submit\" value=\"Go for it!\" /></pre>" |