|  | @@ -100,6 +100,7 @@ wait_not_null(void *volatile *data)
 | 
	
		
			
				|  |  |  			return 1;
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +	ck_abort_msg("wait_not_null failed");
 | 
	
		
			
				|  |  |  	return 0;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -547,9 +548,6 @@ request_test_handler(struct mg_connection *conn, void *cbdata)
 | 
	
		
			
				|  |  |  static const char *websocket_welcome_msg = "websocket welcome\n";
 | 
	
		
			
				|  |  |  static const size_t websocket_welcome_msg_len =
 | 
	
		
			
				|  |  |      18 /* strlen(websocket_welcome_msg) */;
 | 
	
		
			
				|  |  | -static const char *websocket_acknowledge_msg = "websocket msg ok\n";
 | 
	
		
			
				|  |  | -static const size_t websocket_acknowledge_msg_len =
 | 
	
		
			
				|  |  | -    17 /* strlen(websocket_acknowledge_msg) */;
 | 
	
		
			
				|  |  |  static const char *websocket_goodbye_msg = "websocket bye\n";
 | 
	
		
			
				|  |  |  static const size_t websocket_goodbye_msg_len =
 | 
	
		
			
				|  |  |      14 /* strlen(websocket_goodbye_msg) */;
 | 
	
	
		
			
				|  | @@ -594,22 +592,29 @@ websock_server_data(struct mg_connection *conn,
 | 
	
		
			
				|  |  |  	ck_assert_ptr_eq((void *)udata, (void *)7531);
 | 
	
		
			
				|  |  |  	printf("Server: Got %u bytes from the client\n", (unsigned)data_len);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	if (data_len < 3 || 0 != memcmp(data, "bye", 3)) {
 | 
	
		
			
				|  |  | -		/* Send websocket acknowledge message */
 | 
	
		
			
				|  |  | -		mg_lock_connection(conn);
 | 
	
		
			
				|  |  | -		mg_websocket_write(conn,
 | 
	
		
			
				|  |  | -		                   WEBSOCKET_OPCODE_TEXT,
 | 
	
		
			
				|  |  | -		                   websocket_acknowledge_msg,
 | 
	
		
			
				|  |  | -		                   websocket_acknowledge_msg_len);
 | 
	
		
			
				|  |  | -		mg_unlock_connection(conn);
 | 
	
		
			
				|  |  | -	} else {
 | 
	
		
			
				|  |  | -		/* Send websocket acknowledge message */
 | 
	
		
			
				|  |  | +	if (data_len == 3 && !memcmp(data, "bye", 3)) {
 | 
	
		
			
				|  |  | +		/* Send websocket goodbye message */
 | 
	
		
			
				|  |  |  		mg_lock_connection(conn);
 | 
	
		
			
				|  |  |  		mg_websocket_write(conn,
 | 
	
		
			
				|  |  |  		                   WEBSOCKET_OPCODE_TEXT,
 | 
	
		
			
				|  |  |  		                   websocket_goodbye_msg,
 | 
	
		
			
				|  |  |  		                   websocket_goodbye_msg_len);
 | 
	
		
			
				|  |  |  		mg_unlock_connection(conn);
 | 
	
		
			
				|  |  | +	} else if (data_len == 5 && !memcmp(data, "data1", 5)) {
 | 
	
		
			
				|  |  | +		mg_lock_connection(conn);
 | 
	
		
			
				|  |  | +		mg_websocket_write(conn, WEBSOCKET_OPCODE_TEXT, "ok1", 3);
 | 
	
		
			
				|  |  | +		mg_unlock_connection(conn);
 | 
	
		
			
				|  |  | +	} else if (data_len == 5 && !memcmp(data, "data2", 5)) {
 | 
	
		
			
				|  |  | +		mg_lock_connection(conn);
 | 
	
		
			
				|  |  | +		mg_websocket_write(conn, WEBSOCKET_OPCODE_TEXT, "ok 2", 4);
 | 
	
		
			
				|  |  | +		mg_unlock_connection(conn);
 | 
	
		
			
				|  |  | +	} else if (data_len == 5 && !memcmp(data, "data3", 5)) {
 | 
	
		
			
				|  |  | +		mg_lock_connection(conn);
 | 
	
		
			
				|  |  | +		mg_websocket_write(conn, WEBSOCKET_OPCODE_TEXT, "ok - 3", 6);
 | 
	
		
			
				|  |  | +		mg_unlock_connection(conn);
 | 
	
		
			
				|  |  | +	} else {
 | 
	
		
			
				|  |  | +		ck_abort_msg("Got unexpected message from websocket client");
 | 
	
		
			
				|  |  | +		return 0;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	return 1; /* return 1 to keep the connetion open */
 | 
	
	
		
			
				|  | @@ -1105,7 +1110,10 @@ START_TEST(test_request_handlers)
 | 
	
		
			
				|  |  |  	ws_client1_data.data = NULL;
 | 
	
		
			
				|  |  |  	ws_client1_data.len = 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	mg_websocket_write(ws_client1_conn, WEBSOCKET_OPCODE_TEXT, "data1", 5);
 | 
	
		
			
				|  |  | +	mg_websocket_client_write(ws_client1_conn,
 | 
	
		
			
				|  |  | +	                          WEBSOCKET_OPCODE_TEXT,
 | 
	
		
			
				|  |  | +	                          "data1",
 | 
	
		
			
				|  |  | +	                          5);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	wait_not_null(
 | 
	
		
			
				|  |  |  	    &(ws_client1_data
 | 
	
	
		
			
				|  | @@ -1115,10 +1123,8 @@ START_TEST(test_request_handlers)
 | 
	
		
			
				|  |  |  	ck_assert(ws_client2_data.data == NULL);
 | 
	
		
			
				|  |  |  	ck_assert_uint_eq(ws_client2_data.len, 0);
 | 
	
		
			
				|  |  |  	ck_assert(ws_client1_data.data != NULL);
 | 
	
		
			
				|  |  | -	ck_assert_uint_eq(ws_client1_data.len, websocket_acknowledge_msg_len);
 | 
	
		
			
				|  |  | -	ck_assert(!memcmp(ws_client1_data.data,
 | 
	
		
			
				|  |  | -	                  websocket_acknowledge_msg,
 | 
	
		
			
				|  |  | -	                  websocket_acknowledge_msg_len));
 | 
	
		
			
				|  |  | +	ck_assert_uint_eq(ws_client1_data.len, 3);
 | 
	
		
			
				|  |  | +	ck_assert(!memcmp(ws_client1_data.data, "ok1", 3));
 | 
	
		
			
				|  |  |  	free(ws_client1_data.data);
 | 
	
		
			
				|  |  |  	ws_client1_data.data = NULL;
 | 
	
		
			
				|  |  |  	ws_client1_data.len = 0;
 | 
	
	
		
			
				|  | @@ -1166,7 +1172,10 @@ START_TEST(test_request_handlers)
 | 
	
		
			
				|  |  |  	ws_client2_data.data = NULL;
 | 
	
		
			
				|  |  |  	ws_client2_data.len = 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	mg_websocket_write(ws_client1_conn, WEBSOCKET_OPCODE_TEXT, "data2", 5);
 | 
	
		
			
				|  |  | +	mg_websocket_client_write(ws_client1_conn,
 | 
	
		
			
				|  |  | +	                          WEBSOCKET_OPCODE_TEXT,
 | 
	
		
			
				|  |  | +	                          "data2",
 | 
	
		
			
				|  |  | +	                          5);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	wait_not_null(
 | 
	
		
			
				|  |  |  	    &(ws_client1_data
 | 
	
	
		
			
				|  | @@ -1176,15 +1185,13 @@ START_TEST(test_request_handlers)
 | 
	
		
			
				|  |  |  	ck_assert(ws_client2_data.data == NULL);
 | 
	
		
			
				|  |  |  	ck_assert(ws_client2_data.len == 0);
 | 
	
		
			
				|  |  |  	ck_assert(ws_client1_data.data != NULL);
 | 
	
		
			
				|  |  | -	ck_assert(ws_client1_data.len == websocket_acknowledge_msg_len);
 | 
	
		
			
				|  |  | -	ck_assert(!memcmp(ws_client1_data.data,
 | 
	
		
			
				|  |  | -	                  websocket_acknowledge_msg,
 | 
	
		
			
				|  |  | -	                  websocket_acknowledge_msg_len));
 | 
	
		
			
				|  |  | +	ck_assert(ws_client1_data.len == 4);
 | 
	
		
			
				|  |  | +	ck_assert(!memcmp(ws_client1_data.data, "ok 2", 4));
 | 
	
		
			
				|  |  |  	free(ws_client1_data.data);
 | 
	
		
			
				|  |  |  	ws_client1_data.data = NULL;
 | 
	
		
			
				|  |  |  	ws_client1_data.len = 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	mg_websocket_write(ws_client1_conn, WEBSOCKET_OPCODE_TEXT, "bye", 3);
 | 
	
		
			
				|  |  | +	mg_websocket_client_write(ws_client1_conn, WEBSOCKET_OPCODE_TEXT, "bye", 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	wait_not_null(
 | 
	
		
			
				|  |  |  	    &(ws_client1_data.data)); /* Wait for the websocket goodbye message */
 | 
	
	
		
			
				|  | @@ -1211,7 +1218,7 @@ START_TEST(test_request_handlers)
 | 
	
		
			
				|  |  |  	ck_assert(ws_client2_data.data == NULL);
 | 
	
		
			
				|  |  |  	ck_assert(ws_client2_data.len == 0);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	mg_websocket_write(ws_client2_conn, WEBSOCKET_OPCODE_TEXT, "bye", 3);
 | 
	
		
			
				|  |  | +	mg_websocket_client_write(ws_client2_conn, WEBSOCKET_OPCODE_TEXT, "bye", 3);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	wait_not_null(
 | 
	
		
			
				|  |  |  	    &(ws_client2_data.data)); /* Wait for the websocket goodbye message */
 |