protocol-http2 0.16.0 → 0.18.0

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: 9b04aa8b3ac2dcabc6345c950831b612f2343244a17655cb955f668d91f427dd
4
- data.tar.gz: 3796185ba4e59277d08683ee2e80ffab91c9efa8fb24b4cfbc7c69ba8beb7995
3
+ metadata.gz: d3d7de9d5cea0bc568ee4cfe9c36ec1857d3e268b5b183bda0602fb66862faf3
4
+ data.tar.gz: 2a5e7b2fae05cb3ff96cc821160f745e80ffd45eef1363ea99c4c029853f5073
5
5
  SHA512:
6
- metadata.gz: 44c60b4ceeb39e553ed362c117bc518a7a19106436fe006b191b94128deff6c7ca2f7433c0e78c1c4b86925dd5ab662cb7b221e8dd46806dabb4c8f3aae76d1f
7
- data.tar.gz: d66e9905d31273733764cbf7ee6514a089e010e3afc45816aec0e1e993dbc0cb495c5144c89afec03f83f54d30a746a437eb78cdb57336f9c97455a0e75c9ee3
6
+ metadata.gz: 15841f05ca83452964396dd3e9b2c7d0f7dd456d38495772545e3a57b1991a589a3fb68b99721c3303af76318dde23b8d8839242310da172b5ef715efcc0da61
7
+ data.tar.gz: 7148bc4ba24d364960beee692fce5f7be577bc147045ae1a829cb26b64c363501307359b998c16e36bd6bcfcfb6a2405f7f93d4ed8db2c231b5a1be814792fd9
checksums.yaml.gz.sig CHANGED
Binary file
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2023, by Samuel Williams.
4
+ # Copyright, 2019-2024, by Samuel Williams.
5
5
  # Copyright, 2023, by Marco Concetto Rudilosso.
6
6
 
7
7
  require_relative 'framer'
@@ -62,8 +62,9 @@ module Protocol
62
62
  @remote_settings.maximum_frame_size
63
63
  end
64
64
 
65
+ # The maximum number of concurrent streams that this connection can initiate:
65
66
  def maximum_concurrent_streams
66
- @local_settings.maximum_concurrent_streams
67
+ @remote_settings.maximum_concurrent_streams
67
68
  end
68
69
 
69
70
  attr :framer
@@ -143,9 +144,14 @@ module Protocol
143
144
  end
144
145
  end
145
146
 
147
+ def synchronize
148
+ yield
149
+ end
150
+
146
151
  # Reads one frame from the network and processes. Processing the frame updates the state of the connection and related streams. If the frame triggers an error, e.g. a protocol error, the connection will typically emit a goaway frame and re-raise the exception. You should continue processing frames until the underlying connection is closed.
147
152
  def read_frame
148
153
  frame = @framer.read_frame(@local_settings.maximum_frame_size)
154
+
149
155
  # puts "#{self.class} #{@state} read_frame: class=#{frame.class} stream_id=#{frame.stream_id} flags=#{frame.flags} length=#{frame.length} (remote_stream_id=#{@remote_stream_id})"
150
156
  # puts "Windows: local_window=#{@local_window.inspect}; remote_window=#{@remote_window.inspect}"
151
157
 
@@ -207,11 +213,25 @@ module Protocol
207
213
  end
208
214
 
209
215
  def write_frame(frame)
210
- @framer.write_frame(frame)
216
+ synchronize do
217
+ @framer.write_frame(frame)
218
+ end
219
+
220
+ # The IO is already synchronized, and we don't want additional contention.
221
+ @framer.flush
211
222
  end
212
223
 
213
224
  def write_frames
214
- yield @framer
225
+ if @framer
226
+ synchronize do
227
+ yield @framer
228
+ end
229
+
230
+ # See above note.
231
+ @framer.flush
232
+ else
233
+ raise EOFError, "Connection closed!"
234
+ end
215
235
  end
216
236
 
217
237
  def update_local_settings(changes)
@@ -370,7 +390,8 @@ module Protocol
370
390
  raise ProtocolError, "Invalid stream id: #{stream_id} <= #{@remote_stream_id}!"
371
391
  end
372
392
 
373
- if @streams.size < self.maximum_concurrent_streams
393
+ # We need to validate that we have less streams than the specified maximum:
394
+ if @streams.size < @local_settings.maximum_concurrent_streams
374
395
  stream = accept_stream(stream_id)
375
396
  @remote_stream_id = stream_id
376
397
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2023, by Samuel Williams.
4
+ # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
6
  require_relative 'error'
7
7
 
@@ -41,6 +41,10 @@ module Protocol
41
41
  @frames = frames
42
42
  end
43
43
 
44
+ def flush
45
+ @stream.flush
46
+ end
47
+
44
48
  def close
45
49
  @stream.close
46
50
  end
@@ -69,7 +73,7 @@ module Protocol
69
73
  # Read the header:
70
74
  length, type, flags, stream_id = read_header
71
75
 
72
- # Async.logger.debug(self) {"read_frame: length=#{length} type=#{type} flags=#{flags} stream_id=#{stream_id} -> klass=#{@frames[type].inspect}"}
76
+ # Console.debug(self) {"read_frame: length=#{length} type=#{type} flags=#{flags} stream_id=#{stream_id} -> klass=#{@frames[type].inspect}"}
73
77
 
74
78
  # Allocate the frame:
75
79
  klass = @frames[type] || Frame
@@ -78,19 +82,19 @@ module Protocol
78
82
  # Read the payload:
79
83
  frame.read(@stream, maximum_frame_size)
80
84
 
81
- # Async.logger.debug(self, name: "read") {frame.inspect}
85
+ # Console.debug(self, name: "read") {frame.inspect}
82
86
 
83
87
  return frame
84
88
  end
85
89
 
90
+ # Write a frame to the underlying IO.
91
+ # After writing one or more frames, you should call flush to ensure the frames are sent to the remote peer.
92
+ # @parameter frame [Frame] the frame to write.
86
93
  def write_frame(frame)
87
- # Async.logger.debug(self, name: "write") {frame.inspect}
94
+ # Console.debug(self, name: "write") {frame.inspect}
88
95
 
89
96
  frame.write(@stream)
90
97
 
91
- # Don't call @stream.flush here because it can cause significant contention if there is a semaphore around this method.
92
- # @stream.flush
93
-
94
98
  return frame
95
99
  end
96
100
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2023, by Samuel Williams.
4
+ # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
6
  require_relative 'connection'
7
7
 
@@ -31,7 +31,9 @@ module Protocol
31
31
  send_settings(settings)
32
32
 
33
33
  read_frame do |frame|
34
- raise ProtocolError, "First frame must be #{SettingsFrame}, but got #{frame.class}" unless frame.is_a? SettingsFrame
34
+ unless frame.is_a? SettingsFrame
35
+ raise ProtocolError, "First frame must be #{SettingsFrame}, but got #{frame.class}"
36
+ end
35
37
  end
36
38
  else
37
39
  raise ProtocolError, "Cannot read connection preface in state #{@state}"
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2023, by Samuel Williams.
4
+ # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
6
  module Protocol
7
7
  module HTTP2
8
- VERSION = "0.16.0"
8
+ VERSION = "0.18.0"
9
9
  end
10
10
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protocol-http2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -40,7 +40,7 @@ cert_chain:
40
40
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
41
41
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
42
42
  -----END CERTIFICATE-----
43
- date: 2024-01-26 00:00:00.000000000 Z
43
+ date: 2024-06-10 00:00:00.000000000 Z
44
44
  dependencies:
45
45
  - !ruby/object:Gem::Dependency
46
46
  name: protocol-hpack
@@ -103,7 +103,9 @@ files:
103
103
  homepage: https://github.com/socketry/protocol-http2
104
104
  licenses:
105
105
  - MIT
106
- metadata: {}
106
+ metadata:
107
+ documentation_uri: https://socketry.github.io/protocol-http2/
108
+ source_code_uri: https://github.com/socketry/protocol-http2.git
107
109
  post_install_message:
108
110
  rdoc_options: []
109
111
  require_paths:
@@ -112,14 +114,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
112
114
  requirements:
113
115
  - - ">="
114
116
  - !ruby/object:Gem::Version
115
- version: '3.0'
117
+ version: '3.1'
116
118
  required_rubygems_version: !ruby/object:Gem::Requirement
117
119
  requirements:
118
120
  - - ">="
119
121
  - !ruby/object:Gem::Version
120
122
  version: '0'
121
123
  requirements: []
122
- rubygems_version: 3.5.3
124
+ rubygems_version: 3.5.9
123
125
  signing_key:
124
126
  specification_version: 4
125
127
  summary: A low level implementation of the HTTP/2 protocol.
metadata.gz.sig CHANGED
Binary file