瀏覽代碼

Merge pull request #174 from vcatechnology/websockets

Websocket support for CI build, some pointer casts
bel2125 10 年之前
父節點
當前提交
49216730d3
共有 3 個文件被更改,包括 17 次插入14 次删除
  1. 7 4
      .travis.yml
  2. 1 1
      appveyor.yml
  3. 9 9
      src/civetweb.c

+ 7 - 4
.travis.yml

@@ -1,8 +1,6 @@
 language: c
 
-# This should be false to support container based building but the apt addons
-# don't seem to work right now
-sudo: required
+sudo: false
 
 compiler:
   - gcc
@@ -17,7 +15,7 @@ env:
     - BUILD_TYPE=Coverage
     - ENABLE_SSL=YES
     - ENABLE_SSL_DYNAMIC_LOADING=YES
-    - ENABLE_WEBSOCKETS=NO
+    - ENABLE_WEBSOCKETS=YES
     - ENABLE_CXX=NO
     - ENABLE_IPV6=NO
     - ENABLE_LUA=NO
@@ -52,6 +50,7 @@ before_script:
   - cmake --version
   - cmake
     -G "Unix Makefiles"
+    "-DCIVETWEB_THIRD_PARTY_DIR=${HOME}/third-party"
     -DCMAKE_BUILD_TYPE=${BUILD_TYPE}
     -DBUILD_SHARED_LIBS=${BUILD_SHARED}
     -DCIVETWEB_ENABLE_SSL=${ENABLE_SSL}
@@ -65,6 +64,10 @@ before_script:
     -DCIVETWEB_CXX_STANDARD=${CXX_STANDARD}
     ..
 
+cache:
+  directories:
+  - $HOME/third-party
+
 matrix:
   - fast_finish: true
 

+ 1 - 1
appveyor.yml

@@ -10,7 +10,7 @@ platform:
 environment:
   enable_ssl: YES
   enable_ssl_dynamic_loading: YES
-  enable_websockets: NO
+  enable_websockets: YES
   enable_cxx: NO
   enable_ipv6: NO
   enable_lua: NO

+ 9 - 9
src/civetweb.c

@@ -7096,7 +7096,7 @@ static void read_websocket(struct mg_connection *conn,
 	 * len is the length of the current message
 	 * data_len is the length of the current message's data payload
 	 * header_len is the length of the current message's header */
-	size_t i, len, mask_len, data_len, header_len, body_len;
+	size_t i, len, mask_len = 0, data_len = 0, header_len, body_len;
 
 	/* "The masking key is a 32-bit value chosen at random by the client."
 	 * http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5
@@ -7125,7 +7125,7 @@ static void read_websocket(struct mg_connection *conn,
 	while (!conn->ctx->stop_flag) {
 		header_len = 0;
 		assert(conn->data_len >= conn->request_len);
-		if ((body_len = conn->data_len - conn->request_len) >= 2) {
+		if ((body_len = (size_t)(conn->data_len - conn->request_len)) >= 2) {
 			len = buf[1] & 127;
 			mask_len = buf[1] & 128 ? 4 : 0;
 			if (len < 126 && body_len >= mask_len) {
@@ -7133,11 +7133,11 @@ static void read_websocket(struct mg_connection *conn,
 				header_len = 2 + mask_len;
 			} else if (len == 126 && body_len >= 4 + mask_len) {
 				header_len = 4 + mask_len;
-				data_len = ((((int)buf[2]) << 8) + buf[3]);
+				data_len = ((((size_t)buf[2]) << 8) + buf[3]);
 			} else if (body_len >= 10 + mask_len) {
 				header_len = 10 + mask_len;
-				data_len = (((uint64_t)ntohl(*(uint32_t *)&buf[2])) << 32) +
-				           ntohl(*(uint32_t *)&buf[6]);
+				data_len = (((uint64_t)ntohl(*(uint32_t *)(void *)&buf[2])) << 32) +
+				           ntohl(*(uint32_t *)(void *)&buf[6]);
 			}
 		}
 
@@ -7177,7 +7177,7 @@ static void read_websocket(struct mg_connection *conn,
 						error = 1;
 						break;
 					}
-					len += n;
+					len += (size_t)n;
 				}
 				if (error) {
 					mg_cry(conn, "Websocket pull failed; closing connection");
@@ -7266,13 +7266,13 @@ int mg_websocket_write(struct mg_connection *conn,
 	} else if (dataLen <= 0xFFFF) {
 		/* 16-bit length field */
 		header[1] = 126;
-		*(uint16_t *)(header + 2) = htons((uint16_t)dataLen);
+		*(uint16_t *)(void *)(header + 2) = htons((uint16_t)dataLen);
 		headerLen = 4;
 	} else {
 		/* 64-bit length field */
 		header[1] = 127;
-		*(uint32_t *)(header + 2) = htonl((uint64_t)dataLen >> 32);
-		*(uint32_t *)(header + 6) = htonl(dataLen & 0xFFFFFFFF);
+		*(uint32_t *)(void *)(header + 2) = htonl((uint64_t)dataLen >> 32);
+		*(uint32_t *)(void *)(header + 6) = htonl(dataLen & 0xFFFFFFFF);
 		headerLen = 10;
 	}