Skip to content

Commit 3aa1f1d

Browse files
Add support for net-http2 backend
1 parent 90f0bb7 commit 3aa1f1d

3 files changed

Lines changed: 62 additions & 0 deletions

File tree

lib/webmock.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
require_relative 'webmock/http_lib_adapters/http_lib_adapter_registry'
4747
require_relative 'webmock/http_lib_adapters/http_lib_adapter'
4848
require_relative 'webmock/http_lib_adapters/net_http'
49+
require_relative 'webmock/http_lib_adapters/net_http2_adapter'
4950
require_relative 'webmock/http_lib_adapters/http_rb_adapter'
5051
require_relative 'webmock/http_lib_adapters/httpclient_adapter'
5152
require_relative 'webmock/http_lib_adapters/patron_adapter'
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
require 'net-http2'
2+
3+
module WebMock
4+
module HttpLibAdapters
5+
class NetHttp2Adapter < HttpLibAdapter
6+
adapter_for :net_http2
7+
8+
OriginalClient = NetHttp2::Client unless const_defined?(:OriginalClient)
9+
OriginalStream = NetHttp2::Stream unless const_defined?(:OriginalStream)
10+
11+
def self.enable!
12+
NetHttp2.send(:remove_const, :Stream)
13+
NetHttp2.send(:remove_const, :Client)
14+
NetHttp2.send(:const_set, :Stream, @webMockNetHTTP2Stream)
15+
NetHttp2.send(:const_set, :Client, @webMockNetHTTP2Client)
16+
end
17+
18+
def self.disable!
19+
NetHttp2.send(:remove_const, :Stream)
20+
NetHttp2.send(:remove_const, :Client)
21+
NetHttp2.send(:const_set, :Stream, OriginalStream)
22+
NetHttp2.send(:const_set, :Client, OriginalClient)
23+
end
24+
25+
@webMockNetHTTP2Stream = Class.new(OriginalStream) do
26+
def send_request_data
27+
uri = @request.uri.dup
28+
uri.path = @request.full_path.to_s
29+
sig = WebMock::RequestSignature.new(@request.method, uri.to_s, body: @request.body, headers: @request.headers)
30+
WebMock::RequestRegistry.instance.requested_signatures.put(sig)
31+
32+
if webmock_response = WebMock::StubRegistry.instance.response_for_request(sig)
33+
WebMock::CallbackRegistry.invoke_callbacks({ lib: :net_http2 }, sig, webmock_response)
34+
return if webmock_response.should_timeout
35+
36+
if async?
37+
@request.emit(:headers, webmock_response.headers.merge(":status" => webmock_response.status.first.to_s))
38+
@request.emit(:body_chunk, webmock_response.body)
39+
@request.emit(:close, nil)
40+
else
41+
@headers.merge!((webmock_response.headers || {}).merge(":status" => webmock_response.status.first.to_s))
42+
@data << webmock_response.body
43+
@completed = true
44+
@mutex.synchronize { @cv.signal }
45+
end
46+
elsif WebMock.net_connect_allowed?(sig.uri)
47+
raise "WebMock NetHTTP2 backend does not support net_connect_allowed yet"
48+
else
49+
raise WebMock::NetConnectNotAllowedError, sig
50+
end
51+
end
52+
end
53+
54+
@webMockNetHTTP2Client = Class.new(OriginalClient) do
55+
def new_socket
56+
end
57+
end
58+
end
59+
end
60+
end

webmock.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
3535
s.add_development_dependency 'em-http-request', '>= 1.0.2'
3636
s.add_development_dependency 'em-synchrony', '>= 1.0.0'
3737
s.add_development_dependency 'excon', '>= 0.27.5'
38+
s.add_development_dependency 'net-http2', '>= 0.18.0'
3839
s.add_development_dependency 'minitest', '>= 5.0.0'
3940
s.add_development_dependency 'test-unit', '>= 3.0.0'
4041
s.add_development_dependency 'rdoc', '> 3.5.0'

0 commit comments

Comments
 (0)