[Asterisk-code-review] http.c: Support separated HTTP request (asterisk[13])

Joshua C. Colp asteriskteam at digium.com
Tue Feb 26 07:37:50 CST 2019


Joshua C. Colp has submitted this change and it was merged. ( https://gerrit.asterisk.org/11026 )

Change subject: http.c: Support separated HTTP request
......................................................................

http.c: Support separated HTTP request

Currently, the Asterisk does not support seperated HTTP request.
This patch make the Asterisk enables to wait lest part of HTTP request.
Also increases acceptable HTTP body length to 40k to support more
larger request.

ASTERISK-28236

Change-Id: I48a401aa64a21c3b37bf3cb4e0486d64b7dd8aa1
---
M main/http.c
1 file changed, 29 insertions(+), 11 deletions(-)

Approvals:
  Matthew Fredrickson: Looks good to me, but someone else must approve
  Joshua C. Colp: Looks good to me, approved; Approved for Submit



diff --git a/main/http.c b/main/http.c
index 136c916..cf2ff5e 100644
--- a/main/http.c
+++ b/main/http.c
@@ -84,11 +84,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
@@ -563,7 +570,7 @@
 {
 	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 @@
 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;
 }
 

-- 
To view, visit https://gerrit.asterisk.org/11026
To unsubscribe, or for help writing mail filters, visit https://gerrit.asterisk.org/settings

Gerrit-Project: asterisk
Gerrit-Branch: 13
Gerrit-MessageType: merged
Gerrit-Change-Id: I48a401aa64a21c3b37bf3cb4e0486d64b7dd8aa1
Gerrit-Change-Number: 11026
Gerrit-PatchSet: 1
Gerrit-Owner: sungtae kim <pchero21 at gmail.com>
Gerrit-Reviewer: Friendly Automation (1000185)
Gerrit-Reviewer: Joshua C. Colp <jcolp at digium.com>
Gerrit-Reviewer: Matthew Fredrickson <creslin at digium.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20190226/2a231cc6/attachment-0001.html>


More information about the asterisk-code-review mailing list