nethttputils 0.4.1.1 → 0.4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/nethttputils.rb +41 -29
- data/nethttputils.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ecb7a8e00f832f9c1fa1f79610772f8f955a177f
|
4
|
+
data.tar.gz: ee617bf653fca7736e95e257929ebb7a597872a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3632e1d20d3d853f2b7542364785ce5ba4ca8b4ff25aa2304856061bbe133cdd145ac18843a1bd52af275939e9f8354223c0d37dac6d64df5791dc2f21fc9db
|
7
|
+
data.tar.gz: 90e9b8a75802bd2d48cb727cf5c28ac4aa1c481e4af0afdc90d4e5b0f251e36293867819ef788774db550b92c0796482024913d313b7475e82737440c2685197
|
data/lib/nethttputils.rb
CHANGED
@@ -33,7 +33,8 @@ module NetHTTPUtils
|
|
33
33
|
gsub(/<[^>]*>/, "").split(?\n).map(&:strip).reject(&:empty?).join(?\n)
|
34
34
|
end
|
35
35
|
|
36
|
-
def start_http url, max_start_http_retry_delay = 3600, timeout =
|
36
|
+
def start_http url, max_start_http_retry_delay = 3600, timeout = nil, no_redirect = false, proxy = nil
|
37
|
+
timeout ||= 30
|
37
38
|
uri = url
|
38
39
|
uri = URI.parse begin
|
39
40
|
URI url
|
@@ -100,14 +101,17 @@ module NetHTTPUtils
|
|
100
101
|
end
|
101
102
|
|
102
103
|
private
|
103
|
-
def read http, mtd = :GET, type = :form, form: {}, header: {}, auth: nil, timeout:
|
104
|
-
|
104
|
+
def read http, mtd = :GET, type = :form, form: {}, header: {}, auth: nil, force_post: false, timeout: nil, no_redirect: false, max_read_retry_delay: 3600, patch_request: nil, &block
|
105
|
+
timeout ||= 30
|
106
|
+
logger = NetHTTPUtils.logger
|
107
|
+
logger.info [mtd, http].inspect
|
105
108
|
|
106
109
|
uri = http.instance_variable_get :@uri
|
107
|
-
|
110
|
+
if %i{ HEAD GET }.include?(mtd = mtd.upcase) && !form.empty? # not .upcase! because it's not defined for Symbol
|
111
|
+
logger.debug "Warning: query params included in `url` argument are discarded because `:form` isn't empty" if uri.query
|
108
112
|
# we can't just merge because URI fails to parse such queries as "/?1"
|
109
|
-
|
110
|
-
|
113
|
+
uri.query = URI.encode_www_form form
|
114
|
+
end
|
111
115
|
cookies = {}
|
112
116
|
prepare_request = lambda do |uri|
|
113
117
|
case mtd.upcase
|
@@ -126,15 +130,20 @@ module NetHTTPUtils
|
|
126
130
|
request.basic_auth *auth if auth
|
127
131
|
if (mtd == :POST || mtd == :PATCH) && !form.empty?
|
128
132
|
case type
|
129
|
-
when :json
|
130
|
-
|
131
|
-
|
133
|
+
when :json
|
134
|
+
request.body = JSON.dump form
|
135
|
+
request.content_type = "application/json"
|
136
|
+
when :multipart
|
137
|
+
request.set_form form, "multipart/form-data"
|
138
|
+
when :form
|
139
|
+
if form.any?{ |k, v| v.respond_to? :to_path }
|
132
140
|
request.set_form form, "multipart/form-data"
|
133
141
|
else
|
134
142
|
request.set_form_data form
|
135
143
|
request.content_type = "application/x-www-form-urlencoded;charset=UTF-8"
|
136
144
|
end
|
137
|
-
else
|
145
|
+
else
|
146
|
+
raise "unknown content-type '#{type}'"
|
138
147
|
end
|
139
148
|
end
|
140
149
|
header.each{ |k, v| request[k.to_s] = v.is_a?(Array) ? v.first : v }
|
@@ -177,7 +186,7 @@ module NetHTTPUtils
|
|
177
186
|
rescue EOFError => e
|
178
187
|
raise unless e.backtrace.empty?
|
179
188
|
# https://bugs.ruby-lang.org/issues/13018
|
180
|
-
# https://blog.kalina.tech/2019/04/exception-without-backtrace-in-ruby.html
|
189
|
+
# https://blog.kalina.tech/2019/04/exception-without-backtrace-in-ruby.html
|
181
190
|
raise EOFError_from_rbuf_fill.new "probably the old Ruby empty backtrace EOFError exception from net/protocol.rb"
|
182
191
|
end
|
183
192
|
# response.instance_variable_set "@nethttputils_close", http.method(:finish)
|
@@ -226,8 +235,12 @@ module NetHTTPUtils
|
|
226
235
|
response.add_field "Set-Cookie", "#{k}=#{v}"
|
227
236
|
end
|
228
237
|
|
238
|
+
logger.info "response.code = #{response.code}"
|
229
239
|
case response.code
|
240
|
+
when /\A20/
|
241
|
+
response
|
230
242
|
when /\A30\d\z/
|
243
|
+
next response if no_redirect
|
231
244
|
logger.info "redirect: #{response["location"]}"
|
232
245
|
require "addressable"
|
233
246
|
new_uri = URI.join request.uri.to_s, Addressable::URI.escape(response["location"])
|
@@ -238,10 +251,10 @@ module NetHTTPUtils
|
|
238
251
|
http.use_ssl? != (new_uri.scheme == "https")
|
239
252
|
logger.debug "changing host from '#{http.address}' to '#{new_host}'"
|
240
253
|
# http.finish # why commented out?
|
241
|
-
http = NetHTTPUtils.start_http new_uri, http.instance_variable_get(:@max_start_http_retry_delay), timeout
|
254
|
+
http = NetHTTPUtils.start_http new_uri, http.instance_variable_get(:@max_start_http_retry_delay), timeout, no_redirect
|
242
255
|
end
|
243
|
-
if request.method == "POST"
|
244
|
-
logger.info "POST redirects to GET (RFC)"
|
256
|
+
if !force_post && request.method == "POST"
|
257
|
+
logger.info "POST redirects to GET (RFC)" # TODO: do it only on code 307; note that some servers still do 302
|
245
258
|
mtd = :GET
|
246
259
|
end
|
247
260
|
do_request.call prepare_request[new_uri]
|
@@ -274,11 +287,10 @@ module NetHTTPUtils
|
|
274
287
|
end
|
275
288
|
}"
|
276
289
|
response
|
277
|
-
when /\A20/
|
278
|
-
response
|
279
290
|
else
|
280
|
-
logger.warn "code #{response.code}
|
281
|
-
|
291
|
+
logger.warn "code #{response.code} from #{request.method} #{request.uri} at #{
|
292
|
+
caller_path, caller_locs = caller_locations.chunk(&:path).first
|
293
|
+
[caller_path, caller_locs.map(&:lineno).chunk(&:itself).map(&:first)].join ":"
|
282
294
|
}"
|
283
295
|
logger.debug "< body: #{
|
284
296
|
response.body.tap do |body|
|
@@ -296,12 +308,11 @@ module NetHTTPUtils
|
|
296
308
|
|
297
309
|
require "set"
|
298
310
|
@@_405 ||= Set.new
|
299
|
-
def request_data http, mtd = :GET, type = :form, form: {}, header: {}, auth: nil, proxy: nil,
|
300
|
-
timeout:
|
301
|
-
max_start_http_retry_delay: 3600,
|
302
|
-
max_read_retry_delay: 3600,
|
311
|
+
def request_data http, mtd = :GET, type = :form, form: {}, header: {}, auth: nil, proxy: nil, force_post: false, no_redirect: false, head: false,
|
312
|
+
timeout: nil, max_start_http_retry_delay: 3600, max_read_retry_delay: 3600,
|
303
313
|
patch_request: nil, &block
|
304
|
-
|
314
|
+
timeout ||= 30
|
315
|
+
http = start_http http, max_start_http_retry_delay, timeout, no_redirect, *proxy unless http.is_a? Net::HTTP
|
305
316
|
path = http.instance_variable_get(:@uri).path
|
306
317
|
|
307
318
|
check_code = lambda do |body|
|
@@ -318,7 +329,7 @@ module NetHTTPUtils
|
|
318
329
|
)
|
319
330
|
end
|
320
331
|
end
|
321
|
-
if mtd == :GET && !@@_405.include?(http.address)
|
332
|
+
if head && mtd == :GET && !@@_405.include?(http.address)
|
322
333
|
body = begin
|
323
334
|
request_data http, :HEAD, form: form, header: header, auth: auth,
|
324
335
|
max_start_http_retry_delay: max_start_http_retry_delay,
|
@@ -332,7 +343,8 @@ module NetHTTPUtils
|
|
332
343
|
check_code.call body
|
333
344
|
end
|
334
345
|
end
|
335
|
-
body = read http, mtd, type, form: form, header: header, auth: auth,
|
346
|
+
body = read http, mtd, type, form: form, header: header, auth: auth, force_post: force_post,
|
347
|
+
timeout: timeout, no_redirect: no_redirect,
|
336
348
|
max_read_retry_delay: max_read_retry_delay,
|
337
349
|
patch_request: patch_request, &block
|
338
350
|
check_code.call body
|
@@ -342,7 +354,6 @@ module NetHTTPUtils
|
|
342
354
|
Zlib::GzipReader.new(StringIO.new(body)).read
|
343
355
|
else
|
344
356
|
body
|
345
|
-
end.tap do |string|
|
346
357
|
end
|
347
358
|
# ensure
|
348
359
|
# response.instance_variable_get("@nethttputils_close").call if response
|
@@ -406,6 +417,7 @@ if $0 == __FILE__
|
|
406
417
|
server.shutdown
|
407
418
|
t.join
|
408
419
|
|
420
|
+
# HEAD should raise on 404 but not in two other cases
|
409
421
|
[
|
410
422
|
[WEBrick::HTTPStatus::NotFound, 404],
|
411
423
|
[WEBrick::HTTPStatus::BadRequest],
|
@@ -417,7 +429,7 @@ if $0 == __FILE__
|
|
417
429
|
end
|
418
430
|
t = Thread.new{ server.start }
|
419
431
|
begin
|
420
|
-
NetHTTPUtils.request_data "http://localhost:8000/"
|
432
|
+
NetHTTPUtils.request_data "http://localhost:8000/", head: true
|
421
433
|
NetHTTPUtils.class_variable_get(:@@_405).clear
|
422
434
|
fail if should_raise
|
423
435
|
rescue NetHTTPUtils::Error => e
|
@@ -442,7 +454,7 @@ if $0 == __FILE__
|
|
442
454
|
NetHTTPUtils.request_data("http://localhost:8000/", :head)
|
443
455
|
fail stack.inspect unless stack == %w{ HEAD }
|
444
456
|
stack.clear
|
445
|
-
NetHTTPUtils.request_data("http://localhost:8000/")
|
457
|
+
NetHTTPUtils.request_data("http://localhost:8000/", head: true)
|
446
458
|
fail stack.inspect unless stack == %w{ HEAD GET }
|
447
459
|
server.shutdown
|
448
460
|
t.join
|
@@ -509,7 +521,7 @@ if $0 == __FILE__
|
|
509
521
|
http://www.aeronautica.difesa.it/organizzazione/REPARTI/divolo/PublishingImages/6%C2%B0%20Stormo/2013-decollo%20al%20tramonto%20REX%201280.jpg
|
510
522
|
}.each do |url|
|
511
523
|
begin
|
512
|
-
NetHTTPUtils.request_data url, timeout: 5, max_read_retry_delay: -1
|
524
|
+
NetHTTPUtils.request_data url, timeout: 5, max_read_retry_delay: -1, head: true
|
513
525
|
fail
|
514
526
|
rescue Net::ReadTimeout
|
515
527
|
end
|
data/nethttputils.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "nethttputils"
|
3
|
-
spec.version = "0.4.
|
3
|
+
spec.version = "0.4.3.0"
|
4
4
|
spec.summary = "this tool is like a pet that I adopted young and now I depend on, sorry"
|
5
5
|
spec.description = <<-EOF
|
6
6
|
Back in 2015 I was a guy automating things at my job and two scripts had a common need --
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nethttputils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Maslov aka Nakilon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-10-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|