diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-04-10 09:23:11 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-04-10 09:23:11 +0000 |
commit | b386b25aac3ce3a372d1c7ff601e2d737932be5a (patch) | |
tree | fc7aa4182b58db6c89c3d5b214c3e929488ed16e /lib/net/http.rb | |
parent | 6a1f41867229528e90d94081b38fcc838b4b25f4 (diff) | |
download | ruby-b386b25aac3ce3a372d1c7ff601e2d737932be5a.tar.gz |
* lib/net/http.rb (Net::HTTP#send_request_with_body_stream):
use IO.copy_stream for requests using body_stream.
patched by Eric Wong. [ruby-core:40898] [Feature #5605]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35281 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/net/http.rb')
-rw-r--r-- | lib/net/http.rb | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/lib/net/http.rb b/lib/net/http.rb index 65816f52e8..f6da628878 100644 --- a/lib/net/http.rb +++ b/lib/net/http.rb @@ -1987,6 +1987,25 @@ module Net #:nodoc: private + class Chunker #:nodoc: + def initialize(sock) + @sock = sock + @prev = nil + end + + def write(buf) + # avoid memcpy() of buf, buf can huge and eat memory bandwidth + @sock.write("#{buf.bytesize.to_s(16)}\r\n") + rv = @sock.write(buf) + @sock.write("\r\n") + rv + end + + def finish + @sock.write("0\r\n\r\n") + end + end + def send_request_with_body(sock, ver, path, body) self.content_length = body.bytesize delete 'Transfer-Encoding' @@ -2005,14 +2024,13 @@ module Net #:nodoc: write_header sock, ver, path wait_for_continue sock, ver if sock.continue_timeout if chunked? - while s = f.read(1024) - sock.write(sprintf("%x\r\n", s.length) << s << "\r\n") - end - sock.write "0\r\n\r\n" + chunker = Chunker.new(sock) + IO.copy_stream(f, chunker) + chunker.finish else - while s = f.read(1024) - sock.write s - end + # copy_stream can sendfile() to sock.io unless we use SSL. + # If sock.io is an SSLSocket, copy_stream will hit SSL_write() + IO.copy_stream(f, sock.io) end end |