nethttputils 0.3.2.9 → 0.4.1.0

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
  SHA1:
3
- metadata.gz: 197097c1a40d4d0d409aa0c9f0965957ee9daf2a
4
- data.tar.gz: 5f78308fd5162565db7eca00c630fd2c5e39197e
3
+ metadata.gz: ff2b86fcc4b55f5f9ea7818eb61b47458da62fa0
4
+ data.tar.gz: 610d74457c21418c24b092a65ba47abfd5571b37
5
5
  SHA512:
6
- metadata.gz: c9275a5dc752288e03877fc8fbbad9fa3b808cca7a7aa463fbb6b7e55c8bc0466cff9c278896a3e7df6084dbca49ea725ab97dbae6dbc465e436e552b9dacedf
7
- data.tar.gz: f84dbb68971f7aae2c51200e42b95f9492b9b5c1749be2c2bd5870a751a920527d1e93733e77036d629c1cff69b39664243a7cbb39828a88115625362e070282
6
+ metadata.gz: 819dc2799c568c4b4aa4d199d14e3f5a0b70253bc0eb6831205482274abb2bbe90f7fb8504d15f6e4561dfa2d1e7d464a4534943a2d6ebd188d7e345752cfc39
7
+ data.tar.gz: cde0231d2c7779642ecf68d052cc117178b9905ba8a1bf3427d7c901050f05b75d290624fda7c5a2e2a2f4ed5fc7114390aad00bcdcbc45bab8783d2ee844ff0
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  language: ruby
3
3
 
4
- script: "ruby lib/nethttputils.rb"
4
+ script: "bundle install && bundle exec ruby lib/nethttputils.rb"
5
5
 
6
6
  os:
7
7
  - linux
@@ -19,3 +19,11 @@ matrix:
19
19
  allow_failures:
20
20
  # something with `NetHTTPUtils.request_data("http://localhost:8000/?1=2&3=4", form: {1=>3})` test
21
21
  - rvm: jruby-head
22
+ - rvm: 2.3
23
+ os: osx
24
+ - rvm: 2.2
25
+ os: osx
26
+ - rvm: 2.1
27
+ os: osx
28
+ - rvm: 2.0
29
+ os: osx
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+ gem "byebug"
3
+ gemspec
@@ -18,15 +18,18 @@ module NetHTTPUtils
18
18
  attr_reader :code
19
19
  def initialize body, code = nil
20
20
  @code = code
21
- super "HTTP error ##{code} #{body}"
21
+ body = body[0...997] + "..." if body.size > 1000
22
+ super "HTTP error ##{code.inspect} #{body}"
22
23
  end
23
24
  end
25
+ class EOFError_from_rbuf_fill < StandardError
26
+ end
24
27
 
25
28
  class << self
26
29
 
27
30
  def remove_tags str
28
- str.gsub(/<script( [a-z]+="[^"]*")*>.*?<\/script>/m, "").
29
- gsub(/<style( [a-z]+="[^"]*")*>.*?<\/style>/m, "").
31
+ str.gsub(/<script( [a-z-]+="[^"]*")*>.*?<\/script>/m, "").
32
+ gsub(/<style( [a-z-]+="[^"]*")*>.*?<\/style>/m, "").
30
33
  gsub(/<[^>]*>/, "").split(?\n).map(&:strip).reject(&:empty?).join(?\n)
31
34
  end
32
35
 
@@ -54,7 +57,7 @@ module NetHTTPUtils
54
57
  def << msg
55
58
  @@buffer ||= "[Net::HTTP debug] "
56
59
  @@buffer.concat msg
57
- @@buffer = @@buffer[0...997] + "..." if @@buffer.size > 500
60
+ @@buffer = @@buffer[0...997] + "..." if @@buffer.size > 1000
58
61
  return unless @@buffer.end_with? ?\n
59
62
  NetHTTPUtils.logger.debug @@buffer.sub ?\n, " "
60
63
  @@buffer = nil
@@ -155,7 +158,7 @@ module NetHTTPUtils
155
158
  request.each_header.map{ |k, v| "-H \"#{k}: #{v}\" " unless k == "host" }.join
156
159
  }#{curl_form}'#{uri.scheme}://#{uri.host}#{uri.path}#{"?#{uri.query}" if uri.query && !uri.query.empty?}'"
157
160
  logger.debug "> header: #{request.each_header.to_a}"
158
- logger.debug "> body: #{request.body.inspect.tap{ |body| body[997..-1] = "..." if body.size > 500 }}"
161
+ logger.debug "> body: #{request.body.inspect.tap{ |body| body.replace body[0...997] + "..." if body.size > 1000 }}"
159
162
  # TODO this is buggy -- mixes lines from different files into one line
160
163
  stack = caller.reverse.map do |level|
161
164
  /((?:[^\/:]+\/)?[^\/:]+):([^:]+)/.match(level).captures
@@ -169,11 +172,16 @@ module NetHTTPUtils
169
172
  delay = 5
170
173
  response = begin
171
174
  http.request request, &block
172
- rescue Errno::ECONNREFUSED, Net::ReadTimeout, Net::OpenTimeout, Zlib::BufError, Errno::ECONNRESET, OpenSSL::SSL::SSLError => e
175
+ rescue Errno::ECONNREFUSED, Net::ReadTimeout, Net::OpenTimeout, Zlib::BufError, Errno::ECONNRESET, OpenSSL::SSL::SSLError, Errno::ETIMEDOUT => e
173
176
  raise if max_read_retry_delay < delay *= 2
174
177
  logger.error "retrying in #{delay} seconds because of #{e.class} '#{e.message}' at: #{request.uri}"
175
178
  sleep delay
176
179
  retry
180
+ rescue EOFError => e
181
+ raise unless e.backtrace.empty?
182
+ # https://bugs.ruby-lang.org/issues/13018
183
+ # https://blog.kalina.tech/2019/04/exception-without-backtrace-in-ruby.html?spref=reddit
184
+ raise EOFError_from_rbuf_fill.new "probably the old Ruby empty backtrace EOFError exception from net/protocol.rb"
177
185
  end
178
186
  # response.instance_variable_set "@nethttputils_close", http.method(:finish)
179
187
  # response.singleton_class.instance_eval{ attr_accessor :nethttputils_socket_to_close }
@@ -204,7 +212,7 @@ module NetHTTPUtils
204
212
  # TODO: use WEBrick::Cookie
205
213
  old_cookies = cookies.dup
206
214
  response.to_hash.fetch("set-cookie", []).each do |c|
207
- fail "bad cookie? #{c.inspect}" unless /\A([^\s=]+)=([^\s]*)\z/.match c.split(/\s*;\s*/).first
215
+ next logger.warn "bad cookie: #{c.inspect}" unless /\A([^\s=]+)=([^\s]*)\z/.match c.split(/\s*;\s*/).first
208
216
  logger.debug "set-cookie: #{$1}=#{$2}"
209
217
  old_cookies.delete $1
210
218
  cookies.store $1, $2
@@ -217,13 +225,15 @@ module NetHTTPUtils
217
225
  case response.code
218
226
  when /\A30\d\z/
219
227
  logger.info "redirect: #{response["location"]}"
220
- new_uri = URI.join request.uri, URI.escape(response["location"])
228
+ require "addressable"
229
+ new_uri = URI.join request.uri.to_s, Addressable::URI.escape(response["location"])
221
230
  new_host = new_uri.host
231
+ raise Error.new "redirected in place" if new_uri == http.instance_variable_get(:@uri)
222
232
  if http.address != new_host ||
223
233
  http.port != new_uri.port ||
224
234
  http.use_ssl? != (new_uri.scheme == "https")
225
235
  logger.debug "changing host from '#{http.address}' to '#{new_host}'"
226
- # http.finish
236
+ # http.finish # why commented out?
227
237
  http = NetHTTPUtils.start_http new_uri, http.instance_variable_get(:@max_start_http_retry_delay), timeout
228
238
  end
229
239
  if request.method == "POST"
@@ -349,24 +359,44 @@ if $0 == __FILE__
349
359
  require "json"
350
360
  Thread.abort_on_exception = true
351
361
 
362
+ server = WEBrick::HTTPServer.new Port: 8000
363
+ tt = false
364
+ server.mount_proc "/" do |req, res|
365
+ next unless "HEAD" == req.request_method
366
+ fail if tt
367
+ tt = true
368
+ res.status = 300
369
+ res["location"] = "/"
370
+ end
371
+ t = Thread.new{ server.start }
372
+ begin
373
+ NetHTTPUtils.request_data "http://localhost:8000/"
374
+ rescue NetHTTPUtils::Error => e
375
+ raise if e.code
376
+ end
377
+ server.shutdown
378
+ t.join
379
+
352
380
  server = WEBrick::HTTPServer.new Port: 8000
353
381
  server.mount_proc "/1" do |req, res|
354
382
  next unless "GET" == req.request_method
355
- res.cookies.push WEBrick::Cookie.new("1", "2")
356
- res.cookies.push WEBrick::Cookie.new("3", "4")
357
- res.cookies.push WEBrick::Cookie.new("8", "9")
358
- res.cookies.push WEBrick::Cookie.new("a", "b")
359
- res.cookies.push WEBrick::Cookie.new("1", "5")
383
+ res.cookies.push WEBrick::Cookie.new "1", "2"
384
+ res.cookies.push WEBrick::Cookie.new "3", "4"
385
+ res.cookies.push WEBrick::Cookie.new "8", "9"
386
+ res.cookies.push WEBrick::Cookie.new "a", "b"
387
+ res.cookies.push WEBrick::Cookie.new "1", "5"
388
+ res.cookies.push WEBrick::Cookie.new "f", "g h"
360
389
  res.status = 300
361
390
  res["location"] = "/2"
362
391
  end
363
392
  server.mount_proc "/2" do |req, res|
364
- res.cookies.push WEBrick::Cookie.new("3", "6=c")
365
- res.cookies.push WEBrick::Cookie.new("8", "")
366
- res.cookies.push WEBrick::Cookie.new("4", "7")
393
+ res.cookies.push WEBrick::Cookie.new "3", "6=c"
394
+ res.cookies.push WEBrick::Cookie.new "a", "d e"
395
+ res.cookies.push WEBrick::Cookie.new "8", ""
396
+ res.cookies.push WEBrick::Cookie.new "4", "7"
367
397
  end
368
398
  t = Thread.new{ server.start }
369
- fail unless %w{ 3=6=c 8= 4=7 1=5 a=b } == p(NetHTTPUtils.request_data("http://localhost:8000/1").
399
+ fail unless %w{ 3=6=c a=d\ e 8= 4=7 1=5 a=b } == p(NetHTTPUtils.request_data("http://localhost:8000/1").
370
400
  instance_variable_get(:@last_response).to_hash.fetch("set-cookie"))
371
401
  server.shutdown
372
402
  t.join
@@ -446,7 +476,7 @@ if $0 == __FILE__
446
476
  fail unless NetHTTPUtils.method(:read).call(NetHTTPUtils.start_http("http://httpstat.us/400")) == "400 Bad Request"
447
477
  fail unless NetHTTPUtils.method(:read).call(NetHTTPUtils.start_http("http://httpstat.us/404")) == "404 Not Found"
448
478
  fail unless NetHTTPUtils.method(:read).call(NetHTTPUtils.start_http("http://httpstat.us/500")) == "500 Internal Server Error"
449
- fail unless NetHTTPUtils.method(:read).call(NetHTTPUtils.start_http("http://httpstat.us/502")) == "502 Bad Gateway"
479
+ fail unless NetHTTPUtils.method(:read).call(NetHTTPUtils.start_http("http://httpstat.us/502")).start_with? "httpstat.us | 502: Bad gateway\nError\n502\n"
450
480
  fail unless NetHTTPUtils.method(:read).call(NetHTTPUtils.start_http("http://httpstat.us/503")) == "503 Service Unavailable"
451
481
  [
452
482
  ["https://imgur.com/a/cccccc"],
@@ -480,10 +510,6 @@ if $0 == __FILE__
480
510
  end
481
511
  end
482
512
 
483
- begin
484
- fail NetHTTPUtils.request_data "https://oi64.tinypic.com/29z7oxs.jpg?", timeout: 5, max_start_http_retry_delay: -1
485
- rescue Net::OpenTimeout => e
486
- end
487
513
  ## this stopped failing on High Sierra
488
514
  # begin
489
515
  # # https://www.virtualself.co/?
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "nethttputils"
3
- spec.version = "0.3.2.9"
3
+ spec.version = "0.4.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 --
@@ -22,4 +22,6 @@ Gem::Specification.new do |spec|
22
22
 
23
23
  spec.require_path = "lib"
24
24
  spec.files = `git ls-files -z`.split(?\0) - spec.test_files
25
+
26
+ spec.add_dependency "addressable"
25
27
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nethttputils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2.9
4
+ version: 0.4.1.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: 2019-05-18 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2020-08-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: addressable
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  description: |2
14
28
  Back in 2015 I was a guy automating things at my job and two scripts had a common need --
15
29
  they both had to pass the same credentials to Jenkins (via query params, I guess).
@@ -27,6 +41,7 @@ extensions: []
27
41
  extra_rdoc_files: []
28
42
  files:
29
43
  - ".travis.yml"
44
+ - Gemfile
30
45
  - LICENSE
31
46
  - Rakefile
32
47
  - lib/nethttputils.rb
@@ -51,7 +66,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
51
66
  version: '0'
52
67
  requirements: []
53
68
  rubyforge_project:
54
- rubygems_version: 2.5.2
69
+ rubygems_version: 2.5.2.3
55
70
  signing_key:
56
71
  specification_version: 4
57
72
  summary: this tool is like a pet that I adopted young and now I depend on, sorry