diff --git a/main/http.c b/main/http.c
index dcf90ae1c33de4662dd780d3769a060ac1bba366..e27f2ce5b08aa795490a781241428aeb1278e1ed 100644
--- a/main/http.c
+++ b/main/http.c
@@ -82,11 +82,18 @@
 
 /*! Maximum application/json or application/x-www-form-urlencoded body content length. */
 #if !defined(LOW_MEMORY)
-#define MAX_CONTENT_LENGTH 4096
+#define MAX_CONTENT_LENGTH 40960
 #else
 #define MAX_CONTENT_LENGTH 1024
 #endif	/* !defined(LOW_MEMORY) */
 
+/*! Initial response body length. */
+#if !defined(LOW_MEMORY)
+#define INITIAL_RESPONSE_BODY_BUFFER 1024
+#else
+#define INITIAL_RESPONSE_BODY_BUFFER 512
+#endif	/* !defined(LOW_MEMORY) */
+
 /*! Maximum line length for HTTP requests. */
 #if !defined(LOW_MEMORY)
 #define MAX_HTTP_LINE_LENGTH 4096
@@ -557,7 +564,7 @@ void ast_http_create_response(struct ast_tcptls_session_instance *ser, int statu
 {
 	char server_name[MAX_SERVER_NAME_LENGTH];
 	struct ast_str *server_address = ast_str_create(MAX_SERVER_NAME_LENGTH);
-	struct ast_str *out = ast_str_create(MAX_CONTENT_LENGTH);
+	struct ast_str *out = ast_str_create(INITIAL_RESPONSE_BODY_BUFFER);
 
 	if (!http_header_data || !server_address || !out) {
 		ast_free(http_header_data);
@@ -916,14 +923,24 @@ void ast_http_body_read_status(struct ast_tcptls_session_instance *ser, int read
 static int http_body_read_contents(struct ast_tcptls_session_instance *ser, char *buf, int length, const char *what_getting)
 {
 	int res;
+	int total = 0;
 
 	/* Stream is in exclusive mode so we get it all if possible. */
-	res = ast_iostream_read(ser->stream, buf, length);
-	if (res < length) {
-		ast_log(LOG_WARNING, "Short HTTP request %s (Wanted %d)\n",
-			what_getting, length);
+	while (total != length) {
+		res = ast_iostream_read(ser->stream, buf + total, length - total);
+		if (res <= 0) {
+			break;
+		}
+
+		total += res;
+	}
+
+	if (total != length) {
+		ast_log(LOG_WARNING, "Wrong HTTP content read. Request %s (Wanted %d, Read %d)\n",
+			what_getting, length, res);
 		return -1;
 	}
+
 	return 0;
 }