mirror of
https://git.sr.ht/~sircmpwn/gmnisrv
synced 2024-12-04 14:46:42 -05:00
Routing: Fix non-ascii paths
This commit is contained in:
parent
fbef1d34a1
commit
ea360fa4c1
15
src/serve.c
15
src/serve.c
@ -11,6 +11,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include "config.h"
|
||||
#include "escape.h"
|
||||
#include "gemini.h"
|
||||
#include "log.h"
|
||||
#include "mime.h"
|
||||
@ -377,9 +378,10 @@ serve_request(struct gmnisrv_client *client)
|
||||
struct gmnisrv_route *route = host->routes;
|
||||
assert(route);
|
||||
|
||||
char *client_path = curl_unescape(client->path, 0);
|
||||
char *url_path = NULL;
|
||||
while (route) {
|
||||
if (route_match(route, client->path, &url_path)) {
|
||||
if (route_match(route, client_path, &url_path)) {
|
||||
break;
|
||||
}
|
||||
|
||||
@ -389,6 +391,7 @@ serve_request(struct gmnisrv_client *client)
|
||||
if (!route) {
|
||||
client_submit_response(client,
|
||||
GEMINI_STATUS_NOT_FOUND, "Not found", NULL);
|
||||
free(client_path);
|
||||
free(url_path);
|
||||
return;
|
||||
}
|
||||
@ -397,7 +400,6 @@ serve_request(struct gmnisrv_client *client)
|
||||
|
||||
// Paths on paths on paths on paths
|
||||
// My apologies to the stack
|
||||
char client_path[PATH_MAX + 1] = "";
|
||||
char real_path[PATH_MAX + 1] = "";
|
||||
char pathinfo[PATH_MAX + 1] = "";
|
||||
char temp_path[PATH_MAX + 1] = "";
|
||||
@ -405,10 +407,10 @@ serve_request(struct gmnisrv_client *client)
|
||||
if ((size_t)n >= sizeof(real_path)) {
|
||||
client_submit_response(client, GEMINI_STATUS_PERMANENT_FAILURE,
|
||||
"Request path exceeds PATH_MAX", NULL);
|
||||
free(client_path);
|
||||
free(url_path);
|
||||
return;
|
||||
}
|
||||
strcpy(client_path, client->path);
|
||||
|
||||
int nlinks = 0;
|
||||
struct stat st;
|
||||
@ -455,6 +457,7 @@ serve_request(struct gmnisrv_client *client)
|
||||
|
||||
client_submit_response(client,
|
||||
GEMINI_STATUS_NOT_FOUND, "Not found", NULL);
|
||||
free(client_path);
|
||||
free(url_path);
|
||||
return;
|
||||
}
|
||||
@ -462,6 +465,7 @@ serve_request(struct gmnisrv_client *client)
|
||||
if (S_ISDIR(st.st_mode)) {
|
||||
if (route->autoindex) {
|
||||
serve_autoindex(client, real_path);
|
||||
free(client_path);
|
||||
free(url_path);
|
||||
return;
|
||||
} else {
|
||||
@ -485,6 +489,7 @@ serve_request(struct gmnisrv_client *client)
|
||||
client_submit_response(client,
|
||||
GEMINI_STATUS_NOT_FOUND,
|
||||
"Not found", NULL);
|
||||
free(client_path);
|
||||
free(url_path);
|
||||
return;
|
||||
}
|
||||
@ -503,6 +508,7 @@ serve_request(struct gmnisrv_client *client)
|
||||
// Don't serve special files
|
||||
client_submit_response(client,
|
||||
GEMINI_STATUS_NOT_FOUND, "Not found", NULL);
|
||||
free(client_path);
|
||||
free(url_path);
|
||||
return;
|
||||
}
|
||||
@ -514,9 +520,12 @@ serve_request(struct gmnisrv_client *client)
|
||||
serve_cgi(client, real_path,
|
||||
(const char *)client_path,
|
||||
(const char *)pathinfo);
|
||||
free(client_path);
|
||||
return;
|
||||
}
|
||||
|
||||
free(client_path);
|
||||
|
||||
FILE *body = fopen(real_path, "r");
|
||||
if (!body) {
|
||||
if (errno == ENOENT) {
|
||||
|
Loading…
Reference in New Issue
Block a user