Issue #6482 has been updated by drbrain (Eric Hodel).

File net.http.request_response_uri.2.patch added

naruse (Yui NARUSE) wrote:
> I'm still considering this, but current thought is
> 
> The direction of this seems correct.
> On HTTP/1.1 requires Host field in the header.
> 
> This is just needed by persistence connection.
> When you connect a server and communicate two or more hosts on the server with one connection,
> the Host information must be retrieved from each request,

I have updated the patch to obey the Host header when setting the URI, and to set the Host header from the URI when creating the request (unless overridden by initheader).

> and each response should have its own uri.
> 
> This means all request/response should have its own URI information.
> So current patch's return the given URI seems not ideal.

Each response has a separate URI instance from the request due to use of dup.  I've added extra assertions in test_http.rb to the revised patch to cover this.

By "all request/response should have its own URI information" do you mean "The request URI should not be edited"?  This does not seem to match the current behavior of req['Host'] as it must be manually cleared in order to reuse the request with a different host.

What should this output:

  require 'net/http'
  
  uri = URI 'http://example/'
  req = Net::HTTP::Get.new uri
  
  res = Net::HTTP.start 'other.example' do |http|
    http.request req
  end
  
  puts "req URI: #{req.uri}"
  puts "req Host: #{req['Host']}"

With the updated patch, req.uri is http://example

With my original patch, req.uri is http://other.example

Unpatched, net/http shows "other.example" for the Host, "example" with the latest patch.


----------------------------------------
Feature #6482: Add URI requested to Net::HTTP request and response objects
https://bugs.ruby-lang.org/issues/6482#change-27051

Author: drbrain (Eric Hodel)
Status: Assigned
Priority: Normal
Assignee: naruse (Yui NARUSE)
Category: lib
Target version: 2.0.0


=begin
This patch adds the full URI requested to Net::HTTPRequest and Net::HTTPResponse.

The goal of this is to make it easier to handle Location, Refresh, meta-headers, and URIs in retrieved documents.  (While the HTTP RFC specifies the Location must be an absolute URI, not every server follows the RFC.)  In order to process redirect responses from bad servers or relative URIs in requested documents the user must create an object that contains both the requested URI and the response object to create absolute URIs.  This patch reduces the amount of boilerplate they are required to write.

Only the (({request_uri})) is used from the URI given when creating a request.  The URI is stored internally and updated with the host, port and scheme used to make the request at request time.  The URI is then copied to the response object for use by the user.

To preserve backwards compatibility the new behavior is optional.  This allows requests with invalid URI paths like (({Net::HTTP::Get.new '/f%'})) to continue to work.  Users of string paths will not be able to retrieve the requested URI.

This patch is for support of #5064
=end



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