http-protocol 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6878c2aaace06793d74e1e5d15672c8e6eec05603b270f180aa9c294d55318be
4
- data.tar.gz: 9b95862aa4a58d6f536107d46c9f769e5e16b2168cebafe02fd5f6912dc09b10
3
+ metadata.gz: 84fb025f5c2cc394607d0c28b592c8fda12285a8340c0d3eb2a5ec8328aab371
4
+ data.tar.gz: 98a7233fe2c8e0f706d9738b0845bd86a9edd7e4fadf4335fc30763a3a468927
5
5
  SHA512:
6
- metadata.gz: f8781ccf5b026240587e2c57279043d814019bef9736a1779ea55e42da36e4cb5bb751b708d06be27b616342b318be263c69eb4d609d00d853568e361450bd81
7
- data.tar.gz: 3c329fabfdfd669110d12ddd7b3a3153ea9625ddc4dfe44db5e0e316e5bca60065a00d68f299f6ea7f4ddf36c3766d012c36e8d819d685940afc3fd51d0827d6
6
+ metadata.gz: 5a436986f8203efcc943a7353acb3a8c9489f5e5576127b913482b684f4d879de6f4b88b05c9b17bd5c981826177be00b7f1f2876a6239ee0a5b7c17763afc84
7
+ data.tar.gz: 4453a7d3c4cab53a2ba6fdb1db9eb82988157582cd9c01b8aca9dd437d13cd6adfc4b20e1e03065cfc0150c497f67f8a05de3d1706d0ec932519e291227216a2
@@ -81,6 +81,12 @@ module HTTP
81
81
  @state == :closed
82
82
  end
83
83
 
84
+ def close
85
+ send_goaway
86
+
87
+ @framer.close
88
+ end
89
+
84
90
  def encode_headers(headers, buffer = String.new.b)
85
91
  HPACK::Compressor.new(buffer, @encoder).encode(headers)
86
92
 
@@ -103,8 +109,8 @@ module HTTP
103
109
  attr :streams
104
110
 
105
111
  def read_frame
106
- frame = @framer.read_frame
107
- # puts "#{self.class} #{@state} read_frame: #{frame.inspect}"
112
+ frame = @framer.read_frame(@local_settings.maximum_frame_size)
113
+ # puts "#{self.class} #{@state} read_frame: class=#{frame.class} flags=#{frame.flags} length=#{frame.length}"
108
114
 
109
115
  yield frame if block_given?
110
116
 
@@ -113,6 +119,15 @@ module HTTP
113
119
  return frame
114
120
  rescue ProtocolError => error
115
121
  send_goaway(error.code || PROTOCOL_ERROR, error.message)
122
+
123
+ raise
124
+ rescue HTTP::HPACK::CompressionError => error
125
+ send_goaway(COMPRESSION_ERROR, error.message)
126
+
127
+ raise
128
+ rescue
129
+ send_goaway(PROTOCOL_ERROR, $!.message)
130
+
116
131
  raise
117
132
  end
118
133
 
@@ -136,11 +151,10 @@ module HTTP
136
151
 
137
152
  def receive_goaway(frame)
138
153
  @state = :closed
139
- @framer.close
140
154
  end
141
155
 
142
156
  def write_frame(frame)
143
- # puts "#{self.class} #{@state} write_frame: #{frame.inspect}"
157
+ # puts "#{self.class} #{@state} write_frame: class=#{frame.class} flags=#{frame.flags} length=#{frame.length}"
144
158
  @framer.write_frame(frame)
145
159
  end
146
160
 
@@ -246,6 +260,10 @@ module HTTP
246
260
  end
247
261
 
248
262
  def receive_headers(frame)
263
+ if frame.stream_id == 0
264
+ raise ProtocolError, "Cannot receive headers for stream 0!"
265
+ end
266
+
249
267
  if stream = @streams[frame.stream_id]
250
268
  stream.receive_headers(frame)
251
269
 
@@ -34,13 +34,13 @@ module HTTP
34
34
  flag_set?(END_HEADERS)
35
35
  end
36
36
 
37
- def read(io)
37
+ def read(io, maximum_frame_size)
38
38
  super
39
39
 
40
40
  unless end_headers?
41
41
  @continuation = ContinuationFrame.new
42
42
 
43
- @continuation.read(io)
43
+ @continuation.read(io, maximum_frame_size)
44
44
  end
45
45
  end
46
46
 
@@ -29,6 +29,9 @@ module HTTP
29
29
  PADDED = 0x8
30
30
  PRIORITY = 0x20
31
31
 
32
+ MAXIMUM_ALLOWED_WINDOW_SIZE = 0x7FFFFFFF
33
+ MAXIMUM_ALLOWED_FRAME_SIZE = 0xFFFFFF
34
+
32
35
  class Frame
33
36
  include Comparable
34
37
 
@@ -156,8 +159,13 @@ module HTTP
156
159
  @payload = io.read(@length)
157
160
  end
158
161
 
159
- def read(io)
162
+ def read(io, maximum_frame_size = MAXIMUM_ALLOWED_FRAME_SIZE)
160
163
  read_header(io) unless @length
164
+
165
+ if @length > maximum_frame_size
166
+ raise FrameSizeError, "Frame length #{@length} exceeds maximum frame size #{maximum_frame_size}!"
167
+ end
168
+
161
169
  read_payload(io)
162
170
  end
163
171
 
@@ -78,7 +78,7 @@ module HTTP
78
78
  return string
79
79
  end
80
80
 
81
- def read_frame
81
+ def read_frame(maximum_frame_size = MAXIMUM_ALLOWED_FRAME_SIZE)
82
82
  # Read the header:
83
83
  length, type, flags, stream_id = read_header
84
84
 
@@ -89,7 +89,7 @@ module HTTP
89
89
  frame = klass.new(stream_id, flags, type, length)
90
90
 
91
91
  # Read the payload:
92
- frame.read(@io)
92
+ frame.read(@io, maximum_frame_size)
93
93
 
94
94
  return frame
95
95
  end
@@ -97,6 +97,7 @@ module HTTP
97
97
  def write_frame(frame)
98
98
  # puts "framer: write_frame #{frame.inspect}"
99
99
  frame.write(@io)
100
+
100
101
  @io.flush
101
102
  end
102
103
 
@@ -24,9 +24,6 @@ module HTTP
24
24
  module Protocol
25
25
  module HTTP2
26
26
  class Settings
27
- MAXIMUM_ALLOWED_WINDOW_SIZE = 0x7FFFFFFF
28
- MAXIMUM_ALLOWED_FRAME_SIZE = 0xFFFFFF
29
-
30
27
  HEADER_TABLE_SIZE = 0x1
31
28
  ENABLE_PUSH = 0x2
32
29
  MAXIMUM_CONCURRENT_STREAMS = 0x3
@@ -20,6 +20,6 @@
20
20
 
21
21
  module HTTP
22
22
  module Protocol
23
- VERSION = "0.3.1"
23
+ VERSION = "0.3.2"
24
24
  end
25
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http-protocol
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-19 00:00:00.000000000 Z
11
+ date: 2018-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http-hpack