From 47f58037b610ded89a4bbbc73501733558e7734e Mon Sep 17 00:00:00 2001 From: aamine Date: Mon, 20 Dec 1999 20:48:49 +0000 Subject: Version 1.1.1 o HTTP chunk data git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@593 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/net/http.rb | 51 +++++++++++++++++++++++++++++++++++++++++++++------ lib/net/pop.rb | 2 ++ lib/net/session.rb | 6 +++--- lib/net/smtp.rb | 2 +- 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/lib/net/http.rb b/lib/net/http.rb index d1ac411188..6a74ce28ce 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 1a0c61b51c..7098bb9499 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 5965d4d280..951902a4cc 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 @@ -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 dd74cdcdb4..8a16bc1724 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' -- cgit v1.2.3