ws_opcode_t oc;
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;
}
wstp->ws_initialized = 1;
ssize_t nerror;
tport_ws_t *wstp = (tport_ws_t *)self;
wsh_t *ws = wstp->ws;
- char xbuf[65536] = "";
- int blen = 0;
-
enum { WSBUFSIZE = 2048 };
-
for (i = 0; i < iovlen; i = j) {
char *buf = wstp->wstp_buffer;
unsigned wsbufsize = WSBUFSIZE;
} else {
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",
(void *)ws, (void *)iov[i].siv_base, (LU)iov[i].siv_len,
nerror));
break;
}
- //* hacked ....
- if (size) {
- size = ws_write_frame(ws, WSOC_TEXT, xbuf, blen);
- }
- //*/
+ ws_send_buf(ws, WSOC_TEXT);
+
return size;
}
if (wsh->ssl) {
do {
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);
return r;
do {
r = recv(wsh->sock, data, bytes, 0);
- if (x++) {usleep(10000);
+ if (x++) usleep(10000);
} while (r == -1 && (errno == EAGAIN || errno == EINTR) && x < 100);
- if (r<0) {
+ //if (r<0) {
//printf("READ FAIL: %s\n", strerror(errno));
- }
+ //}
return r;
}
r = send(wsh->sock, data, bytes, 0);
} while (r == -1 && (errno == EAGAIN || errno == EINTR));
- if (r<0) {
+ //if (r<0) {
//printf("wRITE FAIL: %s\n", strerror(errno));
- }
+ //}
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));
wsh->sock = sock;
+ if (close_sock) {
+ wsh->close_sock = 1;
+ }
+
if (buflen > MAXLEN) {
buflen = MAXLEN;
}
wsh->ssl = NULL;
}
- //close(wsh->sock);
+ if (wsh->close_sock) {
+ close(wsh->sock);
+ }
+
wsh->sock = ws_sock_invalid;
if (wsh->buffer) {
wsh->buffer = NULL;
}
+ if (wsh->wbuffer) {
+ free(wsh->wbuffer);
+ wsh->wbuffer = NULL;
+ }
+
return reason * -1;
}
}
+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)
{
typedef struct wsh_s {
ws_socket_t sock;
char *buffer;
+ char *wbuffer;
size_t buflen;
ssize_t datalen;
+ ssize_t wdatalen;
char *payload;
ssize_t plen;
ssize_t rplen;
int handshake;
uint8_t down;
int secure;
+ unsigned close_sock:1;
+ unsigned :0;
} 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_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_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);
void init_ssl(void);
void deinit_ssl(void);