diff options
author | David Yip <yipdw@member.fsf.org> | 2018-03-27 10:26:47 -0500 |
---|---|---|
committer | David Yip <yipdw@member.fsf.org> | 2018-03-27 10:26:47 -0500 |
commit | f61aa8e0f7101b5b7510a3809c94b7083ba08329 (patch) | |
tree | 3677a21fdbd4174125495e3545c527e8aff47297 /app/lib/request.rb | |
parent | 6af17b79c57b95a39fb4ed325aeff3edf02162ea (diff) | |
parent | 40e5d2303ba1edc51beae66cc15263675980106a (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.rb | 31 |
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 |