C and C++ web framework.
http://rapida.vilor.one/docs
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.2 KiB
91 lines
2.2 KiB
/* SPDX-License-Identifier: GPL-3.0-or-later */ |
|
/* Copyright 2022 Ivan Polyakov */ |
|
|
|
#include "request.h" |
|
#include <stdlib.h> |
|
#include <string.h> |
|
|
|
static int rpd_req_read_body(char **dest, FCGX_Request *req); |
|
|
|
enum rpd_req_methods rpd_req_smethod(const char *method) |
|
{ |
|
if (!strcmp(method, "GET")) |
|
return GET; |
|
else if (!strcmp(method, "HEAD")) |
|
return HEAD; |
|
else if (!strcmp(method, "POST")) |
|
return POST; |
|
else if (!strcmp(method, "PUT")) |
|
return PUT; |
|
else if (!strcmp(method, "PATCH")) |
|
return PATCH; |
|
else if (!strcmp(method, "DELETE")) |
|
return DELETE; |
|
else if (!strcmp(method, "CONNECT")) |
|
return CONNECT; |
|
else if (!strcmp(method, "OPTIONS")) |
|
return OPTIONS; |
|
else if (!strcmp(method, "TRACE")) |
|
return TRACE; |
|
return UNKNOWN; |
|
} |
|
|
|
int rpd_req_parse(rpd_req *dest, FCGX_Request *req) |
|
{ |
|
rpd_query_parse(&dest->query, FCGX_GetParam("QUERY_STRING", req->envp)); |
|
|
|
dest->method = rpd_req_smethod(FCGX_GetParam("REQUEST_METHOD", req->envp)); |
|
rpd_url_parse(&dest->path, FCGX_GetParam("DOCUMENT_URI", req->envp)); |
|
dest->auth = FCGX_GetParam("HTTP_AUTHORIZATION", req->envp); |
|
dest->cookie = FCGX_GetParam("HTTP_COOKIE", req->envp); |
|
rpd_keyval_init(&dest->params, 0); |
|
|
|
if (dest->method != GET) { |
|
if (rpd_req_read_body(&dest->body, req)) { |
|
return 2; |
|
} |
|
} else { |
|
dest->body = NULL; |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
static int rpd_req_read_body(char **dest, FCGX_Request *req) |
|
{ |
|
char *clen = FCGX_GetParam("CONTENT_LENGTH", req->envp); |
|
if (!clen) |
|
return 1; |
|
size_t len = atoll(clen); |
|
|
|
*dest = (char *) malloc(sizeof(char) * (len + 1)); |
|
if (!*dest) |
|
return 2; |
|
|
|
*dest[len] = '\0'; |
|
FCGX_GetStr(*dest, len, req->in); |
|
|
|
return 0; |
|
} |
|
|
|
void rpd_req_cleanup(rpd_req *req) |
|
{ |
|
rpd_keyval_cleanup(&req->params); |
|
|
|
if (req->body) { |
|
free(req->body); |
|
req->body = NULL; |
|
} |
|
|
|
if (req->query.size) { |
|
rpd_keyval_cleanup(&req->query); |
|
} |
|
|
|
if (req->params.size) { |
|
for (int i = 0; i < req->params.size; i++) { |
|
rpd_keyval_item *item = req->params.items + i; |
|
free(item->val); |
|
item->val = NULL; |
|
} |
|
} |
|
}
|
|
|