manastech/webmock.cr

Webmock breaks HTTP::Client.get(“https…”) with Closed stream (IO::Error)

Opened this issue · 2 comments

msa7 commented

Webmock breaks

    require "webmock"
    WebMock.allow_net_connect = true
    response = HTTP::Client.get("https://api.exchangeratesapi.io/latest?base=EUR")
    p response

I got exception

Closed stream (IO::Error)
         from /usr/share/crystal/src/io.cr:128:5 in 'check_open'
         from /usr/share/crystal/src/io/buffered.cr:99:5 in 'peek'
         from /usr/share/crystal/src/io.cr:632:37 in 'gets'
         from /usr/share/crystal/src/io.cr:591:5 in 'gets'
         from /usr/share/crystal/src/io.cr:814:5 in 'read_line:chomp'
         from /usr/share/crystal/src/http/content.cr:205:7 in 'read_chunk_size'
         from /usr/share/crystal/src/http/content.cr:187:26 in 'next_chunk'
         from /usr/share/crystal/src/http/content.cr:120:7 in 'read'
         from /usr/share/crystal/src/io.cr:554:29 in 'gets_to_end'
         from /usr/share/crystal/src/http/client/response.cr:81:15 in 'consume_body_io'
         from lib/webmock/src/webmock/core_ext.cr:12:7 in 'exec_internal'
         from /usr/share/crystal/src/http/client.cr:576:5 in 'exec'
         from /usr/share/crystal/src/http/client.cr:698:5 in 'exec'
         from /usr/share/crystal/src/http/client.cr:730:7 in 'exec'
         from /usr/share/crystal/src/http/client.cr:402:3 in ‚get

Without webmock all works as expected.

P.S. Original question https://stackoverflow.com/questions/60847886/closed-stream-ioerror-with-httpclient-gethttps

I just ran in to this as well. Any Lucky app using this shard, and LuckyFlow will hit this because LuckyFlow reaches out to Google to fetch chromedriver.

As a general advice, I'd recomend against intrusive mocking mechanisms like webmock. If you can avoid it, don't use it. It's not always easy, of course.
But often it's simply possible to make a HTTP::Client instance configurable, so you can hook it up directly to a mock backend.