Branch Coverage

Websockets.xs
Criterion Covered Total %
branch 558 1042 53.5


line true false branch
160 54 172 if (total > 0) {
165 54 0 if (n > 0) {
179 54 170 if (val && !hv_store(hv, name, nlen, val, 0))
0 54 if (val && !hv_store(hv, name, nlen, val, 0))
199 144 18 for (i = 0; i < N_REQUEST_HDRS; i++)
212 1 1 while ((entry = hv_iternext(hv))) {
218 0 1 if (klen >= 254) continue;
224 0 1 if (lws_add_http_header_by_name(wsi, (unsigned char *)kbuf,
244 24 255 if (--ctx->refcnt == 0) {
264 3 276 if (delay_ms < 1) delay_ms = 1;
275 5 0 if (ctx && ctx->magic == EV_WS_CTX_MAGIC && ctx->lws_ctx) {
5 0 if (ctx && ctx->magic == EV_WS_CTX_MAGIC && ctx->lws_ctx) {
5 0 if (ctx && ctx->magic == EV_WS_CTX_MAGIC && ctx->lws_ctx) {
291 5 0 if (alive)
293 5 0 if (alive) {
296 0 0 } else if (prev_flag) {
316 89 42 if (conn->perl_self) {
377 2 0 EMIT_BEGIN(conn, on_error);
0 2 EMIT_BEGIN(conn, on_error);
0 2 EMIT_BEGIN(conn, on_error);
0 2 EMIT_BEGIN(conn, on_error);
378 0 2 XPUSHs(sv_2mortal(newSVpv(error, 0)));
379 2 0 EMIT_END(conn, "error handler");
2 0 EMIT_END(conn, "error handler");
0 2 EMIT_END(conn, "error handler");
0 0 EMIT_END(conn, "error handler");
2 0 EMIT_END(conn, "error handler");
383 38 0 EMIT_BEGIN(conn, on_connect);
2 36 EMIT_BEGIN(conn, on_connect);
0 36 EMIT_BEGIN(conn, on_connect);
0 36 EMIT_BEGIN(conn, on_connect);
384 36 0 if (conn->response_headers)
385 0 36 XPUSHs(sv_2mortal(newRV_inc((SV*)conn->response_headers)));
387 0 0 XPUSHs(&PL_sv_undef);
388 36 0 EMIT_END(conn, "connect handler");
36 0 EMIT_END(conn, "connect handler");
1 35 EMIT_END(conn, "connect handler");
1 0 EMIT_END(conn, "connect handler");
36 0 EMIT_END(conn, "connect handler");
392 30 0 EMIT_BEGIN(conn, on_message);
0 30 EMIT_BEGIN(conn, on_message);
0 30 EMIT_BEGIN(conn, on_message);
0 30 EMIT_BEGIN(conn, on_message);
393 0 30 XPUSHs(sv_2mortal(newSVpvn(data, len)));
394 0 30 XPUSHs(sv_2mortal(newSViv(is_binary)));
395 0 30 XPUSHs(sv_2mortal(newSViv(is_final)));
396 30 0 EMIT_END(conn, "message handler");
30 0 EMIT_END(conn, "message handler");
0 30 EMIT_END(conn, "message handler");
0 0 EMIT_END(conn, "message handler");
30 0 EMIT_END(conn, "message handler");
409 31 255 while (conn) {
413 31 0 if (conn->magic == EV_WS_CONN_MAGIC && conn->recv_complete) {
30 1 if (conn->magic == EV_WS_CONN_MAGIC && conn->recv_complete) {
416 30 0 emit_message(conn, conn->recv_buf ? conn->recv_buf : "", conn->recv_len, conn->recv_is_binary, 1);
417 30 0 if (conn->magic == EV_WS_CONN_MAGIC) {
428 31 0 EMIT_BEGIN(conn, on_close);
0 31 EMIT_BEGIN(conn, on_close);
0 31 EMIT_BEGIN(conn, on_close);
0 31 EMIT_BEGIN(conn, on_close);
429 0 31 XPUSHs(sv_2mortal(newSViv(code)));
430 0 31 XPUSHs(reason ? sv_2mortal(newSVpv(reason, 0)) : &PL_sv_undef);
0 31 XPUSHs(reason ? sv_2mortal(newSVpv(reason, 0)) : &PL_sv_undef);
431 31 0 EMIT_END(conn, "close handler");
31 0 EMIT_END(conn, "close handler");
1 30 EMIT_END(conn, "close handler");
1 0 EMIT_END(conn, "close handler");
31 0 EMIT_END(conn, "close handler");
435 3 0 EMIT_BEGIN(conn, on_pong);
0 3 EMIT_BEGIN(conn, on_pong);
0 3 EMIT_BEGIN(conn, on_pong);
0 3 EMIT_BEGIN(conn, on_pong);
436 0 3 XPUSHs(sv_2mortal(newSVpvn(data ? data : "", len)));
3 0 XPUSHs(sv_2mortal(newSVpvn(data ? data : "", len)));
437 3 0 EMIT_END(conn, "pong handler");
3 0 EMIT_END(conn, "pong handler");
1 2 EMIT_END(conn, "pong handler");
1 0 EMIT_END(conn, "pong handler");
3 0 EMIT_END(conn, "pong handler");
441 33 0 EMIT_BEGIN(conn, on_drain);
32 1 EMIT_BEGIN(conn, on_drain);
0 1 EMIT_BEGIN(conn, on_drain);
0 1 EMIT_BEGIN(conn, on_drain);
442 1 0 EMIT_END(conn, "drain handler");
1 0 EMIT_END(conn, "drain handler");
1 0 EMIT_END(conn, "drain handler");
1 0 EMIT_END(conn, "drain handler");
1 0 EMIT_END(conn, "drain handler");
447 0 112 if (conn->connect_timer_active && conn->loop) {
0 0 if (conn->connect_timer_active && conn->loop) {
459 0 5 if (on_connect) SvREFCNT_dec(on_connect);
460 3 2 if (on_message) SvREFCNT_dec(on_message);
461 0 5 if (on_close) SvREFCNT_dec(on_close);
462 0 5 if (on_error) SvREFCNT_dec(on_error);
463 0 5 if (on_pong) SvREFCNT_dec(on_pong);
464 0 5 if (on_drain) SvREFCNT_dec(on_drain);
465 0 5 if (on_handshake) SvREFCNT_dec(on_handshake);
471 18 0 if (srv->on_connect) { SvREFCNT_dec(srv->on_connect); srv->on_connect = NULL; }
472 17 1 if (srv->on_message) { SvREFCNT_dec(srv->on_message); srv->on_message = NULL; }
473 17 1 if (srv->on_close) { SvREFCNT_dec(srv->on_close); srv->on_close = NULL; }
474 2 16 if (srv->on_error) { SvREFCNT_dec(srv->on_error); srv->on_error = NULL; }
475 1 17 if (srv->on_pong) { SvREFCNT_dec(srv->on_pong); srv->on_pong = NULL; }
476 0 18 if (srv->on_drain) { SvREFCNT_dec(srv->on_drain); srv->on_drain = NULL; }
477 0 18 if (srv->on_handshake) { SvREFCNT_dec(srv->on_handshake); srv->on_handshake = NULL; }
478 0 18 if (srv->response_headers) {
489 0 42 DEBUG_LOG("Freeing connection resources: conn=%p", conn);
493 38 4 if (conn->on_connect) { SvREFCNT_dec(conn->on_connect); conn->on_connect = NULL; }
494 32 10 if (conn->on_message) { SvREFCNT_dec(conn->on_message); conn->on_message = NULL; }
495 37 5 if (conn->on_close) { SvREFCNT_dec(conn->on_close); conn->on_close = NULL; }
496 26 16 if (conn->on_error) { SvREFCNT_dec(conn->on_error); conn->on_error = NULL; }
497 3 39 if (conn->on_pong) { SvREFCNT_dec(conn->on_pong); conn->on_pong = NULL; }
498 1 41 if (conn->on_drain) { SvREFCNT_dec(conn->on_drain); conn->on_drain = NULL; }
500 1 41 if (conn->custom_headers) {
505 38 4 if (conn->response_headers) {
510 1 41 if (conn->stash) { SvREFCNT_dec((SV*)conn->stash); conn->stash = NULL; }
512 1 41 if (conn->adopted_fh) { SvREFCNT_dec(conn->adopted_fh); conn->adopted_fh = NULL; }
514 27 15 if (conn->recv_buf) { Safefree(conn->recv_buf); conn->recv_buf = NULL; conn->recv_alloc = 0; }
516 0 42 for (send = conn->send_head; send != NULL; send = next_send) {
527 0 210 DEBUG_LOG("conn_ref: %p refcnt=%d", conn, conn->refcnt);
531 0 276 DEBUG_LOG("conn_unref: %p refcnt=%d", conn, conn->refcnt);
532 42 234 if (--conn->refcnt == 0) {
533 0 42 DEBUG_LOG("Actually freeing conn: %p", conn);
543 19 23 if (ctx->connections) {
550 0 32 if (conn->ctx == NULL) return;
552 13 19 if (conn->prev) {
557 5 27 if (conn->next) {
570 36 0 if (data && len > 0) {
36 0 if (data && len > 0) {
577 2 34 if (conn->send_tail) {
586 34 2 if (was_empty && conn->wsi) {
34 0 if (was_empty && conn->wsi) {
598 249 0 if (ctx == NULL || ctx->magic != EV_WS_CTX_MAGIC || ctx->lws_ctx == NULL) {
249 0 if (ctx == NULL || ctx->magic != EV_WS_CTX_MAGIC || ctx->lws_ctx == NULL) {
0 249 if (ctx == NULL || ctx->magic != EV_WS_CTX_MAGIC || ctx->lws_ctx == NULL) {
606 115 134 if (revents & EV_READ) pollfd.revents |= POLLIN;
607 143 106 if (revents & EV_WRITE) pollfd.revents |= POLLOUT;
608 0 249 if (revents & EV_ERROR) pollfd.revents |= POLLERR | POLLHUP;
616 249 0 if (alive)
618 249 0 if (alive) {
621 0 0 } else if (prev_flag) {
631 0 23 int new_size = ctx->fd_table_size ? ctx->fd_table_size : FD_TABLE_INIT_SIZE;
632 0 23 while (new_size <= needed) new_size *= 2;
642 0 60 if (fd < 0) return;
643 23 37 if (fd >= ctx->fd_table_size) fd_table_grow(ctx, fd);
646 0 60 if (fdw != NULL) {
656 60 0 if (events & POLLIN) ev_events |= EV_READ;
657 0 60 if (events & POLLOUT) ev_events |= EV_WRITE;
659 0 60 DEBUG_LOG("add_fd_watcher: fd=%d poll_events=%d ev_events=%d", fd, events, ev_events);
661 60 0 ev_io_init(&fdw->io, io_cb, fd, ev_events ? ev_events : EV_READ);
662 60 0 if (ev_events)
670 32 0 if (fd < 0 || fd >= ctx->fd_table_size) return;
0 32 if (fd < 0 || fd >= ctx->fd_table_size) return;
672 0 32 if (fdw == NULL) return;
683 0 393 if (fd < 0) return;
684 0 393 if (fd >= ctx->fd_table_size) {
689 0 393 if (fdw == NULL) {
696 382 11 if (events & POLLIN) ev_events |= EV_READ;
697 133 260 if (events & POLLOUT) ev_events |= EV_WRITE;
699 0 393 DEBUG_LOG("change_fd_watcher: fd=%d poll_events=%d ev_events=%d", fd, events, ev_events);
702 6 387 if (ev_events == 0) return;
709 1472 24 for (i = 0; i < ctx->fd_table_size; i++) {
711 28 1444 if (fdw) {
712 28 0 if (ctx->loop) ev_io_stop(ctx->loop, &fdw->io);
729 0 0 if (conn->magic == EV_WS_CONN_MAGIC && conn->wsi)
0 0 if (conn->magic == EV_WS_CONN_MAGIC && conn->wsi)
737 2190 0 struct lws_context* lws_ctx = wsi ? lws_get_context(wsi) : NULL;
738 2190 0 ev_ws_ctx_t* ctx = lws_ctx ? (ev_ws_ctx_t*)lws_context_user(lws_ctx) : NULL;
741 679 1511 if (!conn && wsi && pending_adoption) {
679 0 if (!conn && wsi && pending_adoption) {
1 678 if (!conn && wsi && pending_adoption) {
742 0 1 DEBUG_LOG("Associating pending adoption: conn=%p", pending_adoption);
745 1 0 if (!conn->wsi) conn->wsi = wsi;
748 2173 17 if (ctx && ctx->magic != EV_WS_CTX_MAGIC) {
221 1952 if (ctx && ctx->magic != EV_WS_CTX_MAGIC) {
750 193 28 if (reason != LWS_CALLBACK_WSI_DESTROY &&
150 43 if (reason != LWS_CALLBACK_WSI_DESTROY &&
756 0 2040 DEBUG_LOG("callback reason=%d user=%p ctx=%p wsi=%p conn=%p", (int)reason, user, ctx, wsi, conn);
762 0 60 DEBUG_LOG("ADD_POLL_FD: ctx=%p fd=%d events=%d", ctx, pa->fd, pa->events);
763 60 0 if (ctx && ctx->magic == EV_WS_CTX_MAGIC) {
60 0 if (ctx && ctx->magic == EV_WS_CTX_MAGIC) {
771 32 0 if (ctx && ctx->magic == EV_WS_CTX_MAGIC) {
32 0 if (ctx && ctx->magic == EV_WS_CTX_MAGIC) {
779 393 0 if (ctx && ctx->magic == EV_WS_CTX_MAGIC) {
393 0 if (ctx && ctx->magic == EV_WS_CTX_MAGIC) {
786 21 0 if (conn && conn->custom_headers) {
1 20 if (conn && conn->custom_headers) {
789 0 1 if (inject_headers(wsi, conn->custom_headers, p, end))
796 20 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
20 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
810 20 0 if (!conn->response_headers) conn->response_headers = newHV();
811 80 20 for (hi = 0; hi < (int)(sizeof(resp_hdrs)/sizeof(resp_hdrs[0])); hi++) {
821 18 0 ev_ws_server_t *srv = vh ? (ev_ws_server_t *)lws_get_vhost_user(vh) : NULL;
822 18 0 if (srv && srv->magic == EV_WS_SRV_MAGIC && srv->on_handshake) {
18 0 if (srv && srv->magic == EV_WS_SRV_MAGIC && srv->on_handshake) {
0 18 if (srv && srv->magic == EV_WS_SRV_MAGIC && srv->on_handshake) {
831 0 0 PUSHMARK(SP);
832 0 0 XPUSHs(sv_2mortal(newRV_noinc((SV*)hdrs)));
834 0 0 sv_setsv(ERRSV, &PL_sv_undef);
837 0 0 if (SvTRUE(ERRSV)) {
0 0 if (SvTRUE(ERRSV)) {
838 0 0 warn("EV::Websockets: exception in on_handshake: %s", SvPV_nolen(ERRSV));
839 0 0 if (count) POPs;
841 0 0 FREETMPS;
845 0 0 result = count ? POPs : &PL_sv_undef;
846 0 0 if (!SvTRUE(result)) {
848 0 0 FREETMPS;
852 0 0 if (SvROK(result) && SvTYPE(SvRV(result)) == SVt_PVHV) {
0 0 if (SvROK(result) && SvTYPE(SvRV(result)) == SVt_PVHV) {
856 0 0 if (!handshake_headers_map)
858 0 0 if (!hv_store(handshake_headers_map, key, klen, val, 0))
862 0 0 FREETMPS;
870 18 0 if (!conn) {
872 18 0 ev_ws_server_t *srv = vh ? (ev_ws_server_t *)lws_get_vhost_user(vh) : NULL;
873 18 0 if (ctx && srv && srv->magic == EV_WS_SRV_MAGIC) {
18 0 if (ctx && srv && srv->magic == EV_WS_SRV_MAGIC) {
18 0 if (ctx && srv && srv->magic == EV_WS_SRV_MAGIC) {
882 18 0 c->on_connect = srv->on_connect ? SvREFCNT_inc(srv->on_connect) : NULL;
883 16 2 c->on_message = srv->on_message ? SvREFCNT_inc(srv->on_message) : NULL;
884 18 0 c->on_close = srv->on_close ? SvREFCNT_inc(srv->on_close) : NULL;
885 2 16 c->on_error = srv->on_error ? SvREFCNT_inc(srv->on_error) : NULL;
886 1 17 c->on_pong = srv->on_pong ? SvREFCNT_inc(srv->on_pong) : NULL;
887 0 18 c->on_drain = srv->on_drain ? SvREFCNT_inc(srv->on_drain) : NULL;
898 38 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
38 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
899 0 38 DEBUG_LOG("Connected (reason %d): conn=%p", (int)reason, conn);
910 18 0 ev_ws_server_t *srv = vh ? (ev_ws_server_t *)lws_get_vhost_user(vh) : NULL;
911 18 0 if (srv && srv->magic == EV_WS_SRV_MAGIC && srv->response_headers)
18 0 if (srv && srv->magic == EV_WS_SRV_MAGIC && srv->response_headers)
0 18 if (srv && srv->magic == EV_WS_SRV_MAGIC && srv->response_headers)
914 0 18 if (handshake_headers_map) {
918 0 0 if (val && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV)
0 0 if (val && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV)
0 0 if (val && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV)
926 3 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
3 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
933 33 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
33 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
936 0 33 DEBUG_LOG("Received data (reason %d): len=%zu final=%d binary=%d", (int)reason, len, is_final, is_binary);
938 31 2 if (lws_is_first_fragment(wsi)) {
944 0 31 if (conn->recv_complete) {
946 0 0 emit_message(conn, conn->recv_buf ? conn->recv_buf : "", conn->recv_len, conn->recv_is_binary, 1);
947 0 0 if (conn->magic != EV_WS_CONN_MAGIC) { conn_unref(conn); break; }
956 3 30 if (conn->max_message_size > 0 && conn->recv_len + len > conn->max_message_size) {
1 2 if (conn->max_message_size > 0 && conn->recv_len + len > conn->max_message_size) {
959 1 0 if (conn->magic == EV_WS_CONN_MAGIC) {
971 28 4 if (conn->recv_len + len > conn->recv_alloc) {
972 0 28 size_t new_alloc = conn->recv_alloc ? conn->recv_alloc * 2 : 4096;
973 0 28 while (new_alloc < conn->recv_len + len) new_alloc *= 2;
974 2 26 if (conn->max_message_size > 0 && new_alloc > conn->max_message_size)
2 0 if (conn->max_message_size > 0 && new_alloc > conn->max_message_size)
979 32 0 if (len) /* guard: recv_buf may still be NULL for an empty frame */
991 31 1 if (!conn->on_flush) {
1002 69 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
69 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
1005 36 69 while (conn->send_head) {
1007 0 36 DEBUG_LOG("Writing data: len=%zu mode=%d", send->len, (int)send->write_mode);
1010 0 36 if (n < 0) {
1024 34 2 if (conn->send_head == NULL) {
1030 0 36 if (lws_send_pipe_choked(wsi)) {
1035 36 33 if (conn->closing && conn->send_head == NULL) {
36 0 if (conn->closing && conn->send_head == NULL) {
1036 0 36 DEBUG_LOG("Closing connection via writeable callback");
1039 33 0 if (conn->send_head == NULL) {
1046 0 1 DEBUG_LOG("CLIENT_CONNECTION_ERROR: conn=%p", conn);
1047 1 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
1 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
1048 1 0 const char* err = in ? (const char*)in : "connection error";
1066 0 31 DEBUG_LOG("CLOSED: conn=%p", conn);
1067 31 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
31 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
1073 0 31 if (in && len >= 2) {
0 0 if (in && len >= 2) {
1075 0 0 if (len > 2) {
1077 0 0 if (rlen > sizeof(reason_buf) - 1) rlen = sizeof(reason_buf) - 1;
1084 0 31 DEBUG_LOG("Emitting close: code=%d", close_code);
1095 0 31 if (conn->recv_complete) {
1096 0 0 emit_message(conn, conn->recv_buf ? conn->recv_buf : "", conn->recv_len, conn->recv_is_binary, 1);
1097 0 0 if (conn->magic == EV_WS_CONN_MAGIC) { conn->recv_len = 0; conn->recv_complete = 0; }
1099 31 0 if (conn->magic == EV_WS_CONN_MAGIC)
1107 43 0 struct lws_vhost *vh = wsi ? lws_get_vhost(wsi) : NULL;
1108 43 0 if (vh) {
1110 42 1 if (srv && (srv->magic == EV_WS_SRV_MAGIC || srv->magic == EV_WS_SRV_FREED)) {
24 18 if (srv && (srv->magic == EV_WS_SRV_MAGIC || srv->magic == EV_WS_SRV_FREED)) {
0 24 if (srv && (srv->magic == EV_WS_SRV_MAGIC || srv->magic == EV_WS_SRV_FREED)) {
1114 18 0 if (srv->magic == EV_WS_SRV_MAGIC)
1116 0 18 if (srv->protocol_name) Safefree(srv->protocol_name);
1124 0 60 if (handshake_headers_map) {
1129 0 60 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
0 0 if (conn && conn->magic == EV_WS_CONN_MAGIC) {
1130 0 0 DEBUG_LOG("WSI destroyed: conn=%p", conn);
1177 7 17 if (ssl_keepalive_ctx)
1193 0 20 I_EV_API("EV::Websockets");
20 0 I_EV_API("EV::Websockets");
0 20 I_EV_API("EV::Websockets");
1202 0 0 if (enable)
1240 24 0 if (ssl_init != 0) {
1248 24 0 if (proxy && strlen(proxy) > 0) {
0 24 if (proxy && strlen(proxy) > 0) {
1249 0 0 DEBUG_LOG("Context using proxy: %s:%d", proxy, proxy_port);
1254 24 0 if (ssl_cert && strlen(ssl_cert) > 0) {
0 24 if (ssl_cert && strlen(ssl_cert) > 0) {
1257 0 0 if (ssl_ca && strlen(ssl_ca) > 0)
0 0 if (ssl_ca && strlen(ssl_ca) > 0)
1261 0 24 DEBUG_LOG("Creating context (manual integration)");
1264 0 24 if (RETVAL->lws_ctx == NULL) {
1273 0 24 DEBUG_LOG("Context created successfully");
1285 0 24 if (self->magic != EV_WS_CTX_MAGIC) return;
1296 0 24 while (self->flush_head) {
1305 10 24 for (conn = self->connections; conn != NULL; conn = next) {
1310 10 0 if (conn->wsi) {
1318 24 0 if (self->lws_ctx) {
1324 0 24 if (self->alive_flag) *self->alive_flag = 0;
1351 25 0 double connect_timeout = 0;
1355 0 25 if (self->magic != EV_WS_CTX_MAGIC) {
1359 105 25 for (i = 1; i < items; i += 2) {
1360 0 105 if (i + 1 >= items) break;
1364 24 81 if (strcmp(key, "url") == 0) {
1366 0 81 } else if (strcmp(key, "protocol") == 0) {
1368 0 81 } else if (strcmp(key, "ssl_verify") == 0) {
1370 0 81 } else if (strcmp(key, "max_message_size") == 0) {
1372 0 81 } else if (strcmp(key, "connect_timeout") == 0) {
1374 1 80 } else if (strcmp(key, "headers") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
1 0 } else if (strcmp(key, "headers") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
1 0 } else if (strcmp(key, "headers") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
1376 19 61 } else if (strcmp(key, "on_connect") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
19 0 } else if (strcmp(key, "on_connect") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
19 0 } else if (strcmp(key, "on_connect") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1378 16 45 } else if (strcmp(key, "on_message") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
16 0 } else if (strcmp(key, "on_message") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
16 0 } else if (strcmp(key, "on_message") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1380 19 26 } else if (strcmp(key, "on_close") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
19 0 } else if (strcmp(key, "on_close") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
19 0 } else if (strcmp(key, "on_close") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1382 23 3 } else if (strcmp(key, "on_error") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
23 0 } else if (strcmp(key, "on_error") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
23 0 } else if (strcmp(key, "on_error") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1384 2 1 } else if (strcmp(key, "on_pong") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
2 0 } else if (strcmp(key, "on_pong") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
2 0 } else if (strcmp(key, "on_pong") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1386 1 0 } else if (strcmp(key, "on_drain") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1 0 } else if (strcmp(key, "on_drain") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1 0 } else if (strcmp(key, "on_drain") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1391 1 24 if (url == NULL) {
1399 0 24 if (strncasecmp(url_copy, "wss://", 6) == 0) {
1401 0 0 if (!ssl_verify) {
1408 23 1 } else if (strncasecmp(url_copy, "ws://", 5) == 0) {
1417 0 23 if (path_start) {
1428 0 23 if (host[0] == '[') {
1430 0 0 if (p) {
1434 0 0 if (*(p + 1) == ':') {
1440 0 0 if (hport && hport != (use_ssl ? 443 : 80))
0 0 if (hport && hport != (use_ssl ? 443 : 80))
0 0 if (hport && hport != (use_ssl ? 443 : 80))
1447 23 0 if (p) {
1472 0 23 ccinfo.host = host_header ? host_header : host;
1473 0 23 ccinfo.origin = host_header ? host_header : host;
1481 1 22 if (headers_hv) {
1491 0 23 if (RETVAL->wsi == NULL) {
1493 0 0 if (RETVAL->perl_self == NULL) {
1504 0 23 if (connect_timeout > 0) {
1532 19 0 const char *protocol_name = NULL;
1538 0 19 if (self->magic != EV_WS_CTX_MAGIC) {
1542 77 19 for (i = 1; i < items; i += 2) {
1543 0 77 if (i + 1 >= items) break;
1547 19 58 if (strcmp(key, "port") == 0) {
1549 1 57 } else if (strcmp(key, "name") == 0) {
1551 0 57 } else if (strcmp(key, "protocol") == 0) {
1553 0 57 } else if (strcmp(key, "ssl_cert") == 0) {
1555 0 57 } else if (strcmp(key, "ssl_key") == 0) {
1557 0 57 } else if (strcmp(key, "ssl_ca") == 0) {
1559 2 55 } else if (strcmp(key, "max_message_size") == 0) {
1561 0 55 } else if (strcmp(key, "headers") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
0 0 } else if (strcmp(key, "headers") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
0 0 } else if (strcmp(key, "headers") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
1563 18 37 } else if (strcmp(key, "on_connect") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
18 0 } else if (strcmp(key, "on_connect") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
18 0 } else if (strcmp(key, "on_connect") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1565 17 20 } else if (strcmp(key, "on_message") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
17 0 } else if (strcmp(key, "on_message") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
17 0 } else if (strcmp(key, "on_message") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1567 17 3 } else if (strcmp(key, "on_close") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
17 0 } else if (strcmp(key, "on_close") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
17 0 } else if (strcmp(key, "on_close") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1569 2 1 } else if (strcmp(key, "on_error") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
2 0 } else if (strcmp(key, "on_error") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
2 0 } else if (strcmp(key, "on_error") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1571 1 0 } else if (strcmp(key, "on_pong") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1 0 } else if (strcmp(key, "on_pong") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1 0 } else if (strcmp(key, "on_pong") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1573 0 0 } else if (strcmp(key, "on_drain") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
0 0 } else if (strcmp(key, "on_drain") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
0 0 } else if (strcmp(key, "on_drain") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1575 0 0 } else if (strcmp(key, "on_handshake") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
0 0 } else if (strcmp(key, "on_handshake") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
0 0 } else if (strcmp(key, "on_handshake") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1580 1 18 if (strcmp(name, "default") == 0) {
1595 0 18 if (headers_hv)
1598 0 18 if (protocol_name) {
1609 0 18 info.protocols = srv->protocol_name ? srv->vhost_protocols : protocols;
1614 0 18 if (ssl_cert && ssl_key) {
0 0 if (ssl_cert && ssl_key) {
1617 0 0 if (ssl_ca)
1624 0 18 if (vh == NULL) {
1626 0 0 if (srv->protocol_name) Safefree(srv->protocol_name);
1632 0 18 if (RETVAL <= 0) {
1643 0 18 DEBUG_LOG("Server listening on port %d", RETVAL);
1660 3 0 size_t max_message_size = 0;
1664 0 3 if (self->magic != EV_WS_CTX_MAGIC) {
1668 7 3 for (i = 1; i < items; i += 2) {
1669 0 7 if (i + 1 >= items) break;
1673 2 5 if (strcmp(key, "fh") == 0) {
1675 0 5 } else if (strcmp(key, "initial_data") == 0) {
1677 0 5 } else if (strcmp(key, "max_message_size") == 0) {
1679 1 4 } else if (strcmp(key, "on_connect") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1 0 } else if (strcmp(key, "on_connect") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1 0 } else if (strcmp(key, "on_connect") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1681 3 1 } else if (strcmp(key, "on_message") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
3 0 } else if (strcmp(key, "on_message") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
3 0 } else if (strcmp(key, "on_message") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1683 0 1 } else if (strcmp(key, "on_close") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
0 0 } else if (strcmp(key, "on_close") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
0 0 } else if (strcmp(key, "on_close") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1685 1 0 } else if (strcmp(key, "on_error") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1 0 } else if (strcmp(key, "on_error") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1 0 } else if (strcmp(key, "on_error") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1687 0 0 } else if (strcmp(key, "on_pong") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
0 0 } else if (strcmp(key, "on_pong") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
0 0 } else if (strcmp(key, "on_pong") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1689 0 0 } else if (strcmp(key, "on_drain") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
0 0 } else if (strcmp(key, "on_drain") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
0 0 } else if (strcmp(key, "on_drain") == 0 && SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVCV) {
1694 1 2 if (fh_sv == NULL) {
1700 2 0 PerlIO *ifp = io ? IoIFP(io) : NULL;
1701 1 1 if (!ifp || (fd = PerlIO_fileno(ifp)) < 0) {
0 1 if (!ifp || (fd = PerlIO_fileno(ifp)) < 0) {
1722 1 0 : SvREFCNT_inc(fh_sv);
1728 1 0 if (!vh) {
1737 0 1 if (!vh) {
1745 0 1 if (initial_data_sv && SvOK(initial_data_sv)) {
0 0 if (initial_data_sv && SvOK(initial_data_sv)) {
1756 0 1 if (RETVAL->wsi == NULL) {
1758 0 0 if (RETVAL->perl_self == NULL) {
1783 1 0 if (alive)
1785 1 0 if (alive) {
1788 0 0 } else if (prev_flag) {
1796 0 1 if (rejected)
1808 0 2 if (self->magic != EV_WS_CTX_MAGIC) XSRETURN_EMPTY;
1809 6 2 for (conn = self->connections; conn != NULL; conn = conn->next) {
1813 6 0 if (conn->magic == EV_WS_CONN_MAGIC && conn->connected) {
4 2 if (conn->magic == EV_WS_CONN_MAGIC && conn->connected) {
1814 0 4 XPUSHs(sv_2mortal(get_conn_sv(conn)));
1825 0 42 if (self->magic != EV_WS_CONN_MAGIC) return;
1827 0 42 DEBUG_LOG("Perl object DESTROY: self=%p wsi=%p", self, self->wsi);
1842 0 28 CHECK_CONN_OPEN(self);
28 0 CHECK_CONN_OPEN(self);
28 0 CHECK_CONN_OPEN(self);
0 28 CHECK_CONN_OPEN(self);
1843 1 27 CHECK_NOT_FRAGMENTING(self);
1856 0 4 CHECK_CONN_OPEN(self);
4 0 CHECK_CONN_OPEN(self);
4 0 CHECK_CONN_OPEN(self);
0 4 CHECK_CONN_OPEN(self);
1857 1 3 CHECK_NOT_FRAGMENTING(self);
1870 0 3 CHECK_CONN_OPEN(self);
3 0 CHECK_CONN_OPEN(self);
3 0 CHECK_CONN_OPEN(self);
0 3 CHECK_CONN_OPEN(self);
1872 3 0 if (data && SvOK(data)) {
3 0 if (data && SvOK(data)) {
1874 0 3 if (len > 125) len = 125; /* PING payload limit */
1885 2 0 if (self->magic == EV_WS_CONN_MAGIC && self->wsi)
2 0 if (self->magic == EV_WS_CONN_MAGIC && self->wsi)
1887 2 0 RETVAL = val ? val : newSV(0);
1899 2 0 if (self->magic == EV_WS_CONN_MAGIC && self->wsi) {
2 0 if (self->magic == EV_WS_CONN_MAGIC && self->wsi) {
1901 2 0 if (buf[0])
1915 0 1 CHECK_CONN_OPEN(self);
1 0 CHECK_CONN_OPEN(self);
1 0 CHECK_CONN_OPEN(self);
0 1 CHECK_CONN_OPEN(self);
1917 1 0 if (data && SvOK(data)) {
1 0 if (data && SvOK(data)) {
1919 0 1 if (len > 125) len = 125;
1929 1 0 if (self->magic == EV_WS_CONN_MAGIC && self->wsi && self->connected)
1 0 if (self->magic == EV_WS_CONN_MAGIC && self->wsi && self->connected)
1 0 if (self->magic == EV_WS_CONN_MAGIC && self->wsi && self->connected)
1937 1 0 if (self->magic == EV_WS_CONN_MAGIC && self->wsi && self->connected)
1 0 if (self->magic == EV_WS_CONN_MAGIC && self->wsi && self->connected)
1 0 if (self->magic == EV_WS_CONN_MAGIC && self->wsi && self->connected)
1945 0 21 if (self->magic != EV_WS_CONN_MAGIC) {
1948 20 1 if (!self->wsi || !self->connected || self->closing) {
20 0 if (!self->wsi || !self->connected || self->closing) {
1 19 if (!self->wsi || !self->connected || self->closing) {
1952 0 19 DEBUG_LOG("Closing connection: code=%d reason=%s", code, reason ? reason : "none");
0 0 DEBUG_LOG("Closing connection: code=%d reason=%s", code, reason ? reason : "none");
1953 0 19 if (self->in_fragmented_send) {
1958 6 13 lws_close_reason(self->wsi, (enum lws_close_status)code,
1968 6 0 RETVAL = (self->magic == EV_WS_CONN_MAGIC && self->wsi != NULL && self->connected) ? 1 : 0;
3 3 RETVAL = (self->magic == EV_WS_CONN_MAGIC && self->wsi != NULL && self->connected) ? 1 : 0;
2 1 RETVAL = (self->magic == EV_WS_CONN_MAGIC && self->wsi != NULL && self->connected) ? 1 : 0;
2 4 RETVAL = (self->magic == EV_WS_CONN_MAGIC && self->wsi != NULL && self->connected) ? 1 : 0;
1977 3 0 RETVAL = (self->magic == EV_WS_CONN_MAGIC && self->wsi != NULL && !self->connected && !self->closing) ? 1 : 0;
3 0 RETVAL = (self->magic == EV_WS_CONN_MAGIC && self->wsi != NULL && !self->connected && !self->closing) ? 1 : 0;
2 1 RETVAL = (self->magic == EV_WS_CONN_MAGIC && self->wsi != NULL && !self->connected && !self->closing) ? 1 : 0;
2 0 RETVAL = (self->magic == EV_WS_CONN_MAGIC && self->wsi != NULL && !self->connected && !self->closing) ? 1 : 0;
0 3 RETVAL = (self->magic == EV_WS_CONN_MAGIC && self->wsi != NULL && !self->connected && !self->closing) ? 1 : 0;
1986 0 8 if (self->magic != EV_WS_CONN_MAGIC) RETVAL = "destroyed";
1987 3 5 else if (!self->wsi) RETVAL = "closed";
1988 0 5 else if (self->closing) RETVAL = "closing";
1989 2 3 else if (self->connected) RETVAL = "connected";
1999 0 0 RETVAL = (self->magic == EV_WS_CONN_MAGIC) ? (UV)self->send_queue_bytes : 0;
0 0 RETVAL = (self->magic == EV_WS_CONN_MAGIC) ? (UV)self->send_queue_bytes : 0;
2012 0 2 CHECK_CONN_OPEN(self);
2 0 CHECK_CONN_OPEN(self);
2 0 CHECK_CONN_OPEN(self);
0 2 CHECK_CONN_OPEN(self);
2016 1 1 if (!self->in_fragmented_send) {
2018 1 0 if (!is_final) {
2024 0 1 if (!is_final) {
2038 0 2 if (self->magic != EV_WS_CONN_MAGIC)
2040 1 1 if (!self->stash)