Most Ruby web API libraries use Net::HTTP (because it's ubiquitous), but I want to use them in my non-blocking EventMachine-based applications, and I don't want Net::HTTP to block. I therefore wrote this.
Using the magic of Ruby's Fibers, we monkeypatch Net::HTTP to use the faster, nonblocking em-http-request under the hood. Obviously this will only work from inside the EventMachine event loop, and from within a spawned fiber:
require 'em-net-http'
EM.run do
Fiber.new do
Net::HTTP.start('encrypted.google.com', :use_ssl=>true) do |http|
res = http.get('/search?q=james')
puts res.body
end
EM.stop_event_loop
end.resume
end
The above will run without blocking your carefully-tuned nonblocking webapp.
There are a few tests (taking advantage of the very useful Mimic gem) that assert that responses are identical to those created by Net::HTTP. These are by no means exhaustive; if you're using Net::HTTP in some other way and the em-net-http's behaviour is not what you expect, do send me a failing test case.
Currently tested with Ruby (MRI) 2.2.3 and 2.3.1.
Caveat
The Net::HTTP API is a many-headed hydra -- I haven't patched much of it. Your mileage may therefore vary. Please feed me patches, pull requests and bug reports!
Thanks
- Luke Redpath, for Mimic.
- Mathieu Ravaux, for adding streaming and buffering support.
- Paul Bonaud, for improving exception raising.
- Jon Swope, Ary Borenszweig, Neeraj and Ilya Maykov for bug fixes.