summaryrefslogtreecommitdiffhomepage
path: root/request.c
diff options
context:
space:
mode:
Diffstat (limited to 'request.c')
-rw-r--r--request.c52
1 files changed, 40 insertions, 12 deletions
diff --git a/request.c b/request.c
index e0956b4..15034ee 100644
--- a/request.c
+++ b/request.c
@@ -245,22 +245,23 @@ int parse_step_header_name(struct request * request)
lua_newtable(request->lua);
}
- // TODO: Check for the header section end without backtracking.
- const int position = request->position;
- int result = read_rest_of_line(request);
-
- if (0 == result)
+ if (request->position + 4 >= request->length)
{
return 0;
}
- if (2 == result - position)
+ if (
+ request->data[request->position] == '\r' &&
+ request->data[request->position + 1] == '\n' &&
+ request->data[request->position + 2] == '\r' &&
+ request->data[request->position + 3] == '\n')
{
- // Header section ended, nothing left to parse.
- return request->position + 2;
- }
+ // Skip "\r\n\r\n", end of headers.
+ request->position += 4;
- request->position = position;
+ // Early return hidden in a macro!
+ PROCEED_TO(parse_step_data);
+ }
if (0 >= request->temp.start)
{
@@ -272,10 +273,11 @@ int parse_step_header_name(struct request * request)
}
}
- result = read_until_char(request, ':');
+ int result = read_until_char(request, ':');
if (0 == result)
{
+ printf("parse_step_header_name:no ':'\n");
return 0;
}
@@ -331,5 +333,31 @@ int parse_step_header_value(struct request * request)
PROCEED_TO(parse_step_header_name);
}
-// TODO: Pass data payload to Lua state.
+/// Makes sure that the expected data is in payload and pushes it forward to Lua.
+/// \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_step_data(struct request * request)
+{
+ const int bytes_left = request->length - request->position;
+
+ if (bytes_left > request->expected_data_length)
+ {
+ return -1;
+ }
+ else if (bytes_left < request->expected_data_length)
+ {
+ return 0;
+ }
+
+ lua_pushlstring(request->lua, request->data + request->position, request->expected_data_length);
+
+ if (NULL != request->data)
+ {
+ free(request->data);
+ request->data = NULL;
+ }
+
+ return request->position;
+}
+
// TODO: Make a table from the request.