summaryrefslogtreecommitdiffhomepage
path: root/http.c
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2020-05-12 18:00:36 +0200
committerAki <please@ignore.pl>2020-05-12 18:00:36 +0200
commitb9b52c6a3ffad848b969d80c2145cc17405cd0c7 (patch)
tree9ff781c2777b5b5d71406417af23bad350039445 /http.c
parent28d3eb7ec11b9724b1b1e9670939f2463281a3ad (diff)
downloadplop-b9b52c6a3ffad848b969d80c2145cc17405cd0c7.zip
plop-b9b52c6a3ffad848b969d80c2145cc17405cd0c7.tar.gz
plop-b9b52c6a3ffad848b969d80c2145cc17405cd0c7.tar.bz2
Client handler now uses new parser
Diffstat (limited to 'http.c')
-rw-r--r--http.c59
1 files changed, 27 insertions, 32 deletions
diff --git a/http.c b/http.c
index c61b47b..ca7dcdf 100644
--- a/http.c
+++ b/http.c
@@ -7,6 +7,8 @@
#include <string.h>
#include <unistd.h>
+static const int REQUEST_DATA_SIZE = 4096;
+
const char * status_str[] = {
[STATUS_OK] = "200 OK",
[STATUS_BAD_REQUEST] = "400 Bad Request",
@@ -18,7 +20,7 @@ const char * status_str[] = {
};
/// Allocates and initializes request structure.
-/// \return Pointer to initialized request
+/// \return Pointer to initialized request or NULL in case of an error
/// \see /free_request
struct request * new_request(void)
{
@@ -30,7 +32,15 @@ struct request * new_request(void)
}
memset(request, 0, sizeof(struct request));
- request->step = parse_method;
+ request->step = parse_step_method;
+
+ request->data = malloc(REQUEST_DATA_SIZE);
+
+ if (NULL == request->data)
+ {
+ free(request);
+ return NULL;
+ }
return request;
}
@@ -42,7 +52,7 @@ void free_request(struct request * request)
{
if (NULL != request->data)
{
- // TODO: free(request->data); data lifetime is now managed by plop, move it here
+ free(request->data);
}
if (NULL != request->headers)
@@ -92,15 +102,13 @@ int respond_with_body(const int fd, const enum status status, const char * body,
/// Collects request between calls to `poll`.
/// \param fd Client socket
-/// \param request Buffer with the request content
+/// \param request Pointer to current request context of handled client
/// \return Number of bytes parsed, -1 if an error occured or 0 if expects more data
-int collect_request(const int fd, char ** request)
+int parse_request(const int fd, struct request ** request)
{
- static const int size = 4096;
-
if (NULL == *request)
{
- *request = malloc(size);
+ *request = new_request();
if (NULL == *request)
{
return -1;
@@ -108,30 +116,17 @@ int collect_request(const int fd, char ** request)
}
// TODO: Expand buffer until EAGAIN or arbitrary limit
- int length = read(fd, *request, size - 1);
+ int length = read(fd, (*request)->data, REQUEST_DATA_SIZE - 1);
if (0 == length || (-1 == length && EWOULDBLOCK != errno && EAGAIN != errno))
{
return -1; // TODO: Handle errors properly
}
- // TODO: Use struct request in plop
- struct request * debug = new_request();
- debug->data = *request;
- debug->length = length;
- debug->step(debug);
-
- printf(
- "(%.*s) [%.*s] %.*s\n",
- debug->version.length, debug->data + debug->version.start,
- debug->method.length, debug->data + debug->method.start,
- debug->path.length, debug->data + debug->path.start);
-
- free_request(debug);
-
- (*request)[length] = 0;
+ (*request)->data[length] = 0;
+ (*request)->length = length;
- return length;
+ return (*request)->step(*request);
}
@@ -199,7 +194,7 @@ static int read_rest_of_line(struct request * request)
/// Parses method field of the request.
/// \param request Request to process
/// \return -1 if an error has occured, 0 if too little data available or total number of bytes processed
-int parse_method(struct request * request)
+int parse_step_method(struct request * request)
{
request->method.length = read_until_char(request, ' ');
@@ -208,16 +203,16 @@ int parse_method(struct request * request)
return 0;
}
- request->step = parse_path;
+ request->step = parse_step_path;
- return parse_path(request);
+ return parse_step_path(request);
}
/// Parses path field of the request.
/// \param request Request to process
/// \return -1 if an error has occured, 0 if too little data available or total number of bytes processed
// TODO: Consider spliting path into an actual path and arguments in this stage
-int parse_path(struct request * request)
+int parse_step_path(struct request * request)
{
if (0 >= request->path.start)
{
@@ -237,16 +232,16 @@ int parse_path(struct request * request)
}
request->path.length = request->position - request->path.start;
- request->step = parse_version;
+ request->step = parse_step_version;
- return parse_version(request);
+ return parse_step_version(request);
}
/// Parses and verifies http version field of the request.
/// \param request Request to process
/// \return -1 if an error has occured, 0 if too little data available or total number of bytes processed
// TODO: Return -1 if version is unsupported, meaning other than HTTP/1.1
-int parse_version(struct request * request)
+int parse_step_version(struct request * request)
{
if (0 >= request->version.start)
{