http-protocol 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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