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.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/libwaitress/waitress.c b/src/libwaitress/waitress.c
index 4179685..0c52f06 100644
--- a/src/libwaitress/waitress.c
+++ b/src/libwaitress/waitress.c
@@ -43,6 +43,8 @@ THE SOFTWARE.
#include "config.h"
#include "waitress.h"
+#define streq(a,b) (strcmp(a,b) == 0)
+
typedef struct {
char *buf;
size_t pos;
@@ -496,6 +498,15 @@ static const char *WaitressDefaultPort (WaitressUrl_t *url) {
return url->port == NULL ? "80" : url->port;
}
+/* handle http header
+ */
+static void WaitressHandleHeader (WaitressHandle_t *waith, const char * const key,
+ const char * const value) {
+ if (streq (key, "Content-Length")) {
+ waith->contentLength = atol (value);
+ }
+}
+
/* Receive data from host and call *callback ()
* @param waitress handle
* @return WaitressReturn_t
@@ -512,7 +523,7 @@ WaitressReturn_t WaitressFetchCall (WaitressHandle_t *waith) {
/* header parser vars */
char *nextLine = NULL, *thisLine = NULL;
enum {HDRM_HEAD, HDRM_LINES, HDRM_FINISHED} hdrParseMode = HDRM_HEAD;
- char statusCode[3], val[256];
+ char statusCode[3];
unsigned int bufFilled = 0;
/* initialize */
@@ -669,9 +680,16 @@ WaitressReturn_t WaitressFetchCall (WaitressHandle_t *waith) {
if (*thisLine == '\0') {
hdrParseMode = HDRM_FINISHED;
} else {
- memset (val, 0, sizeof (val));
- if (sscanf (thisLine, "Content-Length: %255c", val) == 1) {
- waith->contentLength = atol (val);
+ /* parse header: "key: value", ignore invalid lines */
+ char *key = thisLine, *val;
+
+ val = strchr (thisLine, ':');
+ if (val != NULL) {
+ *val++ = '\0';
+ while (*val != '\0' && isspace ((unsigned char) *val)) {
+ ++val;
+ }
+ WaitressHandleHeader (waith, key, val);
}
}
break;