Condition Coverage

blib/lib/PAGI/Server/Connection.pm
Criterion Covered Total %
condition 328 575 57.0


and 3 conditions

line !l l&&!r l&&r condition
219 2 0 271 $self->{'transport_type'} eq "tcp" and $handle
2 70 201 $self->{'transport_type'} eq "tcp" and $handle and $handle->can("setsockopt")
227 0 71 200 $handle and $handle->can("peerhost")
244 247 1 25 $self->{'alpn_protocol'} and $self->{'alpn_protocol'} eq "h2"
248 0 25 $self->{'alpn_protocol'} and $self->{'alpn_protocol'} eq "h2" and $self->{'h2_protocol'}
249 0 0 273 $self->{'timeout'} and $self->{'timeout'} > 0
0 0 273 $self->{'timeout'} and $self->{'timeout'} > 0 and $self->{'server'}
286 447 0 43 $weak_self->{'h2c_enabled'} and not $weak_self->{'is_h2'}
288 0 1 42 $weak_self->{'h2_protocol'} and "PAGI::Server::Protocol::HTTP2"->detect_preface($weak_self->{'buffer'})
317 215 0 12 $weak_self->{'receive_pending'} and not $weak_self->{'receive_pending'}->is_ready
352 267 54 135 defined $self->{'_idle_reset_at'} and $now - $self->{'_idle_reset_at'} < "0.05"
417 0 219 2 $self->{'h2_session'} and not $self->{'h2_session'}->want_read
428 0 471 285 defined $data and length $data > 0
468 45 1 12 $h->[0] eq "accept" and $h->[1] =~ m[text/event-stream]
494 45 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 41 0 15 $stream->{'body_pending'} and not $stream->{'body_pending'}->is_ready
671 0 59 5 $weak_self and not $stream_state->{'response_started'}
693 0 0 64 $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 74 $weak_self && $weak_self->{'h2_streams'}{$stream_id}
1378 3 30 0 ($ss->{'send_queue_bytes'} // 0) < $weak_self->{'write_low_watermark'} and $ss->{'stream_drain_waiters'}
30 0 0 ($ss->{'send_queue_bytes'} // 0) < $weak_self->{'write_low_watermark'} and $ss->{'stream_drain_waiters'} and @{$ss->{'stream_drain_waiters'};}
1389 3 29 1 ($ss->{'send_queue_bytes'} // 0) < $weak_self->{'write_low_watermark'} and $ss->{'transport_drain_fires'}
29 0 1 ($ss->{'send_queue_bytes'} // 0) < $weak_self->{'write_low_watermark'} and $ss->{'transport_drain_fires'} and @{$ss->{'transport_drain_fires'};}
1584 1 0 0 $code >= 1007 and $code <= 1011
1 0 0 $code >= 3000 and $code <= 4999
1665 172 0 0 $self->{'request_timeout'} and $self->{'request_timeout'} > 0
1677 0 0 0 $weak_self->{'server'} and $weak_self->{'server'}->can("_log")
1712 22 0 0 $self->{'ws_idle_timeout'} and $self->{'ws_idle_timeout'} > 0
1723 0 0 0 $weak_self->{'server'} and $weak_self->{'server'}->can("_log")
1758 27 0 0 $self->{'sse_idle_timeout'} and $self->{'sse_idle_timeout'} > 0
1769 0 0 0 $weak_self->{'server'} and $weak_self->{'server'}->can("_log")
1825 0 0 255 defined $data and not ref $data
1979 0 66 1 $ss and $ss->{'stream_drain_waiters'}
1996 0 0 0 $interval and $interval > 0
2049 0 0 0 $weak_self->{'server'} and $weak_self->{'server'}->can("_log")
2099 0 0 2 $interval and $interval > 0
2163 2 202 6 $self->{'max_body_size'} and defined $request->{'content_length'}
2176 22 172 15 !$is_websocket && $self->_is_sse_request($request)
2208 624 0 22 $name eq "upgrade" and lc $value eq "websocket"
2220 187 0 22 $has_upgrade && $has_connection_upgrade && $has_ws_key
2357 7 134 11 $connection_header and $connection_header =~ /close/
2363 2 0 1 $connection_header and $connection_header =~ /keep-alive/
2478 17 0 0 $expect_continue and not $continue_sent
2486 1 0 0 length $weak_self->{'buffer'} == 0 and not $weak_self->{'closed'}
2503 1 0 0 ref $data eq "HASH" and $data->{'error'}
2517 0 1 0 $weak_self->{'max_body_size'} and $bytes_read > $weak_self->{'max_body_size'}
2563 16 0 12 length $weak_self->{'buffer'} == 0 and not $weak_self->{'closed'}
2577 16 0 0 $weak_self->{'closed'} and length $weak_self->{'buffer'} == 0
2627 2 0 1 $h->[0] eq "connection" and lc($h->[1]) =~ /keep-alive/
2821 0 0 2 $handle and $handle->can("setsockopt")
2846 156 0 18 defined $pending and length $pending
2921 0 0 0 defined $query and length $query
2961 271 0 2 not $reason and $self->{'server'}
0 2 0 not $reason and $self->{'server'} and $self->{'server'}{'shutting_down'}
2973 243 0 30 $self->{'current_connection_state'} and not $self->{'websocket_mode'}
243 0 30 $self->{'current_connection_state'} and not $self->{'websocket_mode'} and not $self->{'sse_mode'}
2981 255 2 16 $self->{'websocket_mode'} and not $is_completion
3002 256 1 16 $self->{'receive_pending'} and not $self->{'receive_pending'}->is_ready
3046 20 0 9 $stream->{'body_pending'} and not $stream->{'body_pending'}->is_ready
3076 136 14 123 $self->{'server'}{'shutting_down'} and keys %{$$self{"server"}{"connections"};} == 0
150 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
3150 0 0 45 $handle and $handle->isa("IO::Socket::SSL")
3269 231 0 45 $self->{'tls_enabled'} and $self->{'tls_info'}
3309 0 0 15 $self->{'sse_started'} and not $self->{'closed'}
0 0 15 $self->{'sse_started'} and not $self->{'closed'} and $self->{'stream'}
0 1 14 $self->{'sse_started'} and not $self->{'closed'} and $self->{'stream'} and $self->{'stream'}->write_handle
3359 14 0 1 defined $content_length && $content_length > 0
3391 6 0 1 $has_body and not $body_complete
3395 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
3466 32 0 17 defined $event->{'event'} and length $event->{'event'}
3477 41 0 7 defined $event->{'id'} and length $event->{'id'}
3618 0 0 1 $handle and $handle->can("setsockopt")
3863 18 0 0 $weak_self->{'receive_pending'} and not $weak_self->{'receive_pending'}->is_ready
4011 0 0 130 $rsv and ref $rsv eq "ARRAY"
4021 130 0 0 $opcode >= 3 and $opcode <= 7
130 0 0 $opcode >= 11 and $opcode <= 15
4029 130 0 0 $opcode == 8 || $opcode == 9 || $opcode == 10 and length $bytes > 125
4089 0 0 0 $code >= 1007 and $code <= 1011
0 0 0 $code >= 3000 and $code <= 4999
4147 28 0 10 $self->{'receive_pending'} and not $self->{'receive_pending'}->is_ready
28 0 10 $self->{'receive_pending'} and not $self->{'receive_pending'}->is_ready and @{$self->{'receive_queue'};}
4169 0 3 7 $self->{'sync_file_threshold'} > 0 and $length <= $self->{'sync_file_threshold'}
4225 5 0 1 $offset and $offset > 0

or 2 conditions

line l !l condition
195 203 72 $args{'extensions'} // {}
203 72 $args{'state'} // {}
203 72 $args{'tls_enabled'} // 0
203 72 $args{'timeout'} // 60
203 72 $args{'request_timeout'} // 0
203 72 $args{'ws_idle_timeout'} // 0
203 72 $args{'sse_idle_timeout'} // 0
203 72 $args{'max_receive_queue'} // 1000
203 72 $args{'max_ws_frame_size'} // 65536
203 72 $args{'sync_file_threshold'} // 65536
203 72 $args{'validate_events'} // 0
203 72 $args{'write_high_watermark'} // 65536
203 72 $args{'write_low_watermark'} // 16384
44 231 $args{'h2c_enabled'} // 0
203 72 $args{'transport_type'} // "tcp"
235 199 1 $handle->peerhost // "127.0.0.1"
236 199 1 $handle->peerport // 0
237 200 0 $handle->sockhost // "127.0.0.1"
238 200 0 $handle->sockport // 5000
442 67 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 13 0 $pseudo->{':path'} // "/"
1245 0 13 $query_string //= ""
1276 13 0 $pseudo->{':method'} // "GET"
1362 74 0 $ss->{'send_queue'} ||= []
1378 33 0 $ss->{'send_queue_bytes'} // 0
1389 33 0 $ss->{'send_queue_bytes'} // 0
1415 38 0 $event->{'type'} // ""
1427 12 0 $event->{'status'} // 200
1428 1 11 $event->{'headers'} // []
1454 0 12 $ss->{'send_queue'} //= []
1455 0 12 $ss->{'send_queue_bytes'} //= 0
1473 6 0 $ss->{'send_queue'} ||= []
1474 6 0 $ss->{'send_queue_bytes'} // 0
1487 23 0 $ss->{'send_queue_bytes'} // 0
1495 23 0 $ss->{'send_queue'} ||= []
1496 23 0 $ss->{'send_queue_bytes'} // 0
1507 1 0 $ss->{'send_queue'} ||= []
1508 1 0 $ss->{'send_queue_bytes'} // 0
1514 2 0 $event->{'interval'} // 0
1580 3 0 substr($bytes, 2) // ""
1653 4 0 $reason // ""
1820 384 0 $self->{'stream'}{'writequeue'} // []
1860 90 2 $ss->{'send_queue_bytes'} // 0
1939 544 2 $reason //= "connection closed"
1959 5 0 $ss->{'send_queue_bytes'} // 0
1966 4 1 $ss->{'stream_drain_waiters'} //= []
2000 0 0 $timeout // 0
2102 2 0 $comment // ""
2344 155 0 $request->{'http_version'} // "1.1"
2418 172 0 $request->{'chunked'} // 0
2419 172 0 $request->{'expect_continue'} // 0
2505 0 0 $data->{'message'} // "Bad Request"
2514 1 0 $data // ""
2530 1 0 $data // ""
2619 172 0 $request->{'method'} // ""
2620 172 0 $request->{'http_version'} // "1.1"
2644 328 0 $event->{'type'} // ""
2658 158 0 $event->{'status'} // 200
2659 1 157 $event->{'trailers'} // 0
2661 158 0 $event->{'status'} // 200
2662 158 0 $event->{'headers'} // []
2711 1 0 $event->{'more'} // 0
2735 3 161 $event->{'offset'} // 0
2754 148 0 $body //= ""
2755 127 21 $event->{'more'} // 0
2794 1 0 $event->{'headers'} // []
2797 0 1 $weak_self->{'_resp_pending'} // ""
2910 199 0 $request->{'method'} // "-"
199 0 $request->{'raw_path'} // "/"
199 0 $request->{'http_version'} // "1.1"
199 0 $self->{'response_status'} // "-"
199 0 $self->{'_response_size'} // 0
199 0 $request->{'headers'} // []
2944 8 28 $self->{'ws_disconnect_code'} // 1006
32 4 $self->{'ws_disconnect_reason'} // ""
2966 271 2 $reason //= "client_closed"
2992 0 15 $self->{'sse_disconnect_reason'} // "client_closed"
3016 4 0 $reason //= ""
3109 0 15 $self->{'sse_disconnect_reason'} // "client_closed"
3369 0 0 ($weak_self ? $weak_self->{'sse_disconnect_reason'} : undef) // "client_closed"
3472 48 0 $event->{'data'} // ""
3495 5 0 $event->{'comment'} // ""
3518 34 0 $event->{'type'} // ""
3531 14 1 $event->{'status'} // 200
3533 13 2 $event->{'headers'} // []
3598 0 0 $event->{'interval'} // 0
3810 42 0 $event->{'type'} // ""
3913 1 0 $event->{'status'} // 403
3916 1 0 $event->{'headers'} // []
3923 1 0 $event->{'body'} // ""
3949 0 2 $event->{'code'} // 1000
3950 0 2 $event->{'reason'} // ""
3969 0 0 $event->{'interval'} // 0
4083 0 0 substr($bytes, 2) // ""

or 3 conditions

line l !l&&r !l&&!r condition
218 273 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 13 0 0 eval { do { &decode("UTF-8", $unescaped, 1) } } // $unescaped
1276 13 0 0 $pseudo->{':scheme'} // $self->_get_scheme
1584 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
2426 5 1 166 defined $content_length && $content_length > 0 || $is_chunked
2679 1 3 154 $is_head_request or $is_http10
2772 10 1 131 $more or $expects_trailers
2910 197 2 0 $self->{'client_host'} // ($self->{'transport_type'} eq "unix" ? "unix" : "-")
3757 23 0 0 $weak_self->{'websocket_mode'} or $weak_self->{'closed'}
4021 0 0 130 $opcode >= 3 and $opcode <= 7 or $opcode >= 11 and $opcode <= 15
4029 0 0 130 $opcode == 8 || $opcode == 9 || $opcode == 10
4089 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
4163 1 9 0 $length //= $file_size - $offset