Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Reads (without blocking) an HTTP request's headers into memory dynamically allocated on heap.
- * Stores address thereof in *message and length thereof in *length.
- */
- bool request(char** message, size_t* length)
- {
- // ensure socket is open
- if (cfd == -1)
- {
- return false;
- }
- // initialize message and its length
- *message = NULL;
- *length = 0;
- // read message
- while (*length < LimitRequestLine + LimitRequestFields * LimitRequestFieldSize + 4)
- {
- // read from socket
- BYTE buffer[BYTES];
- ssize_t bytes = read(cfd, buffer, BYTES);
- if (bytes < 0)
- {
- if (*message != NULL)
- {
- free(*message);
- *message = NULL;
- }
- *length = 0;
- break;
- }
- // append bytes to message
- *message = realloc(*message, *length + bytes + 1);
- if (*message == NULL)
- {
- *length = 0;
- break;
- }
- memcpy(*message + *length, buffer, bytes);
- *length += bytes;
- // null-terminate message thus far
- *(*message + *length) = '\0';
- // search for CRLF CRLF
- int offset = (*length - bytes < 3) ? *length - bytes : 3;
- char* haystack = *message + *length - bytes - offset;
- char* needle = strstr(haystack, "\r\n\r\n");
- if (needle != NULL)
- {
- // trim to one CRLF and null-terminate
- *length = needle - *message + 2;
- *message = realloc(*message, *length + 1);
- if (*message == NULL)
- {
- break;
- }
- *(*message + *length) = '\0';
- // ensure request-line is no longer than LimitRequestLine
- haystack = *message;
- needle = strstr(haystack, "\r\n");
- if (needle == NULL || (needle - haystack + 2) > LimitRequestLine)
- {
- break;
- }
- // count fields in message
- int fields = 0;
- haystack = needle + 2;
- while (*haystack != '\0')
- {
- // look for CRLF
- needle = strstr(haystack, "\r\n");
- if (needle == NULL)
- {
- break;
- }
- // ensure field is no longer than LimitRequestFieldSize
- if (needle - haystack + 2 > LimitRequestFieldSize)
- {
- break;
- }
- // look beyond CRLF
- haystack = needle + 2;
- }
- // if we didn't get to end of message, we must have erred
- if (*haystack != '\0')
- {
- break;
- }
- // ensure message has no more than LimitRequestFields
- if (fields > LimitRequestFields)
- {
- break;
- }
- // valid
- return true;
- }
- }
- // invalid
- if (*message != NULL)
- {
- free(*message);
- }
- *message = NULL;
- *length = 0;
- return false;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement