Branch Coverage

Redis.xs
Criterion Covered Total %
branch 54 724 7.4


line true false branch
106 0 0 if (c == 'u' || c == 'U') return (0 == strcasecmp(cmd, "unsubscribe"));
0 0 if (c == 'u' || c == 'U') return (0 == strcasecmp(cmd, "unsubscribe"));
107 0 0 if (c == 'p' || c == 'P') return (0 == strcasecmp(cmd, "punsubscribe"));
0 0 if (c == 'p' || c == 'P') return (0 == strcasecmp(cmd, "punsubscribe"));
108 0 0 if (c == 's' || c == 'S') return (0 == strcasecmp(cmd, "sunsubscribe"));
0 0 if (c == 's' || c == 'S') return (0 == strcasecmp(cmd, "sunsubscribe"));
115 0 0 if (c == 's' || c == 'S') {
0 0 if (c == 's' || c == 'S') {
116 0 0 if (0 == strcasecmp(cmd, "subscribe")) return 1;
117 0 0 if (0 == strcasecmp(cmd, "ssubscribe")) return 1;
118 0 0 if (0 == strcasecmp(cmd, "sunsubscribe")) return 1;
121 0 0 if (c == 'u' || c == 'U') {
0 0 if (c == 'u' || c == 'U') {
124 0 0 if (c == 'p' || c == 'P') {
0 0 if (c == 'p' || c == 'P') {
125 0 0 if (0 == strcasecmp(cmd, "psubscribe")) return 1;
126 0 0 if (0 == strcasecmp(cmd, "punsubscribe")) return 1;
129 0 0 if (c == 'm' || c == 'M') {
0 0 if (c == 'm' || c == 'M') {
142 0 0 if (reply->type != REDIS_REPLY_ARRAY && reply->type != REDIS_REPLY_PUSH) return 0;
0 0 if (reply->type != REDIS_REPLY_ARRAY && reply->type != REDIS_REPLY_PUSH) return 0;
143 0 0 if (reply->elements < 3) return 0;
144 0 0 if (NULL == reply->element[0]) return 0;
145 0 0 if (reply->element[0]->type != REDIS_REPLY_STRING &&
146 0 0 reply->element[0]->type != REDIS_REPLY_STATUS) return 0;
149 0 0 if (s[0] == 'u' || s[0] == 'U') return (0 == strcasecmp(s, "unsubscribe"));
0 0 if (s[0] == 'u' || s[0] == 'U') return (0 == strcasecmp(s, "unsubscribe"));
150 0 0 if (s[0] == 'p' || s[0] == 'P') return (0 == strcasecmp(s, "punsubscribe"));
0 0 if (s[0] == 'p' || s[0] == 'P') return (0 == strcasecmp(s, "punsubscribe"));
151 0 0 if (s[0] == 's' || s[0] == 'S') return (0 == strcasecmp(s, "sunsubscribe"));
0 0 if (s[0] == 's' || s[0] == 'S') return (0 == strcasecmp(s, "sunsubscribe"));
156 0 0 if (NULL == self->error_handler) return;
163 0 0 PUSHMARK(SP);
164 0 0 XPUSHs(error);
168 0 0 if (SvTRUE(ERRSV)) {
0 0 if (SvTRUE(ERRSV)) {
169 0 0 warn("EV::Redis: exception in error handler: %s", SvPV_nolen(ERRSV));
172 0 0 FREETMPS;
177 0 0 if (NULL == self->error_handler) return;
185 0 0 PUSHMARK(SP);
186 0 0 EXTEND(SP, 2);
191 0 0 if (SvTRUE(ERRSV)) {
0 0 if (SvTRUE(ERRSV)) {
192 0 0 warn("EV::Redis: exception in command callback: %s", SvPV_nolen(ERRSV));
194 0 0 FREETMPS;
202 0 0 if (self->magic == EV_REDIS_FREED &&
203 0 0 self->callback_depth == 0 &&
204 0 0 self->current_cb == NULL) {
213 0 6 if (NULL != self->host) { Safefree(self->host); self->host = NULL; }
214 0 6 if (NULL != self->path) { Safefree(self->path); self->path = NULL; }
215 0 6 if (NULL != self->source_addr) { Safefree(self->source_addr); self->source_addr = NULL; }
216 0 6 if (NULL != self->connect_timeout) { Safefree(self->connect_timeout); self->connect_timeout = NULL; }
217 0 6 if (NULL != self->command_timeout) { Safefree(self->command_timeout); self->command_timeout = NULL; }
219 2 4 if (NULL != self->ssl_ctx) { redisFreeSSLContext(self->ssl_ctx); self->ssl_ctx = NULL; }
224 0 6 if (self->waiting_timer_active && NULL != self->loop && !PL_dirty) {
0 0 if (self->waiting_timer_active && NULL != self->loop && !PL_dirty) {
0 0 if (self->waiting_timer_active && NULL != self->loop && !PL_dirty) {
231 0 6 if (self->reconnect_timer_active && NULL != self->loop && !PL_dirty) {
0 0 if (self->reconnect_timer_active && NULL != self->loop && !PL_dirty) {
0 0 if (self->reconnect_timer_active && NULL != self->loop && !PL_dirty) {
241 0 0 if (ms < 0) croak("%s must be non-negative", name);
242 0 0 if (ms > MAX_TIMEOUT_MS) croak("%s too large (max %d ms)", name, MAX_TIMEOUT_MS);
246 0 0 if (NULL != timeout_ms && SvOK(timeout_ms)) {
0 0 if (NULL != timeout_ms && SvOK(timeout_ms)) {
249 0 0 if (NULL == *tv_ptr) {
256 0 0 if (NULL != *tv_ptr) {
268 0 6 if (NULL != *handler_ptr) {
274 6 0 if (has_handler_arg && NULL != handler && SvOK(handler) && SvROK(handler) &&
6 0 if (has_handler_arg && NULL != handler && SvOK(handler) && SvROK(handler) &&
6 0 if (has_handler_arg && NULL != handler && SvOK(handler) && SvROK(handler) &&
6 0 if (has_handler_arg && NULL != handler && SvOK(handler) && SvROK(handler) &&
275 6 0 SvTYPE(SvRV(handler)) == SVt_PVCV) {
281 6 0 : &PL_sv_undef;
290 0 6 if (self->in_cb_cleanup) {
299 0 6 while (!ngx_queue_empty(&self->cb_queue)) {
303 0 0 if (cbt == self->current_cb) {
305 0 0 if (ngx_queue_next(q) == ngx_queue_sentinel(&self->cb_queue)) {
314 0 0 if (!cbt->persist) self->pending_count--;
316 0 0 if (NULL != cbt->cb) {
317 0 0 if (NULL != error_sv) {
330 0 0 for (i = 0; i < wt->argc; i++) {
335 0 0 if (NULL != wt->cb) {
346 0 6 if (self->in_wait_cleanup) {
354 0 6 while (!ngx_queue_empty(&self->wait_queue)) {
360 0 0 if (NULL != error_sv && NULL != wt->cb) {
0 0 if (NULL != error_sv && NULL != wt->cb) {
384 0 0 if (NULL != self->host) {
388 0 0 if (NULL != self->path) {
400 0 0 if (NULL == self || self->magic != EV_REDIS_MAGIC) return;
0 0 if (NULL == self || self->magic != EV_REDIS_MAGIC) return;
406 0 0 if (check_destroyed(self)) return;
412 0 0 if (!self->reconnect) return;
413 0 0 if (self->intentional_disconnect) return;
414 0 0 if (NULL == self->loop) return;
416 0 0 if (self->max_reconnect_attempts > 0 &&
417 0 0 self->reconnect_attempts >= self->max_reconnect_attempts) {
451 0 0 while (!ngx_queue_empty(&self->wait_queue)) {
455 0 0 if (now - wt->queued_at >= timeout) {
459 0 0 if (NULL != wt->cb) {
479 0 0 if (NULL == self || self->magic != EV_REDIS_MAGIC) return;
0 0 if (NULL == self || self->magic != EV_REDIS_MAGIC) return;
486 0 0 if (check_destroyed(self)) return;
497 0 0 if (NULL == self->loop) return;
498 0 0 if (self->waiting_timeout_ms <= 0) return;
499 0 0 if (ngx_queue_empty(&self->wait_queue)) return;
507 0 0 if (delay < 0) delay = 0;
519 0 0 if (NULL == self->loop) {
524 0 0 if (NULL != self->ac) {
532 0 0 if (NULL != self->path) {
535 0 0 else if (NULL != self->host) {
544 0 0 if (NULL == self->ac) {
550 0 0 if (REDIS_OK != post_connect_setup(self, "reconnect error")) {
560 0 0 if (self == NULL) return;
561 0 0 if (self->magic != EV_REDIS_MAGIC) return;
565 0 0 if (REDIS_OK != status) {
567 0 0 emit_error_str(self, c->errstr[0] ? c->errstr : "connect failed");
568 0 0 if (!self->reconnect || !self->resume_waiting_on_reconnect
0 0 if (!self->reconnect || !self->resume_waiting_on_reconnect
569 0 0 || self->intentional_disconnect) {
570 0 0 clear_wait_queue_sv(self, sv_2mortal(newSVpv(
579 0 0 if (NULL != self->connect_handler) {
585 0 0 PUSHMARK(SP);
589 0 0 if (SvTRUE(ERRSV)) {
0 0 if (SvTRUE(ERRSV)) {
590 0 0 warn("EV::Redis: exception in connect handler: %s", SvPV_nolen(ERRSV));
593 0 0 FREETMPS;
613 0 0 if (self == NULL) return;
614 0 0 if (self->magic != EV_REDIS_MAGIC) return;
621 0 0 if (self->ac != NULL && self->ac != c) {
0 0 if (self->ac != NULL && self->ac != c) {
622 0 0 if (self->ac_saved == c) self->ac_saved = NULL;
633 0 0 if (REDIS_OK == status) {
637 0 0 error_sv = sv_2mortal(newSVpv(
639 0 0 emit_error_str(self, c->errstr[0] ? c->errstr : "disconnected");
640 0 0 if (!was_intentional) {
645 0 0 if (NULL != self->disconnect_handler) {
651 0 0 PUSHMARK(SP);
655 0 0 if (SvTRUE(ERRSV)) {
0 0 if (SvTRUE(ERRSV)) {
656 0 0 warn("EV::Redis: exception in disconnect handler: %s", SvPV_nolen(ERRSV));
659 0 0 FREETMPS;
665 0 0 if (self->ac != NULL && self->ac != c) {
0 0 if (self->ac != NULL && self->ac != c) {
676 0 0 will_reconnect = should_reconnect && !self->intentional_disconnect && self->reconnect;
0 0 will_reconnect = should_reconnect && !self->intentional_disconnect && self->reconnect;
0 0 will_reconnect = should_reconnect && !self->intentional_disconnect && self->reconnect;
677 0 0 if (!self->resume_waiting_on_reconnect || was_intentional || !will_reconnect) {
0 0 if (!self->resume_waiting_on_reconnect || was_intentional || !will_reconnect) {
0 0 if (!self->resume_waiting_on_reconnect || was_intentional || !will_reconnect) {
682 0 0 if (will_reconnect) {
694 0 0 if (self == NULL) return;
695 0 0 if (self->magic != EV_REDIS_MAGIC) return;
696 0 0 if (NULL == self->push_handler) return;
697 0 0 if (NULL == reply) return;
707 0 0 PUSHMARK(SP);
708 0 0 XPUSHs(sv_2mortal(EV__redis_decode_reply(reply)));
712 0 0 if (SvTRUE(ERRSV)) {
0 0 if (SvTRUE(ERRSV)) {
713 0 0 warn("EV::Redis: exception in push handler: %s", SvPV_nolen(ERRSV));
716 0 0 FREETMPS;
725 0 0 if (NULL != self->connect_timeout) {
728 0 0 if (NULL != self->command_timeout) {
731 0 0 if (self->prefer_ipv4) {
734 0 0 else if (self->prefer_ipv6) {
737 0 0 if (self->cloexec) {
740 0 0 if (self->reuseaddr) {
743 0 0 if (NULL != self->source_addr && NULL == self->path) {
0 0 if (NULL != self->source_addr && NULL == self->path) {
755 0 0 if (NULL != self->ssl_ctx) {
756 0 0 if (REDIS_OK != redisInitiateSSLWithContext(&self->ac->c, self->ssl_ctx)) {
757 0 0 SV* err = sv_2mortal(newSVpvf("%s: SSL initiation failed: %s",
767 0 0 if (self->keepalive > 0) {
770 0 0 if (self->tcp_user_timeout > 0) {
774 0 0 if (REDIS_OK != redisLibevAttach(self->loop, self->ac)) {
782 0 0 if (self->priority != 0) {
788 0 0 if (NULL != self->push_handler) {
792 0 0 if (self->ac->err) {
838 0 0 if (reply->elements > 0) {
840 0 0 for (i = 0; i < reply->elements; i++) {
841 0 0 if (NULL != reply->element[i]) {
870 0 0 if (cbt->skipped) {
871 0 0 if (!cbt->persist || NULL == reply) {
0 0 if (!cbt->persist || NULL == reply) {
874 0 0 if (cbt->persist && NULL == reply && cbt->sub_count > 1) {
0 0 if (cbt->persist && NULL == reply && cbt->sub_count > 1) {
0 0 if (cbt->persist && NULL == reply && cbt->sub_count > 1) {
880 0 0 else if (cbt->persist && reply != NULL && is_unsub_reply((redisReply*)reply)) {
0 0 else if (cbt->persist && reply != NULL && is_unsub_reply((redisReply*)reply)) {
0 0 else if (cbt->persist && reply != NULL && is_unsub_reply((redisReply*)reply)) {
882 0 0 if (cbt->sub_count <= 0) {
897 0 0 if (self == NULL) {
898 0 0 if (NULL != cbt->cb) {
900 0 0 sv_2mortal(newSVpv(c->errstr[0] ? c->errstr : "disconnected", 0)));
904 0 0 if (cbt->persist && reply == NULL && cbt->sub_count > 1) {
0 0 if (cbt->persist && reply == NULL && cbt->sub_count > 1) {
0 0 if (cbt->persist && reply == NULL && cbt->sub_count > 1) {
916 0 0 if (self->magic == EV_REDIS_FREED) {
917 0 0 if (NULL != cbt->cb) {
919 0 0 invoke_callback_error(cbt->cb, sv_2mortal(newSVpv(c->errstr[0] ? c->errstr : "disconnected", 0)));
924 0 0 if (!cbt->persist) {
935 0 0 if (self->magic != EV_REDIS_MAGIC) {
936 0 0 if (NULL != cbt->cb) SvREFCNT_dec(cbt->cb);
944 0 0 if (NULL != cbt->cb) {
945 0 0 if (NULL == reply) {
946 0 0 sv_err = sv_2mortal(newSVpv(
956 0 0 PUSHMARK(SP);
957 0 0 EXTEND(SP, 2);
959 0 0 if (((redisReply*)reply)->type == REDIS_REPLY_ERROR) {
969 0 0 if (SvTRUE(ERRSV)) {
0 0 if (SvTRUE(ERRSV)) {
970 0 0 warn("EV::Redis: exception in command callback: %s", SvPV_nolen(ERRSV));
973 0 0 FREETMPS;
988 0 0 if (self->magic == EV_REDIS_FREED) {
989 0 0 if (NULL != cbt->cb) {
993 0 0 if (!cbt->persist) {
1000 0 0 if (cbt->skipped) {
1011 0 0 if (cbt->persist && cbt->sub_count > 1) {
0 0 if (cbt->persist && cbt->sub_count > 1) {
1026 0 0 if (cbt->persist && reply != NULL && is_unsub_reply((redisReply*)reply)) {
0 0 if (cbt->persist && reply != NULL && is_unsub_reply((redisReply*)reply)) {
0 0 if (cbt->persist && reply != NULL && is_unsub_reply((redisReply*)reply)) {
1028 0 0 if (cbt->sub_count <= 0) {
1033 0 0 if (NULL != cbt->cb) SvREFCNT_dec(cbt->cb);
1045 0 0 if (cbt->persist && NULL == reply) {
0 0 if (cbt->persist && NULL == reply) {
1046 0 0 if (cbt->sub_count > 1) {
1051 0 0 if (NULL != cbt->cb) SvREFCNT_dec(cbt->cb);
1059 0 0 if (0 == cbt->persist) {
1068 0 0 if (NULL != cbt->cb) SvREFCNT_dec(cbt->cb);
1072 0 0 if (reply != NULL) {
1092 0 0 if (cbt->persist && is_unsubscribe_command(cmd)) {
0 0 if (cbt->persist && is_unsubscribe_command(cmd)) {
1102 0 0 if (REDIS_OK != r) {
1104 0 0 if (!cbt->persist) self->pending_count--;
1106 0 0 if (NULL != cbt->cb) {
1107 0 0 invoke_callback_error(cbt->cb, sv_2mortal(newSVpv(
0 0 invoke_callback_error(cbt->cb, sv_2mortal(newSVpv(
1112 0 0 } else if (fn == NULL) {
1116 0 0 if (NULL != cbt->cb) SvREFCNT_dec(cbt->cb);
1133 0 0 if (NULL == self->ac || self->intentional_disconnect) return;
0 0 if (NULL == self->ac || self->intentional_disconnect) return;
1134 0 0 if (ngx_queue_empty(&self->wait_queue)) return;
1135 0 0 if (self->max_pending > 0 && self->pending_count >= self->max_pending) return;
0 0 if (self->max_pending > 0 && self->pending_count >= self->max_pending) return;
1147 0 0 cbt->sub_count = wt->persist ? wt->argc - 1 : 0;
1150 0 0 if (!cbt->persist) self->pending_count++;
1165 0 24 I_EV_API("EV::Redis");
24 0 I_EV_API("EV::Redis");
0 24 I_EV_API("EV::Redis");
1205 0 6 if (self->magic != EV_REDIS_MAGIC) {
1206 0 0 if (self->magic == EV_REDIS_FREED) {
1231 0 6 if (PL_dirty) {
1232 0 0 if (NULL != self->ac) {
1239 0 0 q != ngx_queue_sentinel(&self->cb_queue);
1249 0 0 if (NULL != self->ac_saved) {
1255 0 0 while (!ngx_queue_empty(&self->wait_queue)) {
1276 0 6 if (NULL != ac_to_free) {
1281 0 0 if (ac_to_free->c.flags & REDIS_IN_CALLBACK) {
1294 0 6 if (self->ac_saved != NULL) {
1299 6 0 CLEAR_HANDLER(self->error_handler);
1300 0 6 CLEAR_HANDLER(self->connect_handler);
1301 0 6 CLEAR_HANDLER(self->disconnect_handler);
1302 0 6 CLEAR_HANDLER(self->push_handler);
1305 6 0 if (!self->in_wait_cleanup) {
1308 6 0 if (!skip_cb_cleanup && !self->in_cb_cleanup) {
6 0 if (!skip_cb_cleanup && !self->in_cb_cleanup) {
1316 6 0 if (self->current_cb == NULL && self->callback_depth == 0) {
6 0 if (self->current_cb == NULL && self->callback_depth == 0) {
1327 0 0 if (NULL != self->ac) {
1341 0 0 if (NULL == self->ac) {
1354 0 0 if (NULL != self->ac) {
1367 0 0 if (NULL == self->ac) {
1383 0 0 if (NULL == self->ac) {
1388 0 0 if (!ngx_queue_empty(&self->wait_queue)) {
1405 0 0 if (self->ac->c.flags & REDIS_IN_CALLBACK) {
1414 0 0 if (check_destroyed(self)) return;
1421 0 0 RETVAL = (NULL != self->ac) ? 1 : 0;
1441 0 0 if (NULL != timeout_ms && SvOK(timeout_ms) && NULL != self->ac && NULL != self->command_timeout) {
0 0 if (NULL != timeout_ms && SvOK(timeout_ms) && NULL != self->ac && NULL != self->command_timeout) {
0 0 if (NULL != timeout_ms && SvOK(timeout_ms) && NULL != self->ac && NULL != self->command_timeout) {
0 0 if (NULL != timeout_ms && SvOK(timeout_ms) && NULL != self->ac && NULL != self->command_timeout) {
1481 0 0 if (NULL != self->ac) {
1482 0 0 if (NULL != self->push_handler) {
1505 0 1 if (items < 2) {
1510 1 0 if (SvROK(cb) && SvTYPE(SvRV(cb)) == SVt_PVCV) {
1 0 if (SvROK(cb) && SvTYPE(SvRV(cb)) == SVt_PVCV) {
1518 0 1 if (argc < 1) {
1522 1 0 if (NULL == self->ac) {
1523 1 0 if (!self->reconnect_timer_active) {
1533 0 0 for (i = 0; i < argc; i++) {
1540 0 0 if (NULL == self->ac ||
1541 0 0 (self->max_pending > 0 && self->pending_count >= self->max_pending)) {
0 0 (self->max_pending > 0 && self->pending_count >= self->max_pending)) {
1545 0 0 for (i = 0; i < argc; i++) {
1567 0 0 cbt->sub_count = persist ? argc - 1 : 0;
1570 0 0 if (!persist) self->pending_count++;
1589 0 0 if (!enable) {
1598 0 0 RETVAL = self->reconnect;
1607 0 0 RETVAL = self->pending_count;
1616 0 0 RETVAL = self->waiting_count;
1625 0 0 if (NULL != limit && SvOK(limit)) {
0 0 if (NULL != limit && SvOK(limit)) {
1627 0 0 if (val < 0) {
1638 0 0 if (check_destroyed(self)) XSRETURN_IV(0);
1640 0 0 RETVAL = self->max_pending;
1649 0 0 if (NULL != timeout_ms && SvOK(timeout_ms)) {
0 0 if (NULL != timeout_ms && SvOK(timeout_ms)) {
1665 0 0 if (NULL != value && SvOK(value)) {
0 0 if (NULL != value && SvOK(value)) {
1668 0 0 RETVAL = self->resume_waiting_on_reconnect;
1677 0 0 if (NULL != value && SvOK(value)) {
0 0 if (NULL != value && SvOK(value)) {
1680 0 0 if (prio < -2) prio = -2;
1681 0 0 if (prio > 2) prio = 2;
1683 0 0 if (NULL != self->ac) {
1687 0 0 RETVAL = self->priority;
1696 0 0 if (NULL != value && SvOK(value)) {
0 0 if (NULL != value && SvOK(value)) {
1698 0 0 if (interval < 0) croak("keepalive interval must be non-negative");
1699 0 0 if (interval > MAX_TIMEOUT_MS / 1000) croak("keepalive interval too large");
1701 0 0 if (NULL != self->ac && interval > 0) {
0 0 if (NULL != self->ac && interval > 0) {
1705 0 0 RETVAL = self->keepalive;
1714 0 0 if (NULL != value && SvOK(value)) {
0 0 if (NULL != value && SvOK(value)) {
1716 0 0 if (self->prefer_ipv4) self->prefer_ipv6 = 0;
1718 0 0 RETVAL = self->prefer_ipv4;
1727 0 0 if (NULL != value && SvOK(value)) {
0 0 if (NULL != value && SvOK(value)) {
1729 0 0 if (self->prefer_ipv6) self->prefer_ipv4 = 0;
1731 0 0 RETVAL = self->prefer_ipv6;
1740 0 0 if (items > 1) {
1741 0 0 if (NULL != self->source_addr) {
1745 0 0 if (NULL != value && SvOK(value)) {
0 0 if (NULL != value && SvOK(value)) {
1749 0 0 if (NULL != self->source_addr) {
1762 0 0 if (NULL != value && SvOK(value)) {
0 0 if (NULL != value && SvOK(value)) {
1767 0 0 RETVAL = self->tcp_user_timeout;
1776 0 0 if (NULL != value && SvOK(value)) {
0 0 if (NULL != value && SvOK(value)) {
1779 0 0 RETVAL = self->cloexec;
1788 0 0 if (NULL != value && SvOK(value)) {
0 0 if (NULL != value && SvOK(value)) {
1791 0 0 RETVAL = self->reuseaddr;
1805 0 0 if (self->in_wait_cleanup) {
1834 0 0 if (self->in_cb_cleanup) {
1845 0 0 while (!ngx_queue_empty(&self->cb_queue)) {
1849 0 0 if (cbt == self->current_cb) {
1851 0 0 if (ngx_queue_next(q) == ngx_queue_sentinel(&self->cb_queue)) {
1862 0 0 while (!ngx_queue_empty(&local_queue)) {
1863 0 0 if (self->magic == EV_REDIS_FREED) {
1878 0 0 if (!cbt->persist) self->pending_count--;
1883 0 0 if (NULL != cbt->cb) {
1904 0 4 RETVAL = 1;
1922 1 3 ssl_opts.cacert_filename = (SvOK(cacert)) ? SvPV_nolen(cacert) : NULL;
1923 1 3 ssl_opts.capath = (SvOK(capath)) ? SvPV_nolen(capath) : NULL;
1924 1 3 ssl_opts.cert_filename = (SvOK(cert)) ? SvPV_nolen(cert) : NULL;
1925 0 4 ssl_opts.private_key_filename = (SvOK(key)) ? SvPV_nolen(key) : NULL;
1926 0 4 ssl_opts.server_name = (SvOK(server_name)) ? SvPV_nolen(server_name) : NULL;
1930 0 4 if (NULL != self->ssl_ctx) {
1937 2 2 if (NULL == self->ssl_ctx) {