aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-04-10 09:23:11 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-04-10 09:23:11 +0000
commitb386b25aac3ce3a372d1c7ff601e2d737932be5a (patch)
treefc7aa4182b58db6c89c3d5b214c3e929488ed16e
parent6a1f41867229528e90d94081b38fcc838b4b25f4 (diff)
downloadruby-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
-rw-r--r--ChangeLog6
-rw-r--r--lib/net/http.rb32
2 files changed, 31 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 6fc912903a..66101c1d1b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Tue Apr 10 18:19:32 2012 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * 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@ruby-lang.org>
* thread_pthread.c: add prototype declarations for older Mac OS X.
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