Преглед на файлове

Restructure is_websocket_request (Step 2/?)

bel преди 9 години
родител
ревизия
db2bb5f08a
променени са 1 файла, в които са добавени 43 реда и са изтрити 34 реда
  1. 43 34
      src/civetweb.c

+ 43 - 34
src/civetweb.c

@@ -8268,7 +8268,36 @@ send_websocket_handshake(struct mg_connection *conn)
 	int truncated;
 	const char *websock_key = mg_get_header(conn, "Sec-WebSocket-Key");
 
-	mg_snprintf(conn, &truncated, buf, sizeof(buf), "%s%s", websock_key, magic);
+	if (websock_key) {
+		/* RFC standard version:
+		 * https://tools.ietf.org/html/rfc6455 */
+
+		/* Reply for Sec-WebSocket-Accept */
+		mg_snprintf(
+		    conn, &truncated, buf, sizeof(buf), "%s%s", websock_key, magic);
+
+	} 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 8 byte body data in a GET request */
+		conn->content_len = 8;
+		if ((!key1) || (!key2) || (8 != mg_read(conn, key3, 8))) {
+			return 0;
+		}
+	}
+
+	const char *host = mg_get_header(conn, "Host");
+	if (!host) {
+		return 0;
+	}
 
 	if (truncated) {
 		conn->must_close = 1;
@@ -8691,6 +8720,12 @@ is_websocket_protocol(const struct mg_connection *conn)
 {
 	const char *host, *upgrade, *connection, *version, *key;
 
+	/* A websocket protocoll has the following HTTP headers:
+	 *
+	 * Connection: Upgrade
+	 * Upgrade: Websocket
+	 */
+
 	upgrade = mg_get_header(conn, "Upgrade");
 	if (upgrade == NULL) {
 		return 0; /* fail early, don't waste time checking other header fields
@@ -8708,40 +8743,14 @@ is_websocket_protocol(const struct mg_connection *conn)
 		return 0;
 	}
 
-	host = mg_get_header(conn, "Host");
-	if (!host) {
-		return 0;
-	}
-
-	key = mg_get_header(conn, "Sec-WebSocket-Key");
-	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 = "";
-	}
+	/* The headers "Host", "Sec-WebSocket-Key", "Sec-WebSocket-Protocol" and
+	 * "Sec-WebSocket-Version" are also required.
+	 * Don't check them here, since even an unsupported websocket protocol
+	 * request still IS a websocket request (in contrast to a standard HTTP
+	 * request). It will fail later in the websocket handshake.
+	 */
 
-	return (version != NULL);
+	return 1;
 }
 #endif /* !USE_WEBSOCKET */