Branch Coverage

nghttp2.xs
Criterion Covered Total %
branch 202 472 42.8


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 16 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 267 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 10 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 15 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 2 97 if (items > 3 && SvROK(ST(3)) && SvTYPE(SvRV(ST(3))) == SVt_PVHV) {
2 0 if (items > 3 && SvROK(ST(3)) && SvTYPE(SvRV(ST(3))) == SVt_PVHV) {
2 0 if (items > 3 && SvROK(ST(3)) && SvTYPE(SvRV(ST(3))) == SVt_PVHV) {
669 0 99 if (SvOK(user_data)) {
674 99 0 if ((svp = hv_fetch(callbacks_hv, "on_begin_headers", 16, 0))) {
677 99 0 if ((svp = hv_fetch(callbacks_hv, "on_header", 9, 0))) {
680 99 0 if ((svp = hv_fetch(callbacks_hv, "on_frame_recv", 13, 0))) {
683 21 78 if ((svp = hv_fetch(callbacks_hv, "on_data_chunk_recv", 18, 0))) {
686 14 85 if ((svp = hv_fetch(callbacks_hv, "on_stream_close", 15, 0))) {
700 2 97 if (options_hv) {
702 0 2 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 1 if ((svp = hv_fetch(options_hv, "max_send_header_block_length", 28, 0))) {
719 1 1 if ((svp = hv_fetch(options_hv, "stream_reset_burst", 18, 0))) {
721 1 0 if (rate_svp) {
734 0 99 if (rv != 0) {
735 0 0 if (ps->user_data) SvREFCNT_dec(ps->user_data);
736 0 0 if (ps->cb_on_begin_headers) SvREFCNT_dec(ps->cb_on_begin_headers);
737 0 0 if (ps->cb_on_header) SvREFCNT_dec(ps->cb_on_header);
738 0 0 if (ps->cb_on_frame_recv) SvREFCNT_dec(ps->cb_on_frame_recv);
739 0 0 if (ps->cb_on_data_chunk_recv) SvREFCNT_dec(ps->cb_on_data_chunk_recv);
740 0 0 if (ps->cb_on_stream_close) SvREFCNT_dec(ps->cb_on_stream_close);
761 121 0 if (ps) {
763 121 0 if (ps->session) {
766 0 121 if (ps->user_data) SvREFCNT_dec(ps->user_data);
767 112 9 if (ps->cb_on_begin_headers) SvREFCNT_dec(ps->cb_on_begin_headers);
768 113 8 if (ps->cb_on_header) SvREFCNT_dec(ps->cb_on_header);
769 121 0 if (ps->cb_on_frame_recv) SvREFCNT_dec(ps->cb_on_frame_recv);
770 30 91 if (ps->cb_on_data_chunk_recv) SvREFCNT_dec(ps->cb_on_data_chunk_recv);
771 23 98 if (ps->cb_on_stream_close) SvREFCNT_dec(ps->cb_on_stream_close);
772 121 0 if (ps->send_buf) free(ps->send_buf);
774 8 121 for (i = 0; i < ps->data_providers_count; i++) {
775 6 2 if (ps->data_providers[i]) {
777 2 4 if (dp->callback) SvREFCNT_dec(dp->callback);
778 0 6 if (dp->user_data) SvREFCNT_dec(dp->user_data);
782 8 113 if (ps->data_providers) free(ps->data_providers);
801 1 182 if (rv < 0) {
804 52 130 RETVAL = (int)rv;
823 0 284 if (rv != 0) {
828 219 65 if (ps->send_buf_len > 0) {
868 123 0 int niv = 0;
874 111 12 if ((svp = hv_fetch(settings_hv, "max_concurrent_streams", 22, 0))) {
879 109 14 if ((svp = hv_fetch(settings_hv, "initial_window_size", 19, 0))) {
884 0 123 if ((svp = hv_fetch(settings_hv, "max_frame_size", 14, 0))) {
889 0 123 if ((svp = hv_fetch(settings_hv, "enable_push", 11, 0))) {
894 10 113 if ((svp = hv_fetch(settings_hv, "enable_connect_protocol", 23, 0))) {
899 1 122 if ((svp = hv_fetch(settings_hv, "header_table_size", 17, 0))) {
904 1 122 if ((svp = hv_fetch(settings_hv, "max_header_list_size", 20, 0))) {
911 0 123 if (rv != 0) {
914 109 14 RETVAL = rv;
939 0 0 Newxz(nva, nvlen, nghttp2_nv);
941 0 0 for (i = 0; i < (I32)nvlen; i++) {
943 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) {
948 0 0 if (name_sv && value_sv) {
0 0 if (name_sv && value_sv) {
967 0 0 if (rv != 0) {
970 0 0 RETVAL = rv;
991 0 0 Newxz(nva, nvlen, nghttp2_nv);
993 0 0 for (i = 0; i < (I32)nvlen; i++) {
995 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) {
1000 0 0 if (name_sv && value_sv) {
0 0 if (name_sv && value_sv) {
1015 0 0 if (rv != 0) {
1018 0 0 RETVAL = rv;
1033 0 2 if (rv != 0 && rv != NGHTTP2_ERR_INVALID_ARGUMENT) {
0 0 if (rv != 0 && rv != NGHTTP2_ERR_INVALID_ARGUMENT) {
1036 1 1 RETVAL = rv;
1051 0 0 if (data) {
1072 0 0 SvOK(data) ? newSVsv(data) : NULL);
1073 0 0 RETVAL = rv;
1088 0 1 RETVAL = rv;
1115 0 2 Newxz(nva, nvlen, nghttp2_nv);
1117 4 2 for (i = 0; i < (I32)nvlen; i++) {
1119 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) {
1124 4 0 if (name_sv && value_sv) {
4 0 if (name_sv && value_sv) {
1139 0 2 if (SvOK(cb_user_data)) {
1156 0 2 if (rv != 0) {
1160 0 2 RETVAL = rv;
1184 0 4 if (!dp) {
1192 3 1 if (dp->callback) {
1196 0 4 if (dp->user_data) {
1199 4 0 dp->user_data = SvOK(data_sv) ? newSVsv(data_sv) : NULL;
1205 0 4 if (rv != 0 && rv != NGHTTP2_ERR_INVALID_ARGUMENT) {
0 0 if (rv != 0 && rv != NGHTTP2_ERR_INVALID_ARGUMENT) {
1208 0 4 RETVAL = 0;
1223 0 0 RETVAL = dp ? dp->deferred : 0;
0 0 RETVAL = dp ? dp->deferred : 0;
1238 2 0 if (dp) {
1263 0 22 if (SvOK(user_data)) {
1268 22 0 if (callbacks_hv) {
1269 13 9 if ((svp = hv_fetch(callbacks_hv, "on_begin_headers", 16, 0))) {
1272 14 8 if ((svp = hv_fetch(callbacks_hv, "on_header", 9, 0))) {
1275 22 0 if ((svp = hv_fetch(callbacks_hv, "on_frame_recv", 13, 0))) {
1278 9 13 if ((svp = hv_fetch(callbacks_hv, "on_data_chunk_recv", 18, 0))) {
1281 9 13 if ((svp = hv_fetch(callbacks_hv, "on_stream_close", 15, 0))) {
1299 0 22 if (rv != 0) {
1300 0 0 if (ps->user_data) SvREFCNT_dec(ps->user_data);
1301 0 0 if (ps->cb_on_begin_headers) SvREFCNT_dec(ps->cb_on_begin_headers);
1302 0 0 if (ps->cb_on_header) SvREFCNT_dec(ps->cb_on_header);
1303 0 0 if (ps->cb_on_frame_recv) SvREFCNT_dec(ps->cb_on_frame_recv);
1304 0 0 if (ps->cb_on_data_chunk_recv) SvREFCNT_dec(ps->cb_on_data_chunk_recv);
1305 0 0 if (ps->cb_on_stream_close) SvREFCNT_dec(ps->cb_on_stream_close);
1334 24 0 STRLEN body_len = 0;
1340 0 24 Newxz(nva, nvlen, nghttp2_nv);
1342 155 24 for (i = 0; i < (I32)nvlen; i++) {
1344 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) {
1349 155 0 if (name_sv && value_sv) {
155 0 if (name_sv && value_sv) {
1361 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) {
1373 2 18 else if (SvOK(body_sv) && SvPOK(body_sv)) {
2 0 else if (SvOK(body_sv) && SvPOK(body_sv)) {
1375 2 0 if (body_len > 0) {
1394 0 24 if (stream_id < 0) {
1395 0 0 if (dp) {
1396 0 0 if (dp->callback) SvREFCNT_dec(dp->callback);
1397 0 0 if (dp->user_data) SvREFCNT_dec(dp->user_data);
1404 6 18 if (dp) {
1409 20 4 RETVAL = stream_id;
1425 0 0 if (rv != 0) {
1428 0 0 RETVAL = rv;
1448 0 0 if (SvOK(opaque_data)) {
1450 0 0 if (len != 8) {
1458 0 0 if (rv != 0) {
1461 0 0 RETVAL = rv;
1477 0 0 if (rv != 0) {
1480 0 0 RETVAL = rv;