Commit Diff


commit - 04e4e99327c1aa645f591ea2a47ac2f4c13fe4c1
commit + 3b486b32233bf7e55e12e568e2c799990abf9e37
blob - 14d0338cf00535a9a279b66898aceaaa98565666
blob + 4122004350c48f4836092646efbd80ac564d455d
--- web/http.c
+++ web/http.c
@@ -66,8 +66,6 @@ http_parse(struct request *req, int fd)
 
 	memset(req, 0, sizeof(*req));
 
-	line = req->buf;
-
 	while (!done) {
 		if (req->len == sizeof(req->buf)) {
 			log_warnx("not enough space");
@@ -88,6 +86,7 @@ http_parse(struct request *req, int fd)
 		req->len += nr;
 
 		while ((endln = memmem(req->buf, req->len, "\r\n", 2))) {
+			line = req->buf;
 			if (endln == req->buf)
 				done = 1;
 
@@ -136,6 +135,8 @@ http_parse(struct request *req, int fd)
 			len = endln - req->buf + 2;
 			memmove(req->buf, req->buf + len, req->len - len);
 			req->len -= len;
+			if (done)
+				break;
 		}
 	}
 
@@ -155,6 +156,10 @@ http_read(struct request *req, int fd)
 {
 	size_t	 left;
 	ssize_t	 nr;
+
+	/* drop \r\n */
+	if (req->len > 2)
+		req->len -= 2;
 
 	if (req->clen > sizeof(req->buf) - 1)
 		return -1;
@@ -163,7 +168,8 @@ http_read(struct request *req, int fd)
 		return 0;
 	}
 	if (req->len > req->clen) {
-		log_warnx("got more data than what advertised!");
+		log_warnx("got more data than what advertised! (%zu vs %zu)",
+		    req->len, req->clen);
 		return -1;
 	}