This commit is contained in:
Anthony Minessale 2013-01-25 21:19:22 -06:00
parent 81cd770a18
commit fa8ccff7c3
3 changed files with 70 additions and 30 deletions

View File

@ -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;
} }

View File

@ -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)
{ {

View File

@ -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);