ruby-changes:23232
From: naruse <ko1@a...>
Date: Tue, 10 Apr 2012 18:23:24 +0900 (JST)
Subject: [ruby-changes:23232] naruse:r35281 (trunk): * lib/net/http.rb (Net::HTTP#send_request_with_body_stream):
naruse 2012-04-10 18:23:11 +0900 (Tue, 10 Apr 2012) New Revision: 35281 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=35281 Log: * 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] Modified files: trunk/ChangeLog trunk/lib/net/http.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 35280) +++ ChangeLog (revision 35281) @@ -1,3 +1,9 @@ +Tue Apr 10 18:19:32 2012 NARUSE, Yui <naruse@r...> + + * 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] + Tue Apr 10 16:53:21 2012 Nobuyoshi Nakada <nobu@r...> * thread_pthread.c: add prototype declarations for older Mac OS X. Index: lib/net/http.rb =================================================================== --- lib/net/http.rb (revision 35280) +++ lib/net/http.rb (revision 35281) @@ -1987,6 +1987,25 @@ 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 @@ 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 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/