From: sam.saffron@... Date: 2019-02-27T03:25:25+00:00 Subject: [ruby-core:91628] [Ruby trunk Feature#15624] Allow net/http Response to close before reading entire body 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: