mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-06-02 19:40:08 +00:00
polish
This commit is contained in:
parent
81cd770a18
commit
fa8ccff7c3
@ -205,7 +205,7 @@ int tport_recv_stream_ws(tport_t *self)
|
|||||||
ws_opcode_t oc;
|
ws_opcode_t oc;
|
||||||
|
|
||||||
if ( !wstp->ws_initialized ) {
|
if ( !wstp->ws_initialized ) {
|
||||||
if (ws_init(ws, self->tp_socket, 65336, wstp->ws_secure ? wspri->ssl_ctx : NULL) == -2) {
|
if (ws_init(ws, self->tp_socket, 65336, wstp->ws_secure ? wspri->ssl_ctx : NULL, 0) == -2) {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
wstp->ws_initialized = 1;
|
wstp->ws_initialized = 1;
|
||||||
@ -266,13 +266,9 @@ ssize_t tport_send_stream_ws(tport_t const *self, msg_t *msg,
|
|||||||
ssize_t nerror;
|
ssize_t nerror;
|
||||||
tport_ws_t *wstp = (tport_ws_t *)self;
|
tport_ws_t *wstp = (tport_ws_t *)self;
|
||||||
wsh_t *ws = wstp->ws;
|
wsh_t *ws = wstp->ws;
|
||||||
char xbuf[65536] = "";
|
|
||||||
int blen = 0;
|
|
||||||
|
|
||||||
|
|
||||||
enum { WSBUFSIZE = 2048 };
|
enum { WSBUFSIZE = 2048 };
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < iovlen; i = j) {
|
for (i = 0; i < iovlen; i = j) {
|
||||||
char *buf = wstp->wstp_buffer;
|
char *buf = wstp->wstp_buffer;
|
||||||
unsigned wsbufsize = WSBUFSIZE;
|
unsigned wsbufsize = WSBUFSIZE;
|
||||||
@ -303,18 +299,9 @@ ssize_t tport_send_stream_ws(tport_t const *self, msg_t *msg,
|
|||||||
} else {
|
} else {
|
||||||
iov[j].siv_base = buf, iov[j].siv_len = m;
|
iov[j].siv_base = buf, iov[j].siv_len = m;
|
||||||
}
|
}
|
||||||
|
|
||||||
//* hacked to push to buffer
|
|
||||||
if (blen + m < sizeof(xbuf)) {
|
|
||||||
memcpy(xbuf+blen, buf, m);
|
|
||||||
nerror = m;
|
|
||||||
blen += m;
|
|
||||||
} else {
|
|
||||||
nerror = -1;
|
|
||||||
}
|
|
||||||
//*/
|
|
||||||
//nerror = ws_write_frame(ws, WSOC_TEXT, buf, m);
|
|
||||||
|
|
||||||
|
nerror = ws_feed_buf(ws, buf, m);
|
||||||
|
|
||||||
SU_DEBUG_9(("tport_ws_writevec: vec %p %p %lu ("MOD_ZD")\n",
|
SU_DEBUG_9(("tport_ws_writevec: vec %p %p %lu ("MOD_ZD")\n",
|
||||||
(void *)ws, (void *)iov[i].siv_base, (LU)iov[i].siv_len,
|
(void *)ws, (void *)iov[i].siv_base, (LU)iov[i].siv_len,
|
||||||
nerror));
|
nerror));
|
||||||
@ -335,11 +322,8 @@ ssize_t tport_send_stream_ws(tport_t const *self, msg_t *msg,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
//* hacked ....
|
ws_send_buf(ws, WSOC_TEXT);
|
||||||
if (size) {
|
|
||||||
size = ws_write_frame(ws, WSOC_TEXT, xbuf, blen);
|
|
||||||
}
|
|
||||||
//*/
|
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
@ -288,7 +288,7 @@ ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes)
|
|||||||
if (wsh->ssl) {
|
if (wsh->ssl) {
|
||||||
do {
|
do {
|
||||||
r = SSL_read(wsh->ssl, data, bytes);
|
r = SSL_read(wsh->ssl, data, bytes);
|
||||||
if (x++) {usleep(10000);
|
if (x++) usleep(10000);
|
||||||
} while (r == -1 && SSL_get_error(wsh->ssl, r) == SSL_ERROR_WANT_READ && x < 100);
|
} while (r == -1 && SSL_get_error(wsh->ssl, r) == SSL_ERROR_WANT_READ && x < 100);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
@ -296,12 +296,12 @@ ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes)
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
r = recv(wsh->sock, data, bytes, 0);
|
r = recv(wsh->sock, data, bytes, 0);
|
||||||
if (x++) {usleep(10000);
|
if (x++) usleep(10000);
|
||||||
} while (r == -1 && (errno == EAGAIN || errno == EINTR) && x < 100);
|
} while (r == -1 && (errno == EAGAIN || errno == EINTR) && x < 100);
|
||||||
|
|
||||||
if (r<0) {
|
//if (r<0) {
|
||||||
//printf("READ FAIL: %s\n", strerror(errno));
|
//printf("READ FAIL: %s\n", strerror(errno));
|
||||||
}
|
//}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
@ -322,18 +322,22 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
|
|||||||
r = send(wsh->sock, data, bytes, 0);
|
r = send(wsh->sock, data, bytes, 0);
|
||||||
} while (r == -1 && (errno == EAGAIN || errno == EINTR));
|
} while (r == -1 && (errno == EAGAIN || errno == EINTR));
|
||||||
|
|
||||||
if (r<0) {
|
//if (r<0) {
|
||||||
//printf("wRITE FAIL: %s\n", strerror(errno));
|
//printf("wRITE FAIL: %s\n", strerror(errno));
|
||||||
}
|
//}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ws_init(wsh_t *wsh, ws_socket_t sock, size_t buflen, SSL_CTX *ssl_ctx)
|
int ws_init(wsh_t *wsh, ws_socket_t sock, size_t buflen, SSL_CTX *ssl_ctx, int close_sock)
|
||||||
{
|
{
|
||||||
memset(wsh, 0, sizeof(*wsh));
|
memset(wsh, 0, sizeof(*wsh));
|
||||||
wsh->sock = sock;
|
wsh->sock = sock;
|
||||||
|
|
||||||
|
if (close_sock) {
|
||||||
|
wsh->close_sock = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (buflen > MAXLEN) {
|
if (buflen > MAXLEN) {
|
||||||
buflen = MAXLEN;
|
buflen = MAXLEN;
|
||||||
}
|
}
|
||||||
@ -396,7 +400,10 @@ ssize_t ws_close(wsh_t *wsh, int16_t reason)
|
|||||||
wsh->ssl = NULL;
|
wsh->ssl = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
//close(wsh->sock);
|
if (wsh->close_sock) {
|
||||||
|
close(wsh->sock);
|
||||||
|
}
|
||||||
|
|
||||||
wsh->sock = ws_sock_invalid;
|
wsh->sock = ws_sock_invalid;
|
||||||
|
|
||||||
if (wsh->buffer) {
|
if (wsh->buffer) {
|
||||||
@ -404,6 +411,11 @@ ssize_t ws_close(wsh_t *wsh, int16_t reason)
|
|||||||
wsh->buffer = NULL;
|
wsh->buffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wsh->wbuffer) {
|
||||||
|
free(wsh->wbuffer);
|
||||||
|
wsh->wbuffer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return reason * -1;
|
return reason * -1;
|
||||||
|
|
||||||
@ -560,6 +572,42 @@ ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ssize_t ws_feed_buf(wsh_t *wsh, void *data, size_t bytes)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (bytes + wsh->wdatalen > wsh->buflen) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!wsh->wbuffer) {
|
||||||
|
wsh->wbuffer = malloc(wsh->buflen);
|
||||||
|
assert(wsh->wbuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
memcpy(wsh->wbuffer + wsh->wdatalen, data, bytes);
|
||||||
|
|
||||||
|
wsh->wdatalen += bytes;
|
||||||
|
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc)
|
||||||
|
{
|
||||||
|
ssize_t r = 0;
|
||||||
|
|
||||||
|
if (!wsh->wdatalen) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = ws_write_frame(wsh, oc, wsh->wbuffer, wsh->wdatalen);
|
||||||
|
|
||||||
|
wsh->wdatalen = 0;
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
@ -53,8 +53,10 @@ typedef enum {
|
|||||||
typedef struct wsh_s {
|
typedef struct wsh_s {
|
||||||
ws_socket_t sock;
|
ws_socket_t sock;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
|
char *wbuffer;
|
||||||
size_t buflen;
|
size_t buflen;
|
||||||
ssize_t datalen;
|
ssize_t datalen;
|
||||||
|
ssize_t wdatalen;
|
||||||
char *payload;
|
char *payload;
|
||||||
ssize_t plen;
|
ssize_t plen;
|
||||||
ssize_t rplen;
|
ssize_t rplen;
|
||||||
@ -62,13 +64,19 @@ typedef struct wsh_s {
|
|||||||
int handshake;
|
int handshake;
|
||||||
uint8_t down;
|
uint8_t down;
|
||||||
int secure;
|
int secure;
|
||||||
|
unsigned close_sock:1;
|
||||||
|
unsigned :0;
|
||||||
} wsh_t;
|
} wsh_t;
|
||||||
|
|
||||||
|
ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc);
|
||||||
|
ssize_t ws_feed_buf(wsh_t *wsh, void *data, size_t bytes);
|
||||||
|
|
||||||
|
|
||||||
ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes);
|
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, size_t buflen, SSL_CTX *ssl_ctx);
|
int ws_init(wsh_t *wsh, ws_socket_t sock, size_t buflen, SSL_CTX *ssl_ctx, int close_sock);
|
||||||
ssize_t ws_close(wsh_t *wsh, int16_t reason);
|
ssize_t ws_close(wsh_t *wsh, int16_t reason);
|
||||||
void init_ssl(void);
|
void init_ssl(void);
|
||||||
void deinit_ssl(void);
|
void deinit_ssl(void);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user