提交 7ea4acae authored 作者: Anthony Minessale's avatar Anthony Minessale

FS-6426 --resolve

上级 4e86b031
...@@ -467,7 +467,7 @@ int tport_ws_init_secondary(tport_t *self, int socket, int accepted, ...@@ -467,7 +467,7 @@ int tport_ws_init_secondary(tport_t *self, int socket, int accepted,
memset(&wstp->ws, 0, sizeof(wstp->ws)); memset(&wstp->ws, 0, sizeof(wstp->ws));
if (ws_init(&wstp->ws, socket, wstp->ws_secure ? wspri->ssl_ctx : NULL, 0) < 0) { if (ws_init(&wstp->ws, socket, wstp->ws_secure ? wspri->ssl_ctx : NULL, 0, 0) < 0) {
ws_destroy(&wstp->ws); ws_destroy(&wstp->ws);
wstp->ws_initialized = -1; wstp->ws_initialized = -1;
return *return_reason = "WS_INIT", -1; return *return_reason = "WS_INIT", -1;
......
...@@ -5,6 +5,12 @@ ...@@ -5,6 +5,12 @@
#include <fcntl.h> #include <fcntl.h>
#endif #endif
#ifndef _MSC_VER
#define ms_sleep(x) usleep( x * 1000);
#else
#define ms_sleep(x) Sleep( x );
#endif
#define SHA1_HASH_SIZE 20 #define SHA1_HASH_SIZE 20
struct ws_globals_s ws_globals; struct ws_globals_s ws_globals;
...@@ -418,38 +424,32 @@ static int restore_socket(ws_socket_t sock) ...@@ -418,38 +424,32 @@ static int restore_socket(ws_socket_t sock)
#endif #endif
static int establish_logical_layer(wsh_t *wsh)
int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock)
{ {
memset(wsh, 0, sizeof(*wsh));
wsh->sock = sock;
if (!ssl_ctx) { if (!wsh->sanity) {
ssl_ctx = ws_globals.ssl_ctx; return -1;
} }
if (close_sock) { if (wsh->logical_established) {
wsh->close_sock = 1; return 0;
} }
wsh->buflen = sizeof(wsh->buffer); if (wsh->secure && !wsh->secure_established) {
wsh->secure = ssl_ctx ? 1 : 0;
setup_socket(sock);
if (wsh->secure) {
int code; int code;
int sanity = 500;
wsh->ssl = SSL_new(ssl_ctx);
assert(wsh->ssl);
SSL_set_fd(wsh->ssl, wsh->sock); if (!wsh->ssl) {
wsh->ssl = SSL_new(wsh->ssl_ctx);
assert(wsh->ssl);
SSL_set_fd(wsh->ssl, wsh->sock);
}
do { do {
code = SSL_accept(wsh->ssl); code = SSL_accept(wsh->ssl);
if (code == 1) { if (code == 1) {
wsh->secure_established = 1;
break; break;
} }
...@@ -462,15 +462,22 @@ int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock) ...@@ -462,15 +462,22 @@ int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock)
return -1; return -1;
} }
} }
#ifndef _MSC_VER
usleep(10000); if (wsh->block) {
#else ms_sleep(10);
Sleep(10); } else {
#endif ms_sleep(1);
}
} while (--sanity > 0);
wsh->sanity--;
if (!wsh->block) {
return -2;
}
} while (wsh->sanity > 0);
if (!sanity) { if (!wsh->sanity) {
return -1; return -1;
} }
...@@ -483,6 +490,43 @@ int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock) ...@@ -483,6 +490,43 @@ int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock)
wsh->down = 1; wsh->down = 1;
return -1; return -1;
} }
if (!wsh->handshake && !wsh->block) {
return -2;
}
}
wsh->logical_established = 1;
return 0;
}
int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock, int block)
{
memset(wsh, 0, sizeof(*wsh));
wsh->sock = sock;
wsh->block = block;
wsh->sanity = 5000;
wsh->ssl_ctx = ssl_ctx;
if (!ssl_ctx) {
ssl_ctx = ws_globals.ssl_ctx;
}
if (close_sock) {
wsh->close_sock = 1;
}
wsh->buflen = sizeof(wsh->buffer);
wsh->secure = ssl_ctx ? 1 : 0;
setup_socket(sock);
if (establish_logical_layer(wsh) == -1) {
return -1;
} }
if (wsh->down) { if (wsh->down) {
...@@ -555,12 +599,19 @@ ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data) ...@@ -555,12 +599,19 @@ ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data)
ssize_t need = 2; ssize_t need = 2;
char *maskp; char *maskp;
int ll = 0;
again: again:
need = 2; need = 2;
maskp = NULL; maskp = NULL;
*data = NULL; *data = NULL;
ll = establish_logical_layer(wsh);
if (ll < 0) {
return ll;
}
if (wsh->down) { if (wsh->down) {
return -1; return -1;
} }
......
...@@ -83,6 +83,11 @@ typedef struct wsh_s { ...@@ -83,6 +83,11 @@ typedef struct wsh_s {
uint8_t down; uint8_t down;
int secure; int secure;
uint8_t close_sock; uint8_t close_sock;
SSL_CTX *ssl_ctx;
int block;
int sanity;
int secure_established;
int logical_established;
} wsh_t; } wsh_t;
ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc); ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc);
...@@ -93,7 +98,7 @@ ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes); ...@@ -93,7 +98,7 @@ ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes);
ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes); ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes);
ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data); ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data);
ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes); ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes);
int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock); int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx, int close_sock, int block);
ssize_t ws_close(wsh_t *wsh, int16_t reason); ssize_t ws_close(wsh_t *wsh, int16_t reason);
void ws_destroy(wsh_t *wsh); void ws_destroy(wsh_t *wsh);
void init_ssl(void); void init_ssl(void);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论