nethttputils 0.3.0.0 → 0.3.1.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 +33 -24
- data/nethttputils.gemspec +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d553d1c931adfe28123f8c57313a0817d88f1396
|
4
|
+
data.tar.gz: 15527b1fc760308058e0bf48d7cdff662d681ae6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4417fc854b1f76bdc96d06e5b44e5c0f4f1e709fadf2360b9e9059c42721121c78d48b9a4126a821400620a072035aaca7b88abd81320ae2fd55d9b397257769
|
7
|
+
data.tar.gz: c3ba3f3bb0efb29f88a2d42f792be19b2793ec51afec179dd36cf5403116a8bbb8dcc0511af637f9478eb29acde7ec566036a809295934df2dd85f6cf1e9cf66
|
data/lib/nethttputils.rb
CHANGED
@@ -30,15 +30,14 @@ module NetHTTPUtils
|
|
30
30
|
gsub(/<[^>]*>/, "").split(?\n).map(&:strip).reject(&:empty?).join(?\n)
|
31
31
|
end
|
32
32
|
|
33
|
-
def start_http url,
|
34
|
-
fail if url.is_a? URI::HTTP
|
33
|
+
def start_http url, max_start_http_retry_delay = 3600, timeout = 30
|
35
34
|
uri = url
|
36
35
|
uri = URI.parse begin
|
37
36
|
URI url
|
38
37
|
url
|
39
38
|
rescue URI::InvalidURIError
|
40
39
|
URI.escape url
|
41
|
-
end
|
40
|
+
end unless url.is_a? URI::HTTP
|
42
41
|
delay = 5
|
43
42
|
begin
|
44
43
|
Net::HTTP.start(
|
@@ -95,7 +94,7 @@ module NetHTTPUtils
|
|
95
94
|
sleep delay
|
96
95
|
retry
|
97
96
|
end.tap do |http|
|
98
|
-
http.instance_variable_set
|
97
|
+
http.instance_variable_set :@uri, uri
|
99
98
|
http.define_singleton_method :read do |mtd = :GET, type = :form, form: {}, header: {}, auth: nil, timeout: 30,
|
100
99
|
max_read_retry_delay: 3600,
|
101
100
|
patch_request: nil,
|
@@ -106,10 +105,11 @@ module NetHTTPUtils
|
|
106
105
|
logger.warn "Warning: query params included in `url` argument are discarded because `:form` isn't empty" if uri.query && !form.empty?
|
107
106
|
# we can't just merge because URI fails to parse such queries as "/?1"
|
108
107
|
|
109
|
-
uri.query = URI.encode_www_form form if
|
108
|
+
uri.query = URI.encode_www_form form if %i{ HEAD GET }.include?(mtd = mtd.upcase) && !form.empty?
|
110
109
|
cookies = {}
|
111
|
-
prepare_request = lambda do |uri
|
110
|
+
prepare_request = lambda do |uri|
|
112
111
|
case mtd.upcase
|
112
|
+
when :HEAD ; Net::HTTP::Head
|
113
113
|
when :GET ; Net::HTTP::Get
|
114
114
|
when :POST ; Net::HTTP::Post
|
115
115
|
when :PUT ; Net::HTTP::Put
|
@@ -140,12 +140,12 @@ module NetHTTPUtils
|
|
140
140
|
|
141
141
|
logger.info "> #{request.class} #{uri.host} #{request.path}"
|
142
142
|
next unless logger.debug?
|
143
|
-
logger.debug "content-type: #{request.content_type}" unless
|
143
|
+
logger.debug "content-length: #{request.content_length.to_i}, content-type: #{request.content_type}" unless %i{ HEAD GET }.include? mtd
|
144
144
|
curl_form = case request.content_type
|
145
145
|
when "application/json" ; "-d #{JSON.dump form} "
|
146
146
|
when "multipart/form-data" ; form.map{ |k, v| "-F \"#{k}=#{v.respond_to?(:to_path) ? "@#{v.to_path}" : v}\" " }.join
|
147
147
|
when "application/x-www-form-urlencoded" ; "-d \"#{URI.encode_www_form form}\" "
|
148
|
-
else
|
148
|
+
else %i{ HEAD GET }.include?(mtd) ? "" : fail("unknown content-type '#{request.content_type}'")
|
149
149
|
end
|
150
150
|
logger.debug "curl -vsSL --compressed -o /dev/null #{
|
151
151
|
request.each_header.map{ |k, v| "-H \"#{k}: #{v}\" " unless k == "host" }.join
|
@@ -161,7 +161,7 @@ module NetHTTPUtils
|
|
161
161
|
logger.debug stack.join " -> "
|
162
162
|
end
|
163
163
|
end
|
164
|
-
http = NetHTTPUtils.start_http url,
|
164
|
+
http = NetHTTPUtils.start_http url, max_start_http_retry_delay, timeout
|
165
165
|
do_request = lambda do |request|
|
166
166
|
delay = 5
|
167
167
|
response = begin
|
@@ -214,7 +214,7 @@ module NetHTTPUtils
|
|
214
214
|
http.use_ssl? != (new_uri.scheme == "https")
|
215
215
|
logger.debug "changing host from '#{http.address}' to '#{new_host}'"
|
216
216
|
# http.finish
|
217
|
-
http = start_http new_uri,
|
217
|
+
http = NetHTTPUtils.start_http new_uri, max_start_http_retry_delay, timeout
|
218
218
|
end
|
219
219
|
do_request.call prepare_request[new_uri]
|
220
220
|
when "404"
|
@@ -256,10 +256,10 @@ module NetHTTPUtils
|
|
256
256
|
response
|
257
257
|
end
|
258
258
|
end
|
259
|
-
do_request[prepare_request[uri
|
260
|
-
|
261
|
-
|
262
|
-
|
259
|
+
response = do_request[prepare_request[uri]]
|
260
|
+
cookies.each{ |k, v| response.add_field "Set-Cookie", "#{k}=#{v};" }
|
261
|
+
logger.debug "< header: #{response.to_hash}"
|
262
|
+
(response.body || "").tap{ |r| r.instance_variable_set :@last_response, response }
|
263
263
|
|
264
264
|
end
|
265
265
|
end
|
@@ -269,23 +269,27 @@ module NetHTTPUtils
|
|
269
269
|
max_start_http_retry_delay: 3600,
|
270
270
|
max_read_retry_delay: 3600,
|
271
271
|
patch_request: nil, &block
|
272
|
-
http = start_http http,
|
272
|
+
http = start_http http, max_start_http_retry_delay, timeout unless http.is_a? Net::HTTP
|
273
273
|
path = http.instance_variable_get(:@uri).path
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
274
|
+
if mtd == :GET
|
275
|
+
head = http.head path, header
|
276
|
+
raise Error.new(
|
277
|
+
(head.to_hash["content-type"] == ["image/png"] ? head.to_hash["content-type"] : head.body),
|
278
|
+
head.code.to_i
|
279
|
+
) unless head.code[/\A(20\d|3\d\d)\z/]
|
280
|
+
end
|
279
281
|
body = http.read mtd, type, form: form, header: header, auth: auth, timeout: timeout,
|
280
282
|
max_read_retry_delay: max_read_retry_delay,
|
281
283
|
patch_request: patch_request, &block
|
282
|
-
|
284
|
+
last_response = body.instance_variable_get :@last_response
|
285
|
+
if last_response.to_hash["content-encoding"] == "gzip"
|
283
286
|
Zlib::GzipReader.new(StringIO.new(body)).read
|
284
287
|
else
|
285
288
|
body
|
286
289
|
end.tap do |string|
|
287
|
-
string.instance_variable_set :@
|
288
|
-
string.instance_variable_set :@
|
290
|
+
string.instance_variable_set :@code, last_response.code
|
291
|
+
string.instance_variable_set :@uri_path, path # useless?
|
292
|
+
string.instance_variable_set :@header, last_response.to_hash
|
289
293
|
end
|
290
294
|
# ensure
|
291
295
|
# response.instance_variable_get("@nethttputils_close").call if response
|
@@ -310,7 +314,7 @@ if $0 == __FILE__
|
|
310
314
|
server.mount_proc ?/ do |req, res|
|
311
315
|
stack.push req.request_method
|
312
316
|
end
|
313
|
-
Thread.new{ server.start }
|
317
|
+
t = Thread.new{ server.start }
|
314
318
|
NetHTTPUtils.start_http("http://localhost:8000/")
|
315
319
|
fail unless stack == %w{ }
|
316
320
|
stack.clear
|
@@ -321,6 +325,11 @@ if $0 == __FILE__
|
|
321
325
|
fail unless stack == %w{ HEAD GET }
|
322
326
|
server.shutdown
|
323
327
|
|
328
|
+
# TODO: test that HEAD method request goes through redirects
|
329
|
+
# TODO: test for `NetHTTPUtils.request_data "...", :head
|
330
|
+
# TODO: request the HEAD only if mtd == :GET
|
331
|
+
|
332
|
+
t.join # Address already in use - bind(2) for [::]:8000 (Errno::EADDRINUSE)
|
324
333
|
server = WEBrick::HTTPServer.new Port: 8000
|
325
334
|
server.mount_proc ?/ do |req, res|
|
326
335
|
# pp req.dup.tap{ |_| _.instance_variable_set "@config", nil }
|
data/nethttputils.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "nethttputils"
|
3
|
-
spec.version = "0.3.
|
3
|
+
spec.version = "0.3.1.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 --
|