/* SPDX-License-Identifier: GPL-3.0-or-later */ /* Copyright 2022 Ivan Polyakov */ #include "request.h" #include #include 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; } } }