👏

【Ruby】 TCPSocket で HTTP/2 フレームを送信する

2024/07/08に公開

PRI だけなら正常にスクリプトの処理はされたが、Settings フレームや ACK フレームなどを送るとフリーズしてしまった。

client.rb
require 'socket'
# https://gist.github.com/masakielastic/d1f589ba3aedcaa98dad4593004caf80
require './h2frames.rb'

# h2c テストサーバー
# https://zenn.dev/masakielastic/articles/530f9751697ed6

sock = TCPSocket.new 'localhost', 8000
sock.write(h2frames('pri'))

while !sock.closed? && !sock.eof?
  data = sock.read_nonblock(128)
  ret = data.unpack("H*").first
  puts "hex: #{ret}"
  puts "size: #{ret.size}"
end

sock.close

strace で調べると poll で止まっている

> strace ruby client.rb

writev(1, [{iov_base="size: 122", iov_len=9}, {iov_base="\n", iov_len=1}], 2size: 122
) = 10
read(5, 0x56087e2e6800, 8192)           = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=5, events=POLLIN}], 1, -1

Discussion