twingly-http 0.6.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8fd022cb30b4e6aea665f8e8bc569a7fa7023c78f1a0cc88b18c4f00793b23ac
4
- data.tar.gz: 498f19467946922913480c55637baea6871d6895ab2a51ed82d7e6cd6fd4b60c
3
+ metadata.gz: 185e6408eb03f0e8b3a4b540a5831ce51adcbc0d1cade6afb67c23760e16c899
4
+ data.tar.gz: b4a688ac19bad106c8e159d6121fb1da003cf4952c4a9cec8ada891c1b5ed74d
5
5
  SHA512:
6
- metadata.gz: 8658da71b5b0a3d327f81cf8f4c29014606ca3336b2ed3848b234498511fde9152953e841ca920818b2a1daae9024912ce5987b518b0be7204bdf61071a8b115
7
- data.tar.gz: a397277ad9301bae0b25589e0aeea82beaa11e57a8c228a6d3d8bcc276010b181721b184c230d29fbb41a592c74905a411be68d717ee04e5049a8cd4e6534097
6
+ metadata.gz: 452696ddb72a00367b51232759f76f84421e16c297e22eed6edf8b8f7f0ba61c137dba9a62e79e07f133ea4220eee60e88f0f52d035943f221d20b47889c701e
7
+ data.tar.gz: 7000b9a0deca22c2309bea84bdc55d8578eabc3a5f78776b04ae7c719b0a4d5f9efc93aa5d6e9daf2b1399673503752f47ee1c559c3cf4fbb8edae3e6e5f5733
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ module ResponseBodySizeLimit
5
+ class LimitExceededError < StandardError; end
6
+
7
+ class Middleware < Faraday::Middleware
8
+ def initialize(app, max_size_bytes:)
9
+ super(app)
10
+
11
+ @max_size_bytes = max_size_bytes
12
+ end
13
+
14
+ def call(env) # rubocop:disable Metrics/MethodLength
15
+ response_body_size = 0
16
+ accumulated_body = + ""
17
+
18
+ env.request.on_data = proc do |chunk, _|
19
+ response_body_size += chunk.bytesize
20
+ accumulated_body << chunk
21
+
22
+ if response_body_size > @max_size_bytes
23
+ raise LimitExceededError,
24
+ "Response body too large, exceeced the configured max size of #{@max_size_bytes} bytes."
25
+ end
26
+ end
27
+
28
+ @app.call(env).on_complete do |response_env|
29
+ response_env.body = accumulated_body
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ Faraday::Response.register_middleware(
37
+ response_body_size_limit: Faraday::ResponseBodySizeLimit::Middleware
38
+ )
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "response_body_size_limit/middleware"
4
+
5
+ module Faraday
6
+ module ResponseBodySizeLimit
7
+ end
8
+ end
data/lib/twingly/http.rb CHANGED
@@ -7,6 +7,7 @@ require "faraday_middleware"
7
7
 
8
8
  require_relative "../faraday/logfmt_logger"
9
9
  require_relative "../faraday/url_size_limit"
10
+ require_relative "../faraday/response_body_size_limit"
10
11
  require_relative "heroku"
11
12
  require_relative "string_utilities"
12
13
 
@@ -15,6 +16,7 @@ module Twingly
15
16
  class ConnectionError < StandardError; end
16
17
  class UrlSizeLimitExceededError < StandardError; end
17
18
  class RedirectLimitReachedError < StandardError; end
19
+ class ResponseBodySizeLimitExceededError < StandardError; end
18
20
  class Client # rubocop:disable Metrics/ClassLength
19
21
  DEFAULT_RETRYABLE_EXCEPTIONS = [
20
22
  Faraday::ConnectionFailed,
@@ -31,6 +33,7 @@ module Twingly
31
33
  DEFAULT_NUMBER_OF_RETRIES = 0
32
34
  DEFAULT_RETRY_INTERVAL = 1
33
35
  DEFAULT_MAX_URL_SIZE_BYTES = Float::INFINITY
36
+ DEFAULT_MAX_RESPONSE_BODY_SIZE_BYTES = Float::INFINITY
34
37
  DEFAULT_FOLLOW_REDIRECTS_LIMIT = 3
35
38
 
36
39
  attr_writer :http_timeout
@@ -39,6 +42,7 @@ module Twingly
39
42
  attr_writer :retry_interval
40
43
  attr_writer :on_retry_callback
41
44
  attr_writer :max_url_size_bytes
45
+ attr_writer :max_response_body_size_bytes
42
46
  attr_writer :request_id
43
47
  attr_writer :follow_redirects
44
48
 
@@ -81,19 +85,20 @@ module Twingly
81
85
  end
82
86
 
83
87
  def initialize_defaults
84
- @request_id = nil
85
- @http_timeout = DEFAULT_HTTP_TIMEOUT
86
- @http_open_timeout = DEFAULT_HTTP_OPEN_TIMEOUT
87
- @retryable_exceptions = DEFAULT_RETRYABLE_EXCEPTIONS
88
- @number_of_retries = DEFAULT_NUMBER_OF_RETRIES
89
- @retry_interval = DEFAULT_RETRY_INTERVAL
90
- @on_retry_callback = nil
91
- @follow_redirects = false
92
- @follow_redirects_limit = DEFAULT_FOLLOW_REDIRECTS_LIMIT
93
- @max_url_size_bytes = DEFAULT_MAX_URL_SIZE_BYTES
88
+ @request_id = nil
89
+ @http_timeout = DEFAULT_HTTP_TIMEOUT
90
+ @http_open_timeout = DEFAULT_HTTP_OPEN_TIMEOUT
91
+ @retryable_exceptions = DEFAULT_RETRYABLE_EXCEPTIONS
92
+ @number_of_retries = DEFAULT_NUMBER_OF_RETRIES
93
+ @retry_interval = DEFAULT_RETRY_INTERVAL
94
+ @on_retry_callback = nil
95
+ @follow_redirects = false
96
+ @follow_redirects_limit = DEFAULT_FOLLOW_REDIRECTS_LIMIT
97
+ @max_url_size_bytes = DEFAULT_MAX_URL_SIZE_BYTES
98
+ @max_response_body_size_bytes = DEFAULT_MAX_RESPONSE_BODY_SIZE_BYTES
94
99
  end
95
100
 
96
- def http_response_for(method, **args)
101
+ def http_response_for(method, **args) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
97
102
  response = send("http_#{method}_response", **args)
98
103
 
99
104
  Response.new(headers: response.headers.to_h,
@@ -106,6 +111,8 @@ module Twingly
106
111
  raise UrlSizeLimitExceededError, error.message
107
112
  rescue FaradayMiddleware::RedirectLimitReached => error
108
113
  raise RedirectLimitReachedError, error.message
114
+ rescue Faraday::ResponseBodySizeLimit::LimitExceededError => error
115
+ raise ResponseBodySizeLimitExceededError, error.message
109
116
  end
110
117
 
111
118
  def http_get_response(url:, params:, headers:)
@@ -201,6 +208,8 @@ module Twingly
201
208
  faraday.use FaradayMiddleware::FollowRedirects,
202
209
  limit: @follow_redirects_limit
203
210
  end
211
+ faraday.response :response_body_size_limit,
212
+ max_size_bytes: @max_response_body_size_bytes
204
213
  faraday.adapter Faraday.default_adapter
205
214
  faraday.headers[:user_agent] = user_agent
206
215
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Twingly
4
4
  module HTTP
5
- VERSION = "0.6.0"
5
+ VERSION = "0.7.1"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twingly-http
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Twingly AB
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-11-06 00:00:00.000000000 Z
11
+ date: 2025-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -56,6 +56,8 @@ files:
56
56
  - lib/faraday/logfmt_logger.rb
57
57
  - lib/faraday/logfmt_logger/LICENSE.md
58
58
  - lib/faraday/logfmt_logger/middleware.rb
59
+ - lib/faraday/response_body_size_limit.rb
60
+ - lib/faraday/response_body_size_limit/middleware.rb
59
61
  - lib/faraday/url_size_limit.rb
60
62
  - lib/faraday/url_size_limit/middleware.rb
61
63
  - lib/twingly/heroku.rb
@@ -82,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
82
84
  - !ruby/object:Gem::Version
83
85
  version: '0'
84
86
  requirements: []
85
- rubygems_version: 3.4.10
87
+ rubygems_version: 3.5.4
86
88
  signing_key:
87
89
  specification_version: 4
88
90
  summary: Robust HTTP client