[asterisk-commits] dlee: branch dlee/ASTERISK-22486-reject-transfer-encoding r404552 - /team/dle...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Dec 23 17:05:25 CST 2013


Author: dlee
Date: Mon Dec 23 17:05:23 2013
New Revision: 404552

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=404552
Log:
http: Properly reject requests with Transfer-Encoding set

Modified:
    team/dlee/ASTERISK-22486-reject-transfer-encoding/main/http.c

Modified: team/dlee/ASTERISK-22486-reject-transfer-encoding/main/http.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ASTERISK-22486-reject-transfer-encoding/main/http.c?view=diff&rev=404552&r1=404551&r2=404552
==============================================================================
--- team/dlee/ASTERISK-22486-reject-transfer-encoding/main/http.c (original)
+++ team/dlee/ASTERISK-22486-reject-transfer-encoding/main/http.c Mon Dec 23 17:05:23 2013
@@ -648,6 +648,20 @@
 	return 0;
 }
 
+static const char *get_transfer_encoding(struct ast_variable *headers)
+{
+	struct ast_variable *v;
+
+	for (v = headers; v; v = v->next) {
+		if (!strcasecmp(v->name, "Transfer-Encoding")) {
+			return v->value;
+		}
+	}
+
+	/* Missing content length; assume zero */
+	return 0;
+}
+
 struct ast_json *ast_http_get_json(
 	struct ast_tcptls_session_instance *ser, struct ast_variable *headers)
 {
@@ -1068,6 +1082,7 @@
 	struct ast_variable *tail = headers;
 	char *uri, *method;
 	enum ast_http_method http_method = AST_HTTP_UNKNOWN;
+	const char *transfer_encoding;
 
 	if (ast_atomic_fetchadd_int(&session_count, +1) >= session_limit) {
 		goto done;
@@ -1138,6 +1153,22 @@
 			tail->next = ast_variable_new(name, value, __FILE__);
 			tail = tail->next;
 		}
+	}
+
+	transfer_encoding = get_transfer_encoding(headers);
+	/* Transfer encoding defaults to identity */
+	if (!transfer_encoding) {
+		transfer_encoding = "identity";
+	}
+
+	/*
+	 * RFC 2616, section 3.6, we should respond with a 501 for any transfer-
+	 * codings we don't understand.
+	 */
+	if (strcasecmp(transfer_encoding, "identity") != 0) {
+		/* Transfer encodings not supported */
+		ast_http_error(ser, 501, "Unimplemented", "Unsupported Transfer-Encoding.");
+		goto done;
 	}
 
 	if (!*uri) {




More information about the asterisk-commits mailing list