about summary refs log tree commit diff
path: root/app/lib/request.rb
diff options
context:
space:
mode:
authorDavid Yip <yipdw@member.fsf.org>2018-03-27 10:26:47 -0500
committerDavid Yip <yipdw@member.fsf.org>2018-03-27 10:26:47 -0500
commitf61aa8e0f7101b5b7510a3809c94b7083ba08329 (patch)
tree3677a21fdbd4174125495e3545c527e8aff47297 /app/lib/request.rb
parent6af17b79c57b95a39fb4ed325aeff3edf02162ea (diff)
parent40e5d2303ba1edc51beae66cc15263675980106a (diff)
Merge remote-tracking branch 'origin/master' into gs-master
  Conflicts:
 	app/javascript/styles/mastodon/components.scss
 	app/models/media_attachment.rb
Diffstat (limited to 'app/lib/request.rb')
-rw-r--r--app/lib/request.rb31
1 files changed, 29 insertions, 2 deletions
diff --git a/app/lib/request.rb b/app/lib/request.rb
index 8a127c65f..dca93a6e9 100644
--- a/app/lib/request.rb
+++ b/app/lib/request.rb
@@ -40,7 +40,7 @@ class Request
     end
 
     begin
-      yield response
+      yield response.extend(ClientLimit)
     ensure
       http_client.close
     end
@@ -99,6 +99,33 @@ class Request
     @http_client ||= HTTP.timeout(:per_operation, timeout).follow(max_hops: 2)
   end
 
+  module ClientLimit
+    def body_with_limit(limit = 1.megabyte)
+      raise Mastodon::LengthValidationError if content_length.present? && content_length > limit
+
+      if charset.nil?
+        encoding = Encoding::BINARY
+      else
+        begin
+          encoding = Encoding.find(charset)
+        rescue ArgumentError
+          encoding = Encoding::BINARY
+        end
+      end
+
+      contents = String.new(encoding: encoding)
+
+      while (chunk = readpartial)
+        contents << chunk
+        chunk.clear
+
+        raise Mastodon::LengthValidationError if contents.bytesize > limit
+      end
+
+      contents
+    end
+  end
+
   class Socket < TCPSocket
     class << self
       def open(host, *args)
@@ -118,5 +145,5 @@ class Request
     end
   end
 
-  private_constant :Socket
+  private_constant :ClientLimit, :Socket
 end