about summary refs log tree commit homepage
path: root/lib/mogilefs/http_stream.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mogilefs/http_stream.rb')
-rw-r--r--lib/mogilefs/http_stream.rb22
1 files changed, 20 insertions, 2 deletions
diff --git a/lib/mogilefs/http_stream.rb b/lib/mogilefs/http_stream.rb
index 4d5e456..3f84b9b 100644
--- a/lib/mogilefs/http_stream.rb
+++ b/lib/mogilefs/http_stream.rb
@@ -24,7 +24,11 @@ class MogileFS::HTTPStream
         @to_io = sock
         @uri = uri
         @devid = devid
-        @writer = MogileFS::Chunker.new(@to_io, @md5, @opts[:content_md5])
+        if ! @md5 && @opts[:content_length]
+          @writer = @to_io
+        else
+          @writer = MogileFS::Chunker.new(@to_io, @md5, @opts[:content_md5])
+        end
         return
       rescue SystemCallError => e
         sock.close if sock && ! sock.closed?
@@ -47,6 +51,13 @@ class MogileFS::HTTPStream
 
   def commit
     @writer.flush
+
+    clen = @opts[:content_length]
+    if clen && @bytes_uploaded != clen
+      raise MogileFS::SizeMismatchError,
+           "did not upload expected content_length: #{clen} uploaded: " \
+           "#@bytes_uploaded"
+    end
     read_response(@to_io) # raises on errors
     create_close(@devid, @uri, @bytes_uploaded)
     ensure
@@ -57,7 +68,7 @@ class MogileFS::HTTPStream
     host_with_port = "#{uri.host}:#{uri.port}"
     headers = "PUT #{uri.request_uri} HTTP/1.1\r\n" \
               "Host: #{host_with_port}\r\n" \
-              "Transfer-Encoding: chunked\r\n"
+
     content_md5 = @opts[:content_md5]
     if String === content_md5
       headers << "Content-MD5: #{content_md5}\r\n"
@@ -67,6 +78,13 @@ class MogileFS::HTTPStream
       @md5 = Digest::MD5.new
       headers << "Trailer: Content-MD5\r\n"
     end
+
+    if ! @md5 && clen = @opts[:content_length]
+      headers << "Content-Length: #{clen}\r\n"
+    else
+      headers << "Transfer-Encoding: chunked\r\n"
+    end
+
     sock.write(headers << "\r\n")
   end