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; }