Преглед на файлове

Some fixes to chunked transfer encoding

bel преди 9 години
родител
ревизия
770fc35702
променени са 1 файла, в които са добавени 26 реда и са изтрити 9 реда
  1. 26 9
      src/civetweb.c

+ 26 - 9
src/civetweb.c

@@ -4151,7 +4151,14 @@ mg_read(struct mg_connection *conn, void *buf, size_t len)
 
 
 	if (conn->is_chunked) {
 	if (conn->is_chunked) {
 		size_t all_read = 0;
 		size_t all_read = 0;
+
 		while (len > 0) {
 		while (len > 0) {
+
+			if (conn->is_chunked == 2) {
+				/* No more data left to read */
+				return 0;
+			}
+
 			if (conn->chunk_remainder) {
 			if (conn->chunk_remainder) {
 				/* copy from the remainder of the last received chunk */
 				/* copy from the remainder of the last received chunk */
 				long read_ret;
 				long read_ret;
@@ -4191,6 +4198,10 @@ mg_read(struct mg_connection *conn, void *buf, size_t len)
 					if (i > 1 && lenbuf[i] == '\n' && lenbuf[i - 1] == '\r') {
 					if (i > 1 && lenbuf[i] == '\n' && lenbuf[i - 1] == '\r') {
 						lenbuf[i + 1] = 0;
 						lenbuf[i + 1] = 0;
 						chunkSize = strtoul(lenbuf, &end, 16);
 						chunkSize = strtoul(lenbuf, &end, 16);
+						if (chunkSize == 0) {
+							/* regular end of content */
+							conn->is_chunked = 2;
+						}
 						break;
 						break;
 					}
 					}
 					if (!isalnum(lenbuf[i])) {
 					if (!isalnum(lenbuf[i])) {
@@ -4202,13 +4213,11 @@ mg_read(struct mg_connection *conn, void *buf, size_t len)
 					/* chunksize not set correctly */
 					/* chunksize not set correctly */
 					return -1;
 					return -1;
 				}
 				}
-
-				conn->chunk_remainder = chunkSize;
 				if (chunkSize == 0) {
 				if (chunkSize == 0) {
-					/* regular end of content */
-					conn->is_chunked = 2;
 					break;
 					break;
 				}
 				}
+
+				conn->chunk_remainder = chunkSize;
 			}
 			}
 		}
 		}
 
 
@@ -5789,13 +5798,21 @@ static int
 mg_inet_pton(int af, const char *src, void *dst, size_t dstlen)
 mg_inet_pton(int af, const char *src, void *dst, size_t dstlen)
 {
 {
 	struct addrinfo hints, *res, *ressave;
 	struct addrinfo hints, *res, *ressave;
-	int ret = 0;
+	int func_ret = 0;
+	int gai_ret;
 
 
 	memset(&hints, 0, sizeof(struct addrinfo));
 	memset(&hints, 0, sizeof(struct addrinfo));
 	hints.ai_family = af;
 	hints.ai_family = af;
 
 
-	if (getaddrinfo(src, NULL, &hints, &res) != 0) {
-		/* bad src string or bad address family */
+	gai_ret = getaddrinfo(src, NULL, &hints, &res);
+	if (gai_ret != 0) {
+		/* gai_strerror could be used to convert gai_ret to a string */
+		/* POSIX return values: see
+		 * http://pubs.opengroup.org/onlinepubs/9699919799/functions/freeaddrinfo.html
+		 */
+		/* Windows return values: see
+		 * https://msdn.microsoft.com/en-us/library/windows/desktop/ms738520%28v=vs.85%29.aspx
+		 */
 		return 0;
 		return 0;
 	}
 	}
 
 
@@ -5804,13 +5821,13 @@ mg_inet_pton(int af, const char *src, void *dst, size_t dstlen)
 	while (res) {
 	while (res) {
 		if (dstlen >= res->ai_addrlen) {
 		if (dstlen >= res->ai_addrlen) {
 			memcpy(dst, res->ai_addr, res->ai_addrlen);
 			memcpy(dst, res->ai_addr, res->ai_addrlen);
-			ret = 1;
+			func_ret = 1;
 		}
 		}
 		res = res->ai_next;
 		res = res->ai_next;
 	}
 	}
 
 
 	freeaddrinfo(ressave);
 	freeaddrinfo(ressave);
-	return ret;
+	return func_ret;
 }
 }