Issue #15624 has been reported by sam.saffron (Sam Saffron).

----------------------------------------
Feature #15624: Allow net/http Response to close before reading entire body
https://bugs.ruby-lang.org/issues/15624

* Author: sam.saffron (Sam Saffron)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
Currently net/http has:

```
  def reading_body(sock, reqmethodallowbody)  #:nodoc: internal use only
    @socket = sock
    @body_exist = reqmethodallowbody && self.class.body_permitted?
    begin
      yield
      self.body   # ensure to read body
    ensure
      @socket = nil
    end
  end

```

The call to `self.body` ensures that unconditionally if you GET you must read the entire body. 

For certain use cases a "partial" GET is useful, you may only be interested in reading the first 10000 bytes of a page and can act on that. 

Trouble is this API dictates that unconditionally the entire GET request must be consume. 

Proposal:

Add #close on Response to allow for early closing of stream. 

So, instead of:

```
  def get_status_code(headers)
    status_code = nil

    Net::HTTP.start(@uri.host, @uri.port, use_ssl: @uri.is_a?(URI::HTTPS)) do |http|
      http.open_timeout = timeout
      http.read_timeout = timeout
      http.request_get(@uri.request_uri, headers) do |resp|
        status_code = resp.code.to_i

        resp.instance_variable_set(:@body_exist, false)
        resp.instance_variable_set(:@body, "")
      end
    end

    status_code
  end

```

We could have:

```
def get_status_code(headers)
    status_code = nil

    Net::HTTP.start(@uri.host, @uri.port, use_ssl: @uri.is_a?(URI::HTTPS)) do |http|
      http.open_timeout = timeout
      http.read_timeout = timeout
      http.request_get(@uri.request_uri, headers) do |resp|
        status_code = resp.code.to_i
        resp.close
    end

    status_code
  end
```

Happy to submit the patch



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>