高木のブログ

【Faraday】HTTP/2 でリクエストする

2022/11/01

HTTP/2 でしか何故か受け付けない API があったので調べた

手順

Typhoeus の Faraday 用のミドルウェア(アダプター)、faraday-typhoeus を使う

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'faraday'
  gem 'faraday-typhoeus'
end

conn = Faraday.new(url: 'https://example.com') do |conn|
  conn.adapter :typhoeus, http_version: :httpv2_0
end

puts conn.get('/').body

動作確認

これで実際に HTTP/2 でリクエストできているのかを確認する
確認方法には nc コマンドを使った

$ ( echo "HTTP/1.1 200 OK"; echo; echo "Hello World" ) | nc -l 5555

HTTP/1.1

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'faraday'
end

conn = Faraday.new(url: 'http://localhost:5555')

puts conn.get('/').body
$ ruby faraday-http2.rb
Hello World
$ ( echo "HTTP/1.1 200 OK"; echo; echo "Hello World" ) | nc -l 5555
GET / HTTP/1.1
User-Agent: Faraday v2.6.0
Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
Accept: */*
Host: localhost:5555

シンプルに Faraday を使うと HTTP/1.1 になっている

HTTP/2

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'faraday'
  gem 'faraday-typhoeus'
end

conn = Faraday.new(url: 'http://localhost:5555') do |conn|
  conn.adapter :typhoeus, http_version: :httpv2_0
end

puts conn.get('/').body
$ ruby faraday-http2.rb
Hello World
$ ( echo "HTTP/1.1 200 OK"; echo; echo "Hello World" ) | nc -l 5555
GET / HTTP/1.1
Host: localhost:5555
Accept: */*
Accept-Encoding: deflate, gzip
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
User-Agent: Faraday v2.6.0

HTTP/1.1 になっているが、以下が追加されているので HTTP/2 でリクエストできていると判断(しても良さそう?)

Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA

ytkg

Written by ytkg, Twitter, GitHub