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