summaryrefslogtreecommitdiff
path: root/lib/net
diff options
context:
space:
mode:
authoraamine <aamine@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-05-06 08:53:51 +0000
committeraamine <aamine@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-05-06 08:53:51 +0000
commit094d3b1d7ce4106521c274f1e5d8178cde06f85a (patch)
treee74a62ff1bda4da1c8af9541ab73dc64045c4ffb /lib/net
parent84daaed84496f64701ccf1649e8a28a24716129f (diff)
* lib/net/http.rb: Connection header field might include both of "keep-alive" token and "close" token. [ruby-core:10818]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12248 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/net')
-rw-r--r--lib/net/http.rb48
1 files changed, 29 insertions, 19 deletions
diff --git a/lib/net/http.rb b/lib/net/http.rb
index 00d9a535b9..7757c7b383 100644
--- a/lib/net/http.rb
+++ b/lib/net/http.rb
@@ -461,7 +461,7 @@ module Net #:nodoc:
@address = address
@port = (port || HTTP.default_port)
@curr_http_version = HTTPVersion
- @seems_1_0_server = false
+ @no_keepalive_server = false
@close_on_empty_response = false
@socket = nil
@started = false
@@ -1062,12 +1062,7 @@ module Net #:nodoc:
end
def begin_transport(req)
- if @socket.closed?
- connect
- end
- if @seems_1_0_server
- req['connection'] ||= 'close'
- end
+ connect if @socket.closed?
if not req.response_body_permitted? and @close_on_empty_response
req['connection'] ||= 'close'
end
@@ -1076,15 +1071,13 @@ module Net #:nodoc:
def end_transport(req, res)
@curr_http_version = res.http_version
- if not res.body and @close_on_empty_response
+ if @socket.closed?
+ D 'Conn socket closed'
+ elsif not res.body and @close_on_empty_response
D 'Conn close'
@socket.close
elsif keep_alive?(req, res)
D 'Conn keep-alive'
- if @socket.closed?
- D 'Conn (but seems 1.0 server)'
- @seems_1_0_server = true
- end
else
D 'Conn close'
@socket.close
@@ -1092,13 +1085,12 @@ module Net #:nodoc:
end
def keep_alive?(req, res)
- return false if /close/i =~ req['connection'].to_s
- return false if @seems_1_0_server
- return true if /keep-alive/i =~ res['connection'].to_s
- return false if /close/i =~ res['connection'].to_s
- return true if /keep-alive/i =~ res['proxy-connection'].to_s
- return false if /close/i =~ res['proxy-connection'].to_s
- (@curr_http_version == '1.1')
+ return false if req.connection_close?
+ if @curr_http_version <= '1.0'
+ res.connection_keep_alive?
+ else # HTTP/1.1 or later
+ not res.connection_close?
+ end
end
def sspi_auth?(res)
@@ -1480,6 +1472,24 @@ module Net #:nodoc:
end
private :basic_encode
+ def connection_close?
+ tokens(@header['connection']).include?('close') or
+ tokens(@header['proxy-connection']).include?('close')
+ end
+
+ def connection_keep_alive?
+ tokens(@header['connection']).include?('keep-alive') or
+ tokens(@header['proxy-connection']).include?('keep-alive')
+ end
+
+ def tokens(vals)
+ return [] unless vals
+ vals.map {|v| v.split(',') }.flatten\
+ .reject {|str| str.strip.empty? }\
+ .map {|tok| tok.downcase }
+ end
+ private :tokens
+
end