File Coverage

blib/lib/Protocol/HTTP2/Constants.pm
Criterion Covered Total %
statement 14 14 100.0
branch 1 2 50.0
condition 1 2 50.0
subroutine 5 5 100.0
pod 0 1 0.0
total 21 24 87.5


line stmt bran cond sub pod time code
1             package Protocol::HTTP2::Constants;
2 12     12   42920 use strict;
  12         31  
  12         277  
3 12     12   39 use warnings;
  12         12  
  12         1200  
4             use constant {
5              
6             # Header Compression
7 12         5892 MAX_INT_SIZE => 4,
8             MAX_PAYLOAD_SIZE => ( 1 << 24 ) - 1,
9              
10             # Frame
11             FRAME_HEADER_SIZE => 9,
12              
13             # Flow control
14             MAX_FCW_SIZE => ( 1 << 31 ) - 1,
15              
16             # Ping payload
17             PING_PAYLOAD_SIZE => 8,
18              
19             # Settings defaults
20             DEFAULT_HEADER_TABLE_SIZE => 4_096,
21             DEFAULT_ENABLE_PUSH => 1,
22             DEFAULT_MAX_CONCURRENT_STREAMS => 100,
23             DEFAULT_INITIAL_WINDOW_SIZE => 65_535,
24             DEFAULT_MAX_FRAME_SIZE => 16_384,
25             DEFAULT_MAX_HEADER_LIST_SIZE => 65_536,
26              
27             # Priority
28             DEFAULT_WEIGHT => 16,
29              
30             # Stream states
31             IDLE => 1,
32             RESERVED => 2,
33             OPEN => 3,
34             HALF_CLOSED => 4,
35             CLOSED => 5,
36              
37             # Endpoint types
38             CLIENT => 1,
39             SERVER => 2,
40              
41             # Preface string
42             PREFACE => "PRI * HTTP/2.0\x0d\x0a\x0d\x0aSM\x0d\x0a\x0d\x0a",
43              
44             # Frame types
45             DATA => 0,
46             HEADERS => 1,
47             PRIORITY => 2,
48             RST_STREAM => 3,
49             SETTINGS => 4,
50             PUSH_PROMISE => 5,
51             PING => 6,
52             GOAWAY => 7,
53             WINDOW_UPDATE => 8,
54             CONTINUATION => 9,
55              
56             # Flags
57             ACK => 0x1,
58             END_STREAM => 0x1,
59             END_HEADERS => 0x4,
60             PADDED => 0x8,
61             PRIORITY_FLAG => 0x20,
62              
63             # Errors
64             NO_ERROR => 0,
65             PROTOCOL_ERROR => 1,
66             INTERNAL_ERROR => 2,
67             FLOW_CONTROL_ERROR => 3,
68             SETTINGS_TIMEOUT => 4,
69             STREAM_CLOSED => 5,
70             FRAME_SIZE_ERROR => 6,
71             REFUSED_STREAM => 7,
72             CANCEL => 8,
73             COMPRESSION_ERROR => 9,
74             CONNECT_ERROR => 10,
75             ENHANCE_YOUR_CALM => 11,
76             INADEQUATE_SECURITY => 12,
77             HTTP_1_1_REQUIRED => 13,
78              
79             # SETTINGS
80             SETTINGS_HEADER_TABLE_SIZE => 1,
81             SETTINGS_ENABLE_PUSH => 2,
82             SETTINGS_MAX_CONCURRENT_STREAMS => 3,
83             SETTINGS_INITIAL_WINDOW_SIZE => 4,
84             SETTINGS_MAX_FRAME_SIZE => 5,
85             SETTINGS_MAX_HEADER_LIST_SIZE => 6,
86              
87 12     12   44 };
  12         14  
88              
89             require Exporter;
90             our @ISA = qw(Exporter);
91             our %EXPORT_TAGS = (
92             frame_types => [
93             qw(DATA HEADERS PRIORITY RST_STREAM SETTINGS PUSH_PROMISE PING GOAWAY
94             WINDOW_UPDATE CONTINUATION)
95             ],
96             errors => [
97             qw(NO_ERROR PROTOCOL_ERROR INTERNAL_ERROR FLOW_CONTROL_ERROR
98             SETTINGS_TIMEOUT STREAM_CLOSED FRAME_SIZE_ERROR REFUSED_STREAM CANCEL
99             COMPRESSION_ERROR CONNECT_ERROR ENHANCE_YOUR_CALM INADEQUATE_SECURITY
100             HTTP_1_1_REQUIRED)
101             ],
102             preface => [qw(PREFACE)],
103             flags => [qw(ACK END_STREAM END_HEADERS PADDED PRIORITY_FLAG)],
104             settings => [
105             qw(SETTINGS_HEADER_TABLE_SIZE SETTINGS_ENABLE_PUSH
106             SETTINGS_MAX_CONCURRENT_STREAMS SETTINGS_INITIAL_WINDOW_SIZE
107             SETTINGS_MAX_FRAME_SIZE SETTINGS_MAX_HEADER_LIST_SIZE)
108             ],
109             limits => [
110             qw(MAX_INT_SIZE MAX_PAYLOAD_SIZE PING_PAYLOAD_SIZE MAX_FCW_SIZE
111             DEFAULT_WEIGHT DEFAULT_HEADER_TABLE_SIZE DEFAULT_MAX_CONCURRENT_STREAMS
112             DEFAULT_ENABLE_PUSH DEFAULT_INITIAL_WINDOW_SIZE DEFAULT_MAX_FRAME_SIZE
113             DEFAULT_MAX_HEADER_LIST_SIZE FRAME_HEADER_SIZE)
114             ],
115             states => [qw(IDLE RESERVED OPEN HALF_CLOSED CLOSED)],
116             endpoints => [qw(CLIENT SERVER)],
117             );
118              
119             my %reverse;
120             {
121 12     12   51 no strict 'refs';
  12         14  
  12         1608  
122             for my $k ( keys %EXPORT_TAGS ) {
123             for my $v ( @{ $EXPORT_TAGS{$k} } ) {
124             $reverse{$k}{ &{$v} } = $v;
125             }
126             }
127             }
128              
129             sub const_name {
130 379     379 0 27994 my ( $tag, $value ) = @_;
131 379 50 50     57758 exists $reverse{$tag} ? ( $reverse{$tag}{$value} || '' ) : '';
132             }
133              
134             our @EXPORT_OK = ( qw(const_name), map { @$_ } values %EXPORT_TAGS );
135              
136             1;