Branch Coverage

nghttp2.xs
Criterion Covered Total %
branch 198 468 42.3


line true false branch
72 6 0 for (i = 0; i < ps->data_providers_count; i++) {
73 6 0 if (ps->data_providers[i] && ps->data_providers[i]->stream_id == stream_id) {
6 0 if (ps->data_providers[i] && ps->data_providers[i]->stream_id == stream_id) {
83 0 8 for (i = 0; i < ps->data_providers_count; i++) {
84 0 0 if (!ps->data_providers[i]) {
90 8 0 if (ps->data_providers_count >= ps->data_providers_cap) {
91 0 8 int new_cap = ps->data_providers_cap ? ps->data_providers_cap * 2 : 8;
104 2 10 for (i = 0; i < ps->data_providers_count; i++) {
105 2 0 if (ps->data_providers[i] && ps->data_providers[i]->stream_id == stream_id) {
2 0 if (ps->data_providers[i] && ps->data_providers[i]->stream_id == stream_id) {
107 1 1 if (dp->callback) SvREFCNT_dec(dp->callback);
108 0 2 if (dp->user_data) SvREFCNT_dec(dp->user_data);
133 0 16 if (!dp) {
139 7 9 if (!dp->callback && dp->user_data && SvOK(dp->user_data)) {
6 1 if (!dp->callback && dp->user_data && SvOK(dp->user_data)) {
6 0 if (!dp->callback && dp->user_data && SvOK(dp->user_data)) {
144 6 0 if (send_len > 0) {
148 6 0 if (send_len >= full_len) {
152 5 1 if (dp->eof) {
166 9 1 if (!dp->callback || !SvOK(dp->callback)) {
0 9 if (!dp->callback || !SvOK(dp->callback)) {
167 0 1 if (dp->eof) {
178 0 9 PUSHMARK(SP);
182 0 9 XPUSHs(sv_2mortal(newSViv(stream_id)));
183 0 9 XPUSHs(sv_2mortal(newSVuv(length)));
184 0 9 if (dp->user_data && SvOK(dp->user_data)) {
0 0 if (dp->user_data && SvOK(dp->user_data)) {
185 0 0 XPUSHs(dp->user_data);
192 9 0 if (SvTRUE(ERRSV)) {
0 9 if (SvTRUE(ERRSV)) {
194 0 0 warn("nghttp2 data provider callback error: %s", SvPV_nolen(ERRSV));
196 0 9 } else if (count == 0) {
200 9 0 } else if (count >= 1) {
204 3 6 if (count >= 2) {
209 6 3 if (!SvOK(data_sv)) {
218 0 3 if (data_len > length) {
221 3 0 if (data_len > 0) {
227 3 0 if (eof_sv && SvTRUE(eof_sv)) {
2 1 if (eof_sv && SvTRUE(eof_sv)) {
232 0 3 if (data_len == 0 && !dp->eof) {
0 0 if (data_len == 0 && !dp->eof) {
240 9 0 FREETMPS;
252 577 0 if (!callback || !SvOK(callback)) {
0 577 if (!callback || !SvOK(callback)) {
258 0 577 PUSHMARK(SP);
260 577 0 if (args) {
263 1556 577 for (i = 0; i < len; i++) {
265 1556 0 if (elem) {
266 0 1556 XPUSHs(*elem);
275 577 0 if (SvTRUE(ERRSV)) {
0 577 if (SvTRUE(ERRSV)) {
277 0 0 warn("nghttp2 callback error: %s", SvPV_nolen(ERRSV));
279 577 0 } else if (count > 0) {
281 577 0 if (SvIOK(result)) {
287 577 0 FREETMPS;
300 0 261 if (ps->send_buf_len + length > ps->send_buf_cap) {
302 0 0 if (new_cap < ps->send_buf_len + length) {
306 0 0 if (!ps->send_buf) {
327 69 0 if (!ps->cb_on_begin_headers || !SvOK(ps->cb_on_begin_headers)) {
0 69 if (!ps->cb_on_begin_headers || !SvOK(ps->cb_on_begin_headers)) {
353 261 0 if (!ps->cb_on_header || !SvOK(ps->cb_on_header)) {
0 261 if (!ps->cb_on_header || !SvOK(ps->cb_on_header)) {
379 214 0 if (!ps->cb_on_frame_recv || !SvOK(ps->cb_on_frame_recv)) {
0 214 if (!ps->cb_on_frame_recv || !SvOK(ps->cb_on_frame_recv)) {
409 25 0 if (!ps->cb_on_data_chunk_recv || !SvOK(ps->cb_on_data_chunk_recv)) {
0 25 if (!ps->cb_on_data_chunk_recv || !SvOK(ps->cb_on_data_chunk_recv)) {
437 8 4 if (!ps->cb_on_stream_close || !SvOK(ps->cb_on_stream_close)) {
0 8 if (!ps->cb_on_stream_close || !SvOK(ps->cb_on_stream_close)) {
460 0 14 RETVAL = info ? 1 : 0;
469 2 0 RETVAL = info ? info->version_str : "unknown";
478 2 0 RETVAL = info ? info->version_num : 0;
0 2 RETVAL = info ? info->version_num : 0;
486 0 0 RETVAL = NGHTTP2_ERR_WOULDBLOCK;
493 0 0 RETVAL = NGHTTP2_ERR_CALLBACK_FAILURE;
500 0 0 RETVAL = NGHTTP2_ERR_DEFERRED;
507 0 2 RETVAL = NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
514 0 0 RETVAL = NGHTTP2_FLAG_NONE;
521 0 1 RETVAL = NGHTTP2_FLAG_END_STREAM;
528 0 0 RETVAL = NGHTTP2_FLAG_END_HEADERS;
535 0 0 RETVAL = NGHTTP2_FLAG_ACK;
542 0 0 RETVAL = NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS;
549 0 0 RETVAL = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE;
556 0 0 RETVAL = NGHTTP2_SETTINGS_MAX_FRAME_SIZE;
563 0 0 RETVAL = NGHTTP2_SETTINGS_ENABLE_PUSH;
570 0 1 RETVAL = NGHTTP2_SETTINGS_ENABLE_CONNECT_PROTOCOL;
577 0 0 RETVAL = NGHTTP2_DATA_FLAG_NONE;
584 0 0 RETVAL = NGHTTP2_DATA_FLAG_EOF;
591 0 0 RETVAL = NGHTTP2_DATA_FLAG_NO_END_STREAM;
598 0 0 RETVAL = NGHTTP2_DATA_FLAG_NO_COPY;
606 0 0 RETVAL = NGHTTP2_DATA;
613 0 0 RETVAL = NGHTTP2_HEADERS;
620 0 0 RETVAL = NGHTTP2_SETTINGS;
627 0 0 RETVAL = NGHTTP2_PUSH_PROMISE;
634 0 0 RETVAL = NGHTTP2_GOAWAY;
656 1 97 if (items > 3 && SvROK(ST(3)) && SvTYPE(SvRV(ST(3))) == SVt_PVHV) {
1 0 if (items > 3 && SvROK(ST(3)) && SvTYPE(SvRV(ST(3))) == SVt_PVHV) {
1 0 if (items > 3 && SvROK(ST(3)) && SvTYPE(SvRV(ST(3))) == SVt_PVHV) {
669 0 98 if (SvOK(user_data)) {
674 98 0 if ((svp = hv_fetch(callbacks_hv, "on_begin_headers", 16, 0))) {
677 98 0 if ((svp = hv_fetch(callbacks_hv, "on_header", 9, 0))) {
680 98 0 if ((svp = hv_fetch(callbacks_hv, "on_frame_recv", 13, 0))) {
683 21 77 if ((svp = hv_fetch(callbacks_hv, "on_data_chunk_recv", 18, 0))) {
686 14 84 if ((svp = hv_fetch(callbacks_hv, "on_stream_close", 15, 0))) {
700 1 97 if (options_hv) {
702 0 1 if (rv != 0) {
704 0 0 if (ps->user_data) SvREFCNT_dec(ps->user_data);
705 0 0 if (ps->cb_on_begin_headers) SvREFCNT_dec(ps->cb_on_begin_headers);
706 0 0 if (ps->cb_on_header) SvREFCNT_dec(ps->cb_on_header);
707 0 0 if (ps->cb_on_frame_recv) SvREFCNT_dec(ps->cb_on_frame_recv);
708 0 0 if (ps->cb_on_data_chunk_recv) SvREFCNT_dec(ps->cb_on_data_chunk_recv);
709 0 0 if (ps->cb_on_stream_close) SvREFCNT_dec(ps->cb_on_stream_close);
715 1 0 if ((svp = hv_fetch(options_hv, "max_send_header_block_length", 28, 0))) {
726 0 98 if (rv != 0) {
727 0 0 if (ps->user_data) SvREFCNT_dec(ps->user_data);
728 0 0 if (ps->cb_on_begin_headers) SvREFCNT_dec(ps->cb_on_begin_headers);
729 0 0 if (ps->cb_on_header) SvREFCNT_dec(ps->cb_on_header);
730 0 0 if (ps->cb_on_frame_recv) SvREFCNT_dec(ps->cb_on_frame_recv);
731 0 0 if (ps->cb_on_data_chunk_recv) SvREFCNT_dec(ps->cb_on_data_chunk_recv);
732 0 0 if (ps->cb_on_stream_close) SvREFCNT_dec(ps->cb_on_stream_close);
753 120 0 if (ps) {
755 120 0 if (ps->session) {
758 0 120 if (ps->user_data) SvREFCNT_dec(ps->user_data);
759 111 9 if (ps->cb_on_begin_headers) SvREFCNT_dec(ps->cb_on_begin_headers);
760 112 8 if (ps->cb_on_header) SvREFCNT_dec(ps->cb_on_header);
761 120 0 if (ps->cb_on_frame_recv) SvREFCNT_dec(ps->cb_on_frame_recv);
762 30 90 if (ps->cb_on_data_chunk_recv) SvREFCNT_dec(ps->cb_on_data_chunk_recv);
763 23 97 if (ps->cb_on_stream_close) SvREFCNT_dec(ps->cb_on_stream_close);
764 120 0 if (ps->send_buf) free(ps->send_buf);
766 8 120 for (i = 0; i < ps->data_providers_count; i++) {
767 6 2 if (ps->data_providers[i]) {
769 2 4 if (dp->callback) SvREFCNT_dec(dp->callback);
770 0 6 if (dp->user_data) SvREFCNT_dec(dp->user_data);
774 8 112 if (ps->data_providers) free(ps->data_providers);
793 1 182 if (rv < 0) {
796 52 130 RETVAL = (int)rv;
815 0 284 if (rv != 0) {
820 219 65 if (ps->send_buf_len > 0) {
860 123 0 int niv = 0;
866 111 12 if ((svp = hv_fetch(settings_hv, "max_concurrent_streams", 22, 0))) {
871 109 14 if ((svp = hv_fetch(settings_hv, "initial_window_size", 19, 0))) {
876 0 123 if ((svp = hv_fetch(settings_hv, "max_frame_size", 14, 0))) {
881 0 123 if ((svp = hv_fetch(settings_hv, "enable_push", 11, 0))) {
886 10 113 if ((svp = hv_fetch(settings_hv, "enable_connect_protocol", 23, 0))) {
891 1 122 if ((svp = hv_fetch(settings_hv, "header_table_size", 17, 0))) {
896 1 122 if ((svp = hv_fetch(settings_hv, "max_header_list_size", 20, 0))) {
903 0 123 if (rv != 0) {
906 109 14 RETVAL = rv;
931 0 0 Newxz(nva, nvlen, nghttp2_nv);
933 0 0 for (i = 0; i < (I32)nvlen; i++) {
935 0 0 if (pair && SvROK(*pair) && SvTYPE(SvRV(*pair)) == SVt_PVAV) {
0 0 if (pair && SvROK(*pair) && SvTYPE(SvRV(*pair)) == SVt_PVAV) {
0 0 if (pair && SvROK(*pair) && SvTYPE(SvRV(*pair)) == SVt_PVAV) {
940 0 0 if (name_sv && value_sv) {
0 0 if (name_sv && value_sv) {
959 0 0 if (rv != 0) {
962 0 0 RETVAL = rv;
983 0 0 Newxz(nva, nvlen, nghttp2_nv);
985 0 0 for (i = 0; i < (I32)nvlen; i++) {
987 0 0 if (pair && SvROK(*pair) && SvTYPE(SvRV(*pair)) == SVt_PVAV) {
0 0 if (pair && SvROK(*pair) && SvTYPE(SvRV(*pair)) == SVt_PVAV) {
0 0 if (pair && SvROK(*pair) && SvTYPE(SvRV(*pair)) == SVt_PVAV) {
992 0 0 if (name_sv && value_sv) {
0 0 if (name_sv && value_sv) {
1007 0 0 if (rv != 0) {
1010 0 0 RETVAL = rv;
1025 0 2 if (rv != 0 && rv != NGHTTP2_ERR_INVALID_ARGUMENT) {
0 0 if (rv != 0 && rv != NGHTTP2_ERR_INVALID_ARGUMENT) {
1028 1 1 RETVAL = rv;
1043 0 0 if (data) {
1064 0 0 SvOK(data) ? newSVsv(data) : NULL);
1065 0 0 RETVAL = rv;
1080 0 1 RETVAL = rv;
1107 0 2 Newxz(nva, nvlen, nghttp2_nv);
1109 4 2 for (i = 0; i < (I32)nvlen; i++) {
1111 4 0 if (pair && SvROK(*pair) && SvTYPE(SvRV(*pair)) == SVt_PVAV) {
4 0 if (pair && SvROK(*pair) && SvTYPE(SvRV(*pair)) == SVt_PVAV) {
4 0 if (pair && SvROK(*pair) && SvTYPE(SvRV(*pair)) == SVt_PVAV) {
1116 4 0 if (name_sv && value_sv) {
4 0 if (name_sv && value_sv) {
1131 0 2 if (SvOK(cb_user_data)) {
1148 0 2 if (rv != 0) {
1152 0 2 RETVAL = rv;
1176 0 4 if (!dp) {
1184 3 1 if (dp->callback) {
1188 0 4 if (dp->user_data) {
1191 4 0 dp->user_data = SvOK(data_sv) ? newSVsv(data_sv) : NULL;
1197 0 4 if (rv != 0 && rv != NGHTTP2_ERR_INVALID_ARGUMENT) {
0 0 if (rv != 0 && rv != NGHTTP2_ERR_INVALID_ARGUMENT) {
1200 0 4 RETVAL = 0;
1215 0 0 RETVAL = dp ? dp->deferred : 0;
0 0 RETVAL = dp ? dp->deferred : 0;
1230 2 0 if (dp) {
1255 0 22 if (SvOK(user_data)) {
1260 22 0 if (callbacks_hv) {
1261 13 9 if ((svp = hv_fetch(callbacks_hv, "on_begin_headers", 16, 0))) {
1264 14 8 if ((svp = hv_fetch(callbacks_hv, "on_header", 9, 0))) {
1267 22 0 if ((svp = hv_fetch(callbacks_hv, "on_frame_recv", 13, 0))) {
1270 9 13 if ((svp = hv_fetch(callbacks_hv, "on_data_chunk_recv", 18, 0))) {
1273 9 13 if ((svp = hv_fetch(callbacks_hv, "on_stream_close", 15, 0))) {
1291 0 22 if (rv != 0) {
1292 0 0 if (ps->user_data) SvREFCNT_dec(ps->user_data);
1293 0 0 if (ps->cb_on_begin_headers) SvREFCNT_dec(ps->cb_on_begin_headers);
1294 0 0 if (ps->cb_on_header) SvREFCNT_dec(ps->cb_on_header);
1295 0 0 if (ps->cb_on_frame_recv) SvREFCNT_dec(ps->cb_on_frame_recv);
1296 0 0 if (ps->cb_on_data_chunk_recv) SvREFCNT_dec(ps->cb_on_data_chunk_recv);
1297 0 0 if (ps->cb_on_stream_close) SvREFCNT_dec(ps->cb_on_stream_close);
1326 24 0 STRLEN body_len = 0;
1332 0 24 Newxz(nva, nvlen, nghttp2_nv);
1334 155 24 for (i = 0; i < (I32)nvlen; i++) {
1336 155 0 if (pair && SvROK(*pair) && SvTYPE(SvRV(*pair)) == SVt_PVAV) {
155 0 if (pair && SvROK(*pair) && SvTYPE(SvRV(*pair)) == SVt_PVAV) {
155 0 if (pair && SvROK(*pair) && SvTYPE(SvRV(*pair)) == SVt_PVAV) {
1341 155 0 if (name_sv && value_sv) {
155 0 if (name_sv && value_sv) {
1353 6 18 if (SvOK(body_sv) && SvROK(body_sv) && SvTYPE(SvRV(body_sv)) == SVt_PVCV) {
4 2 if (SvOK(body_sv) && SvROK(body_sv) && SvTYPE(SvRV(body_sv)) == SVt_PVCV) {
4 0 if (SvOK(body_sv) && SvROK(body_sv) && SvTYPE(SvRV(body_sv)) == SVt_PVCV) {
1365 2 18 else if (SvOK(body_sv) && SvPOK(body_sv)) {
2 0 else if (SvOK(body_sv) && SvPOK(body_sv)) {
1367 2 0 if (body_len > 0) {
1386 0 24 if (stream_id < 0) {
1387 0 0 if (dp) {
1388 0 0 if (dp->callback) SvREFCNT_dec(dp->callback);
1389 0 0 if (dp->user_data) SvREFCNT_dec(dp->user_data);
1396 6 18 if (dp) {
1401 20 4 RETVAL = stream_id;
1417 0 0 if (rv != 0) {
1420 0 0 RETVAL = rv;
1440 0 0 if (SvOK(opaque_data)) {
1442 0 0 if (len != 8) {
1450 0 0 if (rv != 0) {
1453 0 0 RETVAL = rv;
1469 0 0 if (rv != 0) {
1472 0 0 RETVAL = rv;