瀏覽代碼

Restructure is_websocket_request (Step 1/?)

bel 9 年之前
父節點
當前提交
c3c4634675
共有 1 個文件被更改,包括 34 次插入10 次删除
  1. 34 10
      src/civetweb.c

+ 34 - 10
src/civetweb.c

@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2015 the Civetweb developers
+/* Copyright (c) 2013-2016 the Civetweb developers
  * Copyright (c) 2004-2013 Sergey Lyubka
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -8266,14 +8266,9 @@ send_websocket_handshake(struct mg_connection *conn)
 	char buf[100], sha[20], b64_sha[sizeof(sha) * 2];
 	SHA1_CTX sha_ctx;
 	int truncated;
+	const char *websock_key = mg_get_header(conn, "Sec-WebSocket-Key");
 
-	mg_snprintf(conn,
-	            &truncated,
-	            buf,
-	            sizeof(buf),
-	            "%s%s",
-	            mg_get_header(conn, "Sec-WebSocket-Key"),
-	            magic);
+	mg_snprintf(conn, &truncated, buf, sizeof(buf), "%s%s", websock_key, magic);
 
 	if (truncated) {
 		conn->must_close = 1;
@@ -8714,10 +8709,39 @@ is_websocket_protocol(const struct mg_connection *conn)
 	}
 
 	host = mg_get_header(conn, "Host");
+	if (!host) {
+		return 0;
+	}
+
 	key = mg_get_header(conn, "Sec-WebSocket-Key");
-	version = mg_get_header(conn, "Sec-WebSocket-Version");
+	if (key) {
+		/* RFC standard version:
+		 * https://tools.ietf.org/html/rfc6455 */
+		version = mg_get_header(conn, "Sec-WebSocket-Version");
+	} else {
+		/* hixie draft version:
+		 * http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76 */
+		const char *key1 = mg_get_header(conn, "Sec-WebSocket-Key1");
+		const char *key2 = mg_get_header(conn, "Sec-WebSocket-Key2");
+		char key3[8];
+
+		if ((!key1) || (!key2)) {
+			return 0;
+		}
+
+		/* This version uses data in a GET request */
+
+		/* can not assign to const conn ...
+		conn->content_len = 8;
+		if ((!key1) || (!key2) || (8 != mg_read(conn, key3, 8))) {
+		    return 0;
+		}
+		*/
+
+		version = "";
+	}
 
-	return (host != NULL && key != NULL && version != NULL);
+	return (version != NULL);
 }
 #endif /* !USE_WEBSOCKET */