summaryrefslogtreecommitdiff
path: root/src/libwaitress/waitress.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libwaitress/waitress.c')
-rw-r--r--src/libwaitress/waitress.c83
1 files changed, 46 insertions, 37 deletions
diff --git a/src/libwaitress/waitress.c b/src/libwaitress/waitress.c
index b08985c..0c6242d 100644
--- a/src/libwaitress/waitress.c
+++ b/src/libwaitress/waitress.c
@@ -778,47 +778,32 @@ static WaitressReturn_t WaitressSendRequest (WaitressHandle_t *waith) {
#undef WRITE_RET
}
-/* Receive data from host and call *callback ()
- * @param waitress handle
- * @return WaitressReturn_t
+/* read response header and data
*/
-WaitressReturn_t WaitressFetchCall (WaitressHandle_t *waith) {
-/* FIXME: compiler macros are ugly... */
-#define FINISH(ret) wRet = ret; goto finish;
+static WaitressReturn_t WaitressReceiveResponse (WaitressHandle_t *waith) {
#define READ_RET(buf, count, size) \
if ((wRet = WaitressPollRead (waith->request.sockfd, buf, count, \
waith->socktimeout, size)) != WAITRESS_RET_OK) { \
- FINISH (wRet); \
+ return wRet; \
}
- ssize_t recvSize = 0;
- WaitressReturn_t wRet = WAITRESS_RET_OK;
- /* header parser vars */
+ assert (waith != NULL);
+ assert (waith->request.buf != NULL);
+
+ char * const buf = waith->request.buf;
char *nextLine = NULL, *thisLine = NULL;
enum {HDRM_HEAD, HDRM_LINES, HDRM_FINISHED} hdrParseMode = HDRM_HEAD;
- unsigned int bufFilled = 0;
-
- /* initialize */
- memset (&waith->request, 0, sizeof (waith->request));
- waith->request.dataHandler = WaitressHandleIdentity;
-
- if ((wRet = WaitressConnect (waith)) != WAITRESS_RET_OK) {
- return wRet;
- }
-
- waith->request.buf = malloc (WAITRESS_BUFFER_SIZE * sizeof (*waith->request.buf));
- if ((wRet = WaitressSendRequest (waith)) != WAITRESS_RET_OK) {
- return wRet;
- }
+ ssize_t recvSize = 0;
+ size_t bufFilled = 0;
+ WaitressReturn_t wRet = WAITRESS_RET_OK;
- char * const buf = waith->request.buf;
/* receive answer */
nextLine = buf;
while (hdrParseMode != HDRM_FINISHED) {
READ_RET (buf+bufFilled, WAITRESS_BUFFER_SIZE-1 - bufFilled, &recvSize);
if (recvSize == 0) {
/* connection closed too early */
- FINISH (WAITRESS_RET_CONNECTION_CLOSED);
+ return WAITRESS_RET_CONNECTION_CLOSED;
}
bufFilled += recvSize;
buf[bufFilled] = '\0';
@@ -837,11 +822,11 @@ WaitressReturn_t WaitressFetchCall (WaitressHandle_t *waith) {
break;
case 403:
- FINISH(WAITRESS_RET_FORBIDDEN);
+ return WAITRESS_RET_FORBIDDEN;
break;
case 404:
- FINISH(WAITRESS_RET_NOTFOUND);
+ return WAITRESS_RET_NOTFOUND;
break;
case -1:
@@ -849,7 +834,7 @@ WaitressReturn_t WaitressFetchCall (WaitressHandle_t *waith) {
break;
default:
- FINISH (WAITRESS_RET_STATUS_UNKNOWN);
+ return WAITRESS_RET_STATUS_UNKNOWN;
break;
}
break;
@@ -889,15 +874,15 @@ WaitressReturn_t WaitressFetchCall (WaitressHandle_t *waith) {
buf[recvSize] = '\0';
switch (waith->request.dataHandler (waith, buf, recvSize)) {
case WAITRESS_HANDLER_DONE:
- FINISH (WAITRESS_RET_OK);
+ return WAITRESS_RET_OK;
break;
case WAITRESS_HANDLER_ERR:
- FINISH (WAITRESS_RET_DECODING_ERR);
+ return WAITRESS_RET_DECODING_ERR;
break;
case WAITRESS_HANDLER_ABORTED:
- FINISH (WAITRESS_RET_CB_ABORT);
+ return WAITRESS_RET_CB_ABORT;
break;
case WAITRESS_HANDLER_CONTINUE:
@@ -907,18 +892,42 @@ WaitressReturn_t WaitressFetchCall (WaitressHandle_t *waith) {
READ_RET (buf, WAITRESS_BUFFER_SIZE-1, &recvSize);
} while (recvSize > 0);
-finish:
+ return WAITRESS_RET_OK;
+
+#undef READ_RET
+}
+
+/* Receive data from host and call *callback ()
+ * @param waitress handle
+ * @return WaitressReturn_t
+ */
+WaitressReturn_t WaitressFetchCall (WaitressHandle_t *waith) {
+ WaitressReturn_t wRet = WAITRESS_RET_OK;
+
+ /* initialize */
+ memset (&waith->request, 0, sizeof (waith->request));
+ waith->request.dataHandler = WaitressHandleIdentity;
+
+ /* request */
+ if ((wRet = WaitressConnect (waith)) == WAITRESS_RET_OK) {
+ waith->request.buf = malloc (WAITRESS_BUFFER_SIZE *
+ sizeof (*waith->request.buf));
+
+ if ((wRet = WaitressSendRequest (waith)) == WAITRESS_RET_OK) {
+ wRet = WaitressReceiveResponse (waith);
+ }
+
+ free (waith->request.buf);
+ }
+
+ /* cleanup */
close (waith->request.sockfd);
- free (buf);
if (wRet == WAITRESS_RET_OK &&
waith->request.contentReceived < waith->request.contentLength) {
return WAITRESS_RET_PARTIAL_FILE;
}
return wRet;
-
-#undef FINISH
-#undef READ_RET
}
const char *WaitressErrorToStr (WaitressReturn_t wRet) {