Condition Coverage

blib/lib/PAGI/Server/Connection.pm
Criterion Covered Total %
condition 345 595 57.9


and 3 conditions

line !l l&&!r l&&r condition
219 2 0 282 $self->{'transport_type'} eq "tcp" and $handle
2 75 207 $self->{'transport_type'} eq "tcp" and $handle and $handle->can("setsockopt")
227 0 76 206 $handle and $handle->can("peerhost")
244 254 1 29 $self->{'alpn_protocol'} and $self->{'alpn_protocol'} eq "h2"
255 0 29 $self->{'alpn_protocol'} and $self->{'alpn_protocol'} eq "h2" and $self->{'h2_protocol'}
249 0 0 284 $self->{'timeout'} and $self->{'timeout'} > 0
0 0 284 $self->{'timeout'} and $self->{'timeout'} > 0 and $self->{'server'}
286 481 0 44 $weak_self->{'h2c_enabled'} and not $weak_self->{'is_h2'}
288 0 1 43 $weak_self->{'h2_protocol'} and "PAGI::Server::Protocol::HTTP2"->detect_preface($weak_self->{'buffer'})
317 221 0 12 $weak_self->{'receive_pending'} and not $weak_self->{'receive_pending'}->is_ready
352 278 56 143 defined $self->{'_idle_reset_at'} and $now - $self->{'_idle_reset_at'} < "0.05"
417 0 234 2 $self->{'h2_session'} and not $self->{'h2_session'}->want_read
428 0 498 302 defined $data and length $data > 0
468 45 1 17 $h->[0] eq "accept" and $h->[1] =~ m[text/event-stream]
494 50 15 6 $self->{'max_body_size'} and $has_body
532 5 0 16 $stream->{'is_websocket'} and $stream->{'ws_accepted'}
552 2 0 1 $self->{'max_body_size'} and length $stream->{'body'} > $self->{'max_body_size'}
582 45 0 15 $stream->{'body_pending'} and not $stream->{'body_pending'}->is_ready
671 0 64 5 $weak_self and not $stream_state->{'response_started'}
693 0 0 69 $weak_self and $weak_self->{'server'}
834 0 0 132 $weak_self && $weak_self->{'h2_streams'}{$stream_id}
853 44 42 12 ($ss->{'send_queue_bytes'} // 0) < $weak_self->{'write_low_watermark'} and $ss->{'stream_drain_waiters'}
42 7 5 ($ss->{'send_queue_bytes'} // 0) < $weak_self->{'write_low_watermark'} and $ss->{'stream_drain_waiters'} and @{$ss->{'stream_drain_waiters'};}
867 44 39 15 ($ss->{'send_queue_bytes'} // 0) < $weak_self->{'write_low_watermark'} and $ss->{'transport_drain_fires'}
39 11 4 ($ss->{'send_queue_bytes'} // 0) < $weak_self->{'write_low_watermark'} and $ss->{'transport_drain_fires'} and @{$ss->{'transport_drain_fires'};}
875 58 32 8 !@$q && $eof_pending
1360 0 0 79 $weak_self && $weak_self->{'h2_streams'}{$stream_id}
1378 3 31 0 ($ss->{'send_queue_bytes'} // 0) < $weak_self->{'write_low_watermark'} and $ss->{'stream_drain_waiters'}
31 0 0 ($ss->{'send_queue_bytes'} // 0) < $weak_self->{'write_low_watermark'} and $ss->{'stream_drain_waiters'} and @{$ss->{'stream_drain_waiters'};}
1389 3 30 1 ($ss->{'send_queue_bytes'} // 0) < $weak_self->{'write_low_watermark'} and $ss->{'transport_drain_fires'}
30 0 1 ($ss->{'send_queue_bytes'} // 0) < $weak_self->{'write_low_watermark'} and $ss->{'transport_drain_fires'} and @{$ss->{'transport_drain_fires'};}
1427 46 4 1 $ss->{'sse_decline_started'} and not $type =~ /^sse\.http\.response\./
1640 1 0 0 $code >= 1007 and $code <= 1011
1 0 0 $code >= 3000 and $code <= 4999
1721 172 0 0 $self->{'request_timeout'} and $self->{'request_timeout'} > 0
1733 0 0 0 $weak_self->{'server'} and $weak_self->{'server'}->can("_log")
1768 22 0 0 $self->{'ws_idle_timeout'} and $self->{'ws_idle_timeout'} > 0
1779 0 0 0 $weak_self->{'server'} and $weak_self->{'server'}->can("_log")
1814 35 0 0 $self->{'sse_idle_timeout'} and $self->{'sse_idle_timeout'} > 0
1825 0 0 0 $weak_self->{'server'} and $weak_self->{'server'}->can("_log")
1881 0 0 261 defined $data and not ref $data
2035 0 71 1 $ss and $ss->{'stream_drain_waiters'}
2052 0 0 0 $interval and $interval > 0
2105 0 0 0 $weak_self->{'server'} and $weak_self->{'server'}->can("_log")
2155 0 0 2 $interval and $interval > 0
2219 2 208 6 $self->{'max_body_size'} and defined $request->{'content_length'}
2232 22 172 21 !$is_websocket && $self->_is_sse_request($request)
2264 636 0 22 $name eq "upgrade" and lc $value eq "websocket"
2276 193 0 22 $has_upgrade && $has_connection_upgrade && $has_ws_key
2413 7 134 11 $connection_header and $connection_header =~ /close/
2419 2 0 1 $connection_header and $connection_header =~ /keep-alive/
2534 17 0 0 $expect_continue and not $continue_sent
2542 1 0 0 length $weak_self->{'buffer'} == 0 and not $weak_self->{'closed'}
2559 1 0 0 ref $data eq "HASH" and $data->{'error'}
2573 0 1 0 $weak_self->{'max_body_size'} and $bytes_read > $weak_self->{'max_body_size'}
2619 16 0 12 length $weak_self->{'buffer'} == 0 and not $weak_self->{'closed'}
2633 16 0 0 $weak_self->{'closed'} and length $weak_self->{'buffer'} == 0
2683 2 0 1 $h->[0] eq "connection" and lc($h->[1]) =~ /keep-alive/
2877 0 0 2 $handle and $handle->can("setsockopt")
2902 156 0 18 defined $pending and length $pending
2977 0 0 0 defined $query and length $query
3017 282 0 2 not $reason and $self->{'server'}
0 2 0 not $reason and $self->{'server'} and $self->{'server'}{'shutting_down'}
3029 254 0 30 $self->{'current_connection_state'} and not $self->{'websocket_mode'}
254 0 30 $self->{'current_connection_state'} and not $self->{'websocket_mode'} and not $self->{'sse_mode'}
3037 266 2 16 $self->{'websocket_mode'} and not $is_completion
3058 267 1 16 $self->{'receive_pending'} and not $self->{'receive_pending'}->is_ready
3102 21 0 9 $stream->{'body_pending'} and not $stream->{'body_pending'}->is_ready
3132 147 14 123 $self->{'server'}{'shutting_down'} and keys %{$$self{"server"}{"connections"};} == 0
161 122 1 $self->{'server'}{'shutting_down'} and keys %{$$self{"server"}{"connections"};} == 0 and $self->{'server'}{'drain_complete'}
122 0 1 $self->{'server'}{'shutting_down'} and keys %{$$self{"server"}{"connections"};} == 0 and $self->{'server'}{'drain_complete'} and not $self->{'server'}{'drain_complete'}->is_ready
3206 0 0 45 $handle and $handle->isa("IO::Socket::SSL")
3325 242 0 45 $self->{'tls_enabled'} and $self->{'tls_info'}
3376 3 0 18 $self->{'sse_started'} and not $self->{'closed'}
3 0 18 $self->{'sse_started'} and not $self->{'closed'} and $self->{'stream'}
0 1 17 $self->{'sse_started'} and not $self->{'closed'} and $self->{'stream'} and $self->{'stream'}->write_handle
3426 20 0 1 defined $content_length && $content_length > 0
3458 6 0 1 $has_body and not $body_complete
3462 1 0 0 length $weak_self->{'buffer'} == 0 and not $weak_self->{'closed'}
1 0 0 length $weak_self->{'buffer'} == 0 and not $weak_self->{'closed'} and $remaining > 0
3533 32 0 20 defined $event->{'event'} and length $event->{'event'}
3544 44 0 7 defined $event->{'id'} and length $event->{'id'}
3596 44 3 1 $weak_self->{'sse_decline_started'} and not $type =~ /^sse\.http\.response\./
3746 0 0 1 $handle and $handle->can("setsockopt")
3991 18 0 0 $weak_self->{'receive_pending'} and not $weak_self->{'receive_pending'}->is_ready
4139 0 0 130 $rsv and ref $rsv eq "ARRAY"
4149 130 0 0 $opcode >= 3 and $opcode <= 7
130 0 0 $opcode >= 11 and $opcode <= 15
4157 130 0 0 $opcode == 8 || $opcode == 9 || $opcode == 10 and length $bytes > 125
4217 0 0 0 $code >= 1007 and $code <= 1011
0 0 0 $code >= 3000 and $code <= 4999
4275 42 0 10 $self->{'receive_pending'} and not $self->{'receive_pending'}->is_ready
42 0 10 $self->{'receive_pending'} and not $self->{'receive_pending'}->is_ready and @{$self->{'receive_queue'};}
4297 0 3 7 $self->{'sync_file_threshold'} > 0 and $length <= $self->{'sync_file_threshold'}
4353 5 0 1 $offset and $offset > 0

or 2 conditions

line l !l condition
195 209 77 $args{'extensions'} // {}
209 77 $args{'state'} // {}
209 77 $args{'tls_enabled'} // 0
209 77 $args{'timeout'} // 60
209 77 $args{'request_timeout'} // 0
209 77 $args{'ws_idle_timeout'} // 0
209 77 $args{'sse_idle_timeout'} // 0
209 77 $args{'max_receive_queue'} // 1000
209 77 $args{'max_ws_frame_size'} // 65536
209 77 $args{'sync_file_threshold'} // 65536
209 77 $args{'validate_events'} // 0
209 77 $args{'write_high_watermark'} // 65536
209 77 $args{'write_low_watermark'} // 16384
45 241 $args{'h2c_enabled'} // 0
209 77 $args{'transport_type'} // "tcp"
235 205 1 $handle->peerhost // "127.0.0.1"
236 205 1 $handle->peerport // 0
237 206 0 $handle->sockhost // "127.0.0.1"
238 206 0 $handle->sockport // 5000
442 72 0 $pseudo->{':method'} // ""
443 16 1 $pseudo->{':protocol'} // ""
706 39 0 $pseudo->{':path'} // "/"
708 2 37 $query_string //= ""
748 39 0 $pseudo->{':method'} // "GET"
836 132 0 $ss->{'send_queue'} ||= []
853 98 0 $ss->{'send_queue_bytes'} // 0
867 98 0 $ss->{'send_queue_bytes'} // 0
893 141 0 $event->{'type'} // ""
901 33 0 $event->{'status'} // 200
904 33 0 $event->{'headers'} // []
914 108 0 $event->{'body'} // ""
915 98 10 $event->{'more'} // 0
921 0 10 $ss->{'send_queue'} //= []
922 0 10 $ss->{'send_queue_bytes'} //= 0
943 65 0 $ss->{'send_queue_bytes'} // 0
962 10 0 $ss->{'send_queue_bytes'} // 0
1004 17 0 $pseudo->{':path'} // "/"
1006 0 17 $query_string //= ""
1117 25 0 $event->{'type'} // ""
1183 2 0 $event->{'status'} // 403
1186 2 0 $event->{'headers'} // []
1193 3 0 $event->{'body'} // ""
1216 1 0 $event->{'code'} // 1000
1217 1 0 $event->{'reason'} // ""
1243 18 0 $pseudo->{':path'} // "/"
1245 0 18 $query_string //= ""
1276 18 0 $pseudo->{':method'} // "GET"
1362 79 0 $ss->{'send_queue'} ||= []
1378 34 0 $ss->{'send_queue_bytes'} // 0
1389 34 0 $ss->{'send_queue_bytes'} // 0
1415 52 0 $event->{'type'} // ""
1446 14 0 $event->{'status'} // 200
1447 1 13 $event->{'headers'} // []
1473 0 14 $ss->{'send_queue'} //= []
1474 0 14 $ss->{'send_queue_bytes'} //= 0
1492 6 0 $ss->{'send_queue'} ||= []
1493 6 0 $ss->{'send_queue_bytes'} // 0
1506 24 0 $ss->{'send_queue_bytes'} // 0
1514 24 0 $ss->{'send_queue'} ||= []
1515 24 0 $ss->{'send_queue_bytes'} // 0
1526 1 0 $ss->{'send_queue'} ||= []
1527 1 0 $ss->{'send_queue_bytes'} // 0
1533 2 0 $event->{'interval'} // 0
1559 3 0 $event->{'status'} // 200
1562 3 0 $event->{'headers'} // []
1569 4 0 $event->{'body'} // ""
1636 3 0 substr($bytes, 2) // ""
1709 4 0 $reason // ""
1876 388 0 $self->{'stream'}{'writequeue'} // []
1916 91 2 $ss->{'send_queue_bytes'} // 0
1995 566 2 $reason //= "connection closed"
2015 5 0 $ss->{'send_queue_bytes'} // 0
2022 4 1 $ss->{'stream_drain_waiters'} //= []
2056 0 0 $timeout // 0
2158 2 0 $comment // ""
2400 155 0 $request->{'http_version'} // "1.1"
2474 172 0 $request->{'chunked'} // 0
2475 172 0 $request->{'expect_continue'} // 0
2561 0 0 $data->{'message'} // "Bad Request"
2570 1 0 $data // ""
2586 1 0 $data // ""
2675 172 0 $request->{'method'} // ""
2676 172 0 $request->{'http_version'} // "1.1"
2700 328 0 $event->{'type'} // ""
2714 158 0 $event->{'status'} // 200
2715 1 157 $event->{'trailers'} // 0
2717 158 0 $event->{'status'} // 200
2718 158 0 $event->{'headers'} // []
2767 1 0 $event->{'more'} // 0
2791 3 161 $event->{'offset'} // 0
2810 148 0 $body //= ""
2811 127 21 $event->{'more'} // 0
2850 1 0 $event->{'headers'} // []
2853 0 1 $weak_self->{'_resp_pending'} // ""
2966 205 0 $request->{'method'} // "-"
205 0 $request->{'raw_path'} // "/"
205 0 $request->{'http_version'} // "1.1"
205 0 $self->{'response_status'} // "-"
205 0 $self->{'_response_size'} // 0
205 0 $request->{'headers'} // []
3000 8 28 $self->{'ws_disconnect_code'} // 1006
32 4 $self->{'ws_disconnect_reason'} // ""
3022 282 2 $reason //= "client_closed"
3048 1 20 $self->{'sse_disconnect_reason'} // "client_closed"
3072 4 0 $reason //= ""
3165 1 20 $self->{'sse_disconnect_reason'} // "client_closed"
3436 0 0 ($weak_self ? $weak_self->{'sse_disconnect_reason'} : undef) // "client_closed"
3539 51 0 $event->{'data'} // ""
3562 5 0 $event->{'comment'} // ""
3581 49 0 $event->{'type'} // ""
3614 17 1 $event->{'status'} // 200
3616 15 3 $event->{'headers'} // []
3681 0 0 $event->{'interval'} // 0
3699 1 0 $event->{'reason'} // "app_closed"
3708 3 0 $event->{'status'} // 200
3711 3 0 $event->{'headers'} // []
3718 3 0 $event->{'body'} // ""
3938 42 0 $event->{'type'} // ""
4041 1 0 $event->{'status'} // 403
4044 1 0 $event->{'headers'} // []
4051 1 0 $event->{'body'} // ""
4077 0 2 $event->{'code'} // 1000
4078 0 2 $event->{'reason'} // ""
4097 0 0 $event->{'interval'} // 0
4211 0 0 substr($bytes, 2) // ""

or 3 conditions

line l !l&&r !l&&!r condition
218 284 0 0 $stream->write_handle // $stream->read_handle
713 39 0 0 eval { do { &decode("UTF-8", $unescaped, 1) } } // $unescaped
748 39 0 0 $pseudo->{':scheme'} // $self->_get_scheme
1010 17 0 0 eval { do { &decode("UTF-8", $unescaped, 1) } } // $unescaped
1249 18 0 0 eval { do { &decode("UTF-8", $unescaped, 1) } } // $unescaped
1276 18 0 0 $pseudo->{':scheme'} // $self->_get_scheme
1640 2 0 1 $code == 1000 or $code == 1001
2 0 1 $code == 1000 or $code == 1001 or $code == 1002
0 0 1 $code == 1000 or $code == 1001 or $code == 1002 or $code == 1003
2482 5 1 166 defined $content_length && $content_length > 0 || $is_chunked
2735 1 3 154 $is_head_request or $is_http10
2828 10 1 131 $more or $expects_trailers
2966 203 2 0 $self->{'client_host'} // ($self->{'transport_type'} eq "unix" ? "unix" : "-")
3885 23 0 0 $weak_self->{'websocket_mode'} or $weak_self->{'closed'}
4149 0 0 130 $opcode >= 3 and $opcode <= 7 or $opcode >= 11 and $opcode <= 15
4157 0 0 130 $opcode == 8 || $opcode == 9 || $opcode == 10
4217 0 0 0 $code == 1000 or $code == 1001
0 0 0 $code == 1000 or $code == 1001 or $code == 1002
0 0 0 $code == 1000 or $code == 1001 or $code == 1002 or $code == 1003
4291 1 9 0 $length //= $file_size - $offset