|
|
@ -37,8 +37,15 @@ static char server_hostname[256];
|
|
|
|
static char server_url[256];
|
|
|
|
static char server_url[256];
|
|
|
|
static char zet_dir[_POSIX_PATH_MAX-64];
|
|
|
|
static char zet_dir[_POSIX_PATH_MAX-64];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
enum http_method {
|
|
|
|
|
|
|
|
HTTP_METHOD_GET,
|
|
|
|
|
|
|
|
HTTP_METHOD_HEAD,
|
|
|
|
|
|
|
|
HTTP_METHOD_POST,
|
|
|
|
|
|
|
|
HTTP_METHOD_OTHER
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct http_request {
|
|
|
|
struct http_request {
|
|
|
|
char *method;
|
|
|
|
enum http_method method;
|
|
|
|
char *path;
|
|
|
|
char *path;
|
|
|
|
char *query;
|
|
|
|
char *query;
|
|
|
|
char *hash;
|
|
|
|
char *hash;
|
|
|
@ -1112,6 +1119,13 @@ static int http_serve_zet(struct http_request *req) {
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
enum http_method parse_method(const char *method) {
|
|
|
|
|
|
|
|
if (!strcasecmp(method, "GET")) return HTTP_METHOD_GET;
|
|
|
|
|
|
|
|
if (!strcasecmp(method, "HEAD")) return HTTP_METHOD_HEAD;
|
|
|
|
|
|
|
|
if (!strcasecmp(method, "POST")) return HTTP_METHOD_POST;
|
|
|
|
|
|
|
|
return HTTP_METHOD_OTHER;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int handle_http_client(int fd, int firstchar) {
|
|
|
|
static int handle_http_client(int fd, int firstchar) {
|
|
|
|
int rc;
|
|
|
|
int rc;
|
|
|
|
struct http_request req;
|
|
|
|
struct http_request req;
|
|
|
@ -1124,10 +1138,10 @@ static int handle_http_client(int fd, int firstchar) {
|
|
|
|
if (rc < 0) { close(fd); return 0; }
|
|
|
|
if (rc < 0) { close(fd); return 0; }
|
|
|
|
|
|
|
|
|
|
|
|
char *nextline = next_line(buf);
|
|
|
|
char *nextline = next_line(buf);
|
|
|
|
req.method = buf;
|
|
|
|
|
|
|
|
req.path = strchr(buf, ' ');
|
|
|
|
req.path = strchr(buf, ' ');
|
|
|
|
if (req.path == NULL) { close(fd); return 0; }
|
|
|
|
if (req.path == NULL) { close(fd); return 0; }
|
|
|
|
*req.path++ = '\0';
|
|
|
|
*req.path++ = '\0';
|
|
|
|
|
|
|
|
req.method = parse_method(buf);
|
|
|
|
req.http_version = strchr(req.path, ' ');
|
|
|
|
req.http_version = strchr(req.path, ' ');
|
|
|
|
if (req.http_version != NULL) *req.http_version++ = '\0';
|
|
|
|
if (req.http_version != NULL) *req.http_version++ = '\0';
|
|
|
|
|
|
|
|
|
|
|
@ -1185,6 +1199,15 @@ static int handle_http_client(int fd, int firstchar) {
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (req.method != HTTP_METHOD_POST) {
|
|
|
|
|
|
|
|
write_buf(fd, "HTTP/1.0 405 Method Not Allowed\r\n"
|
|
|
|
|
|
|
|
"Content-Type: text/plain\r\n"
|
|
|
|
|
|
|
|
"Connection: close\r\n\r\n"
|
|
|
|
|
|
|
|
"Expected POST request");
|
|
|
|
|
|
|
|
close(fd);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ptrdiff_t offset = nextline - buf;
|
|
|
|
ptrdiff_t offset = nextline - buf;
|
|
|
|
req.data = nextline;
|
|
|
|
req.data = nextline;
|
|
|
|
req.full_data = NULL;
|
|
|
|
req.full_data = NULL;
|
|
|
|