Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
dc86ffa
memoize padding bytes, speed up huffman encoding ~2x
HoneyryderChuck May 15, 2026
092918e
use bytesplice (when available) when reading chunks from a string buffer
HoneyryderChuck May 21, 2026
066112f
reducing the number of string allocations on Decompressor#integer
HoneyryderChuck May 21, 2026
35e7407
correctly set buffer size for SETTINGS frame buffer
HoneyryderChuck May 21, 2026
8e99b96
eliminate DEFINED_SETTINGS O(n) walk by direct lookup
HoneyryderChuck May 21, 2026
ad61754
manage flags as integers instead of as arrays of symbols
HoneyryderChuck May 22, 2026
e0adbbc
improving typing
HoneyryderChuck May 22, 2026
914870d
removing support for blocked frame type
HoneyryderChuck May 22, 2026
e746110
create settings array via map instead of new array then append pattern
HoneyryderChuck May 22, 2026
cea03b1
took encode_headers logic away from #encode, which does raw frame enc…
HoneyryderChuck May 22, 2026
afb5a7f
avoid slicing string too much when generating continuation frames
HoneyryderChuck May 22, 2026
e68000c
when processing continuation frames, bookkeep size of payloads to avo…
HoneyryderChuck May 22, 2026
00110d3
improve :shorter and :always header string encoding by avoiding memmo…
HoneyryderChuck May 22, 2026
53e1245
pack priority frame data in one single #pack call
HoneyryderChuck May 22, 2026
83dbf4a
improve head encoding when dealing with dynamic header table
HoneyryderChuck May 22, 2026
94fedb8
replace String#ord with String#getbyte for single character byte
HoneyryderChuck May 24, 2026
a7fa55f
refactor Connection#send as a plain case/when block
HoneyryderChuck May 25, 2026
e8c4e85
remove needless #force_encoding call
HoneyryderChuck May 25, 2026
1377f3d
removing redundant cast to to_a
HoneyryderChuck May 25, 2026
69e48ab
adjusted frame usage to make type checking more accurate
HoneyryderChuck May 25, 2026
44556e1
simplify h2c code by allowing frame to generate settings frame from a…
HoneyryderChuck May 25, 2026
1d8745b
replace #append_str usage for chr with String#<<
HoneyryderChuck May 25, 2026
04d110e
create continuation frame hash instead of merging with headers
HoneyryderChuck May 25, 2026
fac31e7
use Hash#delete_if instead of Hash#delete_while for streams-recently-…
HoneyryderChuck May 25, 2026
ab55a71
frame buffer: forego allocation of intermediate string while parittio…
HoneyryderChuck May 25, 2026
2bc6cbe
make sure a string is returned.
HoneyryderChuck May 26, 2026
518582a
turn off typecheck when running h2spec
HoneyryderChuck May 26, 2026
f6d7d09
only post simplecov results if working from the main repo
HoneyryderChuck May 26, 2026
54a5bf1
remove extra local pending setting
HoneyryderChuck Jun 8, 2026
3e2ee88
set minimum coverage on merge
HoneyryderChuck Jun 16, 2026
bec2bc4
bump version to 1.2.0
HoneyryderChuck Jun 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -78,5 +78,6 @@ jobs:
bundle exec rake coverage:report

- uses: joshmfrankel/simplecov-check-action@main
if: ${{ github.repository == 'igrigorik/http-2' }}
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
2 changes: 2 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ Layout/HeredocIndentation:
- 'lib/tasks/generate_huffman_table.rb'
- 'example/*'

Layout/LeadingCommentSpace:
AllowRBSInlineAnnotation: true

Metrics/BlockLength:
Enabled: false
Expand Down
1 change: 0 additions & 1 deletion .simplecov
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,4 @@ SimpleCov.start do
add_filter "/spec/"
add_filter "/lib/http/2/base64"
coverage_dir "coverage"
minimum_coverage(RUBY_ENGINE == "truffleruby" ? 85 : 90)
end
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
## 1.2.0

### Improvements

A lot of optimizations around reducing allocated objects, avoiding expensive frequent operations, and simpler data structures. A few highlights:

* precompute huffman padding bytes.
* use `String#bytesplice` (when available) to save an intermediate string in buffer ops.
* bookkeep header dynamic table offsets to improve lookups.
* streams recently closed: use `Hash#delete_if` with early break instead of `Hash#delete_while` to avoid intermediate hash.
* Store frame flags as integers instead of arrays of symbols in frame hashes.
* NOTE: while frame hashes are an internal representation, they get exposed via `:frame_received` or `:frame_sent` callbacks. in case you're relying on the `:flags` field, you'll have to adapt your code accordingly.

## 1.1.3

HTTP2::FrameBuffer#clear: clears the buffered data chunks
Expand Down
6 changes: 4 additions & 2 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@ namespace :coverage do
require "simplecov"

puts Dir["coverage/**/.resultset.json"].inspect
SimpleCov.collate Dir["coverage/**/.resultset.json"]
SimpleCov.collate Dir["coverage/**/.resultset.json"] do
minimum_coverage 95
end
end
end

Expand Down Expand Up @@ -94,7 +96,7 @@ task :h2spec do
"Or Download the binary from https://github.com/summerwind/h2spec/releases"
end

server_pid = Process.spawn("ruby example/server.rb -p 9000", out: File::NULL)
server_pid = Process.spawn({ "RUBYOPT" => nil }, "ruby example/server.rb -p 9000", out: File::NULL)
sleep RUBY_ENGINE == "ruby" ? 5 : 20
system("#{h2spec} -p 9000 -o 2 --strict")
Process.kill("TERM", server_pid)
Expand Down
2 changes: 1 addition & 1 deletion lib/http/2/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def send_connection_preface
end

def self.settings_header(settings)
frame = Framer.new.generate(type: :settings, stream: 0, payload: settings)
frame = Framer.new.generate(type: :settings, stream: 0, flags: 0, payload: settings)
Base64.urlsafe_encode64(frame[9..-1])
end

Expand Down
Loading
Loading