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

/* 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;
}
}
}