diff options
Diffstat (limited to 'src/libwaitress')
-rw-r--r-- | src/libwaitress/waitress.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/libwaitress/waitress.c b/src/libwaitress/waitress.c index 9910059..1099252 100644 --- a/src/libwaitress/waitress.c +++ b/src/libwaitress/waitress.c @@ -52,11 +52,15 @@ typedef struct { } WaitressFetchBufCbBuffer_t; void WaitressInit (WaitressHandle_t *waith) { + assert (waith != NULL); + memset (waith, 0, sizeof (*waith)); waith->socktimeout = 30000; } void WaitressFree (WaitressHandle_t *waith) { + assert (waith != NULL); + free (waith->url.url); free (waith->proxy.url); memset (waith, 0, sizeof (*waith)); @@ -67,6 +71,8 @@ void WaitressFree (WaitressHandle_t *waith) { * @return true|false */ bool WaitressProxyEnabled (const WaitressHandle_t *waith) { + assert (waith != NULL); + return waith->proxy.host != NULL; } @@ -75,6 +81,8 @@ bool WaitressProxyEnabled (const WaitressHandle_t *waith) { * @return malloc'ed encoded string, don't forget to free it */ char *WaitressUrlEncode (const char *in) { + assert (in != NULL); + size_t inLen = strlen (in); /* worst case: encode all characters */ char *out = calloc (inLen * 3 + 1, sizeof (*in)); @@ -384,6 +392,9 @@ WaitressReturn_t WaitressFetchBuf (WaitressHandle_t *waith, char **retBuffer) { WaitressFetchBufCbBuffer_t buffer; WaitressReturn_t wRet; + assert (waith != NULL); + assert (retBuffer != NULL); + memset (&buffer, 0, sizeof (buffer)); waith->data = &buffer; @@ -401,6 +412,9 @@ static int WaitressPollLoop (struct pollfd *fds, nfds_t nfds, int timeout) { int pollres = -1; int pollerr = 0; + assert (fds != NULL); + assert (nfds > 0); + do { pollres = poll (fds, nfds, timeout); pollerr = errno; @@ -422,6 +436,11 @@ static WaitressReturn_t WaitressPollWrite (int sockfd, const char *buf, size_t c struct pollfd *sockpoll, int timeout) { int pollres = -1; + assert (sockfd != -1); + assert (buf != NULL); + assert (count > 0); + assert (sockpoll != NULL); + sockpoll->events = POLLOUT; pollres = WaitressPollLoop (sockpoll, 1, timeout); if (pollres == 0) { @@ -448,6 +467,12 @@ static WaitressReturn_t WaitressPollRead (int sockfd, char *buf, size_t count, struct pollfd *sockpoll, int timeout, ssize_t *retSize) { int pollres = -1; + assert (sockfd != -1); + assert (buf != NULL); + assert (count > 0); + assert (sockpoll != NULL); + assert (retSize != NULL); + sockpoll->events = POLLIN; pollres = WaitressPollLoop (sockpoll, 1, timeout); if (pollres == 0) { @@ -469,11 +494,18 @@ static WaitressReturn_t WaitressPollRead (int sockfd, char *buf, size_t count, static bool WaitressFormatAuthorization (WaitressHandle_t *waith, WaitressUrl_t *url, const char *prefix, char *writeBuf, const size_t writeBufSize) { + assert (waith != NULL); + assert (url != NULL); + assert (prefix != NULL); + assert (writeBuf != NULL); + assert (writeBufSize > 0); + if (url->user != NULL) { char userPass[1024], *encodedUserPass; snprintf (userPass, sizeof (userPass), "%s:%s", url->user, (url->password != NULL) ? url->password : ""); encodedUserPass = WaitressBase64Encode (userPass); + assert (encodedUserPass != NULL); snprintf (writeBuf, writeBufSize, "%sAuthorization: Basic %s\r\n", prefix, encodedUserPass); free (encodedUserPass); @@ -485,6 +517,8 @@ static bool WaitressFormatAuthorization (WaitressHandle_t *waith, /* get default http port if none was given */ static const char *WaitressDefaultPort (const WaitressUrl_t * const url) { + assert (url != NULL); + return url->port == NULL ? "80" : url->port; } @@ -495,6 +529,8 @@ static const char *WaitressDefaultPort (const WaitressUrl_t * const url) { static char *WaitressGetline (char * const str) { char *eol; + assert (str != NULL); + eol = strchr (str, '\n'); if (eol == NULL) { return NULL; @@ -508,6 +544,8 @@ static char *WaitressGetline (char * const str) { /* skip \0 */ ++eol; + assert (eol >= str); + return eol; } @@ -515,6 +553,9 @@ static char *WaitressGetline (char * const str) { */ static WaitressHandlerReturn_t WaitressHandleIdentity (WaitressHandle_t *waith, char *buf, const size_t size) { + assert (waith != NULL); + assert (buf != NULL); + waith->request.contentReceived += size; if (waith->callback (buf, size, waith->data) == WAITRESS_CB_RET_ERR) { return WAITRESS_HANDLER_ABORTED; @@ -530,6 +571,9 @@ static WaitressHandlerReturn_t WaitressHandleChunked (WaitressHandle_t *waith, char *buf, const size_t size) { char *content = buf, *nextContent; + assert (waith != NULL); + assert (buf != NULL); + while (1) { if (waith->request.chunkSize > 0) { const size_t remaining = size-(content-buf); @@ -539,6 +583,7 @@ static WaitressHandlerReturn_t WaitressHandleChunked (WaitressHandle_t *waith, waith->request.chunkSize) == WAITRESS_HANDLER_ABORTED) { return WAITRESS_HANDLER_ABORTED; } + content += waith->request.chunkSize; if (content[0] == '\r' && content[1] == '\n') { content += 2; @@ -579,6 +624,10 @@ static WaitressHandlerReturn_t WaitressHandleChunked (WaitressHandle_t *waith, */ static void WaitressHandleHeader (WaitressHandle_t *waith, const char * const key, const char * const value) { + assert (waith != NULL); + assert (key != NULL); + assert (value != NULL); + if (strcaseeq (key, "Content-Length")) { waith->request.contentLength = atol (value); } else if (strcaseeq (key, "Transfer-Encoding")) { @@ -593,6 +642,8 @@ static void WaitressHandleHeader (WaitressHandle_t *waith, const char * const ke static int WaitressParseStatusline (const char * const line) { char status[4] = "000"; + assert (line != NULL); + if (sscanf (line, "HTTP/1.%*1[0-9] %3[0-9] ", status) == 1) { return atoi (status); } |