nethttputils 0.3.0.0 → 0.3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 --
|