summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/net/http.rb51
-rw-r--r--lib/net/pop.rb2
-rw-r--r--lib/net/session.rb6
-rw-r--r--lib/net/smtp.rb2
4 files changed, 51 insertions, 10 deletions
diff --git a/lib/net/http.rb b/lib/net/http.rb
index d1ac4111880..6a74ce28ce6 100644
--- a/lib/net/http.rb
+++ b/lib/net/http.rb
@@ -19,7 +19,7 @@ class HTTPBadResponse < HTTPError; end
class HTTPSession < Session
- Version = '1.1.0'
+ Version = '1.1.1'
session_setvar :port, '80'
session_setvar :command_type, 'HTTPCommand'
@@ -61,8 +61,8 @@ class HTTPCommand < Command
@in_header = {}
@in_header[ 'Host' ] = sock.addr
#@in_header[ 'User-Agent' ] = "Ruby http version #{HTTPSession::Version}"
- #@in_header[ 'Connection' ] = 'Keep-Alive'
- #@in_header[ 'Accept' ] = '*/*'
+ @in_header[ 'Connection' ] = 'Keep-Alive'
+ @in_header[ 'Accept' ] = '*/*'
super sock
end
@@ -75,7 +75,13 @@ class HTTPCommand < Command
write_header u_header
check_reply SuccessCode
header = read_header
- @socket.read content_length( header ), ret
+ if chunked? header then
+ clen = read_chunked_body( ret )
+ header.delete 'transfer-encoding'
+ header[ 'content-length' ] = "Content-Length: #{clen}"
+ else
+ @socket.read content_length( header ), ret
+ end
@socket.close unless keep_alive? header
return header, ret
@@ -140,7 +146,7 @@ class HTTPCommand < Command
unless str = header[ 'content-length' ] then
raise HTTPBadResponce, "content-length not given"
end
- unless /content-length:\s*(\d+)/i === str then
+ unless /\Acontent-length:\s*(\d+)/i === str then
raise HTTPBadResponce, "content-length format error"
end
$1.to_i
@@ -148,7 +154,7 @@ class HTTPCommand < Command
def keep_alive?( header )
if str = header[ 'connection' ] then
- if /connection:\s*keep-alive/i === str then
+ if /\Aconnection:\s*keep-alive/i === str then
return true
end
else
@@ -160,6 +166,16 @@ class HTTPCommand < Command
false
end
+ def chunked?( header )
+ if str = header[ 'transfer-encoding' ] then
+ if /\Atransfer-encoding:\s*chunked/i === str then
+ return true
+ end
+ end
+
+ false
+ end
+
def read_header
header = {}
@@ -194,6 +210,29 @@ class HTTPCommand < Command
end
end
+ def read_chunked_body( ret )
+ line = nil
+ len = nil
+ total = 0
+
+ while true do
+ line = @socket.readline
+ unless /[0-9a-hA-H]+/ === line then
+ raise HTTPBadResponce, "chunk size not given"
+ end
+ len = $&.hex
+ break if len == 0
+ @socket.read( len, ret ); total += len
+ @socket.read 2 # \r\n
+ end
+ while true do
+ line = @socket.readline
+ break if line.empty?
+ end
+
+ total
+ end
+
end
diff --git a/lib/net/pop.rb b/lib/net/pop.rb
index 1a0c61b51cf..7098bb9499f 100644
--- a/lib/net/pop.rb
+++ b/lib/net/pop.rb
@@ -52,6 +52,8 @@ Net::Session
class POP3Session < Session
+ Version = '1.1.1'
+
session_setvar :port, '110'
session_setvar :command_type, 'POP3Command'
diff --git a/lib/net/session.rb b/lib/net/session.rb
index 5965d4d2807..951902a4cc8 100644
--- a/lib/net/session.rb
+++ b/lib/net/session.rb
@@ -1,6 +1,6 @@
=begin
-= net/session.rb version 1.1.0
+= net/session.rb version 1.1.1
written by Minero Aoki <aamine@dp.u-netsurf.ne.jp>
@@ -30,7 +30,7 @@ Object
: Version
- The version of Session class. It is a string like "1.1.0".
+ The version of Session class. It is a string like "1.1.1".
=== Class Methods
@@ -77,7 +77,7 @@ Object
class Session
- Version = '1.1.0'
+ Version = '1.1.1'
class << self
diff --git a/lib/net/smtp.rb b/lib/net/smtp.rb
index dd74cdcdb47..8a16bc1724b 100644
--- a/lib/net/smtp.rb
+++ b/lib/net/smtp.rb
@@ -58,7 +58,7 @@ Net::Session
class SMTPSession < Session
- Version = '1.1.0'
+ Version = '1.1.1'
session_setvar :port, '25'
session_setvar :command_type, 'SMTPCommand'