Actions
Feature #15624
closedAllow net/http Response to close before reading entire body
Status:
Rejected
Assignee:
-
Target version:
-
Description
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
Actions
Like0
Like0