[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]