diff --git a/main/http.c b/main/http.c
index 136c916814d0c472a20e22c6aff8af9c393a6f8b..cf2ff5e3f51b9c5a94428520eff7d62bd1bb0140 100644
--- a/main/http.c
+++ b/main/http.c
@@ -84,11 +84,18 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
 /*! 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
@@ -563,7 +570,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);
@@ -922,19 +929,30 @@ 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;
 
-	/*
-	 * NOTE: Because ser->f is a non-standard FILE *, fread() does not behave as
-	 * documented.
-	 */
+	/* Stream is in exclusive mode so we get it all if possible. */
+	while (total != length) {
+		/*
+		 * NOTE: Because ser->f is a non-standard FILE *, fread() does not behave as
+		 * documented.
+		 */
 
-	/* Stay in fread until get all the expected data or timeout. */
-	res = fread(buf, length, 1, ser->f);
-	if (res < 1) {
-		ast_log(LOG_WARNING, "Short HTTP request %s (Wanted %d)\n",
-			what_getting, length);
+		/* Stay in fread until get all the expected data or timeout. */
+		res = fread(buf + total, length - total, 1, ser->f);
+		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;
 }