lhc 11.1.1 → 12.0.3

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: 236cb60f77bb99d1d14c61dd9fc9cd3c78a8bcacd734deb34b20eb72eee2c7c2
4
- data.tar.gz: 6956f64dc5409d253b7bff60f384dba7b02aff6df7286c50a8c762011eeb8575
3
+ metadata.gz: ad768b826ac53e7175609b97943ffbb746f514c1f99bdfb7174d48307052df4c
4
+ data.tar.gz: 7bcbcf0c7d08b7be73eb7ece1b688fb8be003d68d269b4ef70d5994fab9cc07a
5
5
  SHA512:
6
- metadata.gz: '0559059bd1594c8cf6efd9ea3805318af91835e20e87e200176f3eb2c74b7fb83e40f682725a7b4043d443e8950debf9edf1016cc40b41518a8f608a22e10fae'
7
- data.tar.gz: 93846206064d7c3547814aa6e8f4aecd857dc59b139de09c0b921937709c6088be9e1fd8b0c0e8ab5218f6fa3a6ab85bd86ba80cc3bddac36affc449c6f13456
6
+ metadata.gz: c181e5bc874086374c453e6056d31c948eaa2d4a869dfa002819e3236d486c6b98e7d3c058e5cca2dbc423d58a0777b3208471426dc8e47c085cc92cedef6afb
7
+ data.tar.gz: 3203b6a2ae1c3180271b7d7f16b5dbf1b499cad6c623145139d74a5e65bd59d7376267702417e483f6c82b0942d89e72b0b24fe7e978b349de75a9a1cffd6e55
data/README.md CHANGED
@@ -1,6 +1,3 @@
1
- LHC
2
- ===
3
-
4
1
  LHC is an extended/advanced HTTP client. Implementing basic http-communication enhancements like interceptors, exception handling, format handling, accessing response data, configuring endpoints and placeholders and fully compatible, RFC-compliant URL-template support.
5
2
 
6
3
  LHC uses [typhoeus](https://github.com/typhoeus/typhoeus) for low level http communication.
@@ -30,69 +27,70 @@ use it like:
30
27
  ```
31
28
 
32
29
  ## Table of contents
33
- * [LHC](#lhc)
34
- * [Quick start guide](#quick-start-guide)
35
- * [Table of contents](#table-of-contents)
36
- * [Basic methods](#basic-methods)
37
- * [Request](#request)
38
- * [Formats](#formats)
39
- * [Default format](#default-format)
40
- * [Unformatted requests](#unformatted-requests)
41
- * [Upload with LHC](#upload-with-lhc)
42
- * [Parallel requests](#parallel-requests)
43
- * [Follow redirects](#follow-redirects)
44
- * [Transfer data through the request body](#transfer-data-through-the-request-body)
45
- * [Request parameters](#request-parameters)
46
- * [Array Parameter Encoding](#array-parameter-encoding)
47
- * [Request URL encoding](#request-url-encoding)
48
- * [Request URL-Templates](#request-url-templates)
49
- * [Request timeout](#request-timeout)
50
- * [Request Agent](#request-agent)
51
- * [Response](#response)
52
- * [Accessing response data](#accessing-response-data)
53
- * [Exceptions](#exceptions)
54
- * [Custom error handling](#custom-error-handling)
55
- * [Ignore certain errors](#ignore-certain-errors)
56
- * [Configuration](#configuration)
57
- * [Configuring endpoints](#configuring-endpoints)
58
- * [Configuring placeholders](#configuring-placeholders)
59
- * [Interceptors](#interceptors)
60
- * [Quick start: Configure/Enable Interceptors](#quick-start-configureenable-interceptors)
61
- * [Interceptors on local request level](#interceptors-on-local-request-level)
62
- * [Core Interceptors](#core-interceptors)
63
- * [Authentication Interceptor](#authentication-interceptor)
64
- * [Bearer Authentication](#bearer-authentication)
65
- * [Basic Authentication](#basic-authentication)
66
- * [Reauthenticate](#reauthenticate)
67
- * [Bearer Authentication with client access token](#bearer-authentication-with-client-access-token)
68
- * [Caching Interceptor](#caching-interceptor)
69
- * [Options](#options)
70
- * [Default Timeout Interceptor](#default-timeout-interceptor)
71
- * [Overwrite defaults](#overwrite-defaults)
72
- * [Logging Interceptor](#logging-interceptor)
73
- * [Installation](#installation)
74
- * [What and how it logs](#what-and-how-it-logs)
75
- * [Configure](#configure)
76
- * [Monitoring Interceptor](#monitoring-interceptor)
77
- * [Installation](#installation-1)
78
- * [Environment](#environment)
79
- * [What it tracks](#what-it-tracks)
80
- * [Configure](#configure-1)
81
- * [Prometheus Interceptor](#prometheus-interceptor)
82
- * [Retry Interceptor](#retry-interceptor)
83
- * [Limit the amount of retries while making the request](#limit-the-amount-of-retries-while-making-the-request)
84
- * [Change the default maximum of retries of the retry interceptor](#change-the-default-maximum-of-retries-of-the-retry-interceptor)
85
- * [Retry all requests](#retry-all-requests)
86
- * [Rollbar Interceptor](#rollbar-interceptor)
87
- * [Forward additional parameters](#forward-additional-parameters)
88
- * [Throttle](#throttle)
89
- * [Zipkin](#zipkin)
90
- * [Create an interceptor from scratch](#create-an-interceptor-from-scratch)
91
- * [Interceptor callbacks](#interceptor-callbacks)
92
- * [Interceptor request/response](#interceptor-requestresponse)
93
- * [Provide a response replacement through an interceptor](#provide-a-response-replacement-through-an-interceptor)
94
- * [Testing](#testing)
95
- * [License](#license)
30
+ * [Quick start guide](#quick-start-guide)
31
+ * [Basic methods](#basic-methods)
32
+ * [Request](#request)
33
+ * [Formats](#formats)
34
+ * [Default format](#default-format)
35
+ * [Unformatted requests](#unformatted-requests)
36
+ * [Upload with LHC](#upload-with-lhc)
37
+ * [Parallel requests](#parallel-requests)
38
+ * [Follow redirects](#follow-redirects)
39
+ * [Transfer data through the request body](#transfer-data-through-the-request-body)
40
+ * [Request parameters](#request-parameters)
41
+ * [Array Parameter Encoding](#array-parameter-encoding)
42
+ * [Request URL encoding](#request-url-encoding)
43
+ * [Request URL-Templates](#request-url-templates)
44
+ * [Request timeout](#request-timeout)
45
+ * [Request Agent](#request-agent)
46
+ * [Response](#response)
47
+ * [Accessing response data](#accessing-response-data)
48
+ * [Exceptions](#exceptions)
49
+ * [Custom error handling (rescue)](#custom-error-handling-rescue)
50
+ * [Ignore certain errors](#ignore-certain-errors)
51
+ * [Configuration](#configuration)
52
+ * [Configuring endpoints](#configuring-endpoints)
53
+ * [Configuring placeholders](#configuring-placeholders)
54
+ * [Interceptors](#interceptors)
55
+ * [Quick start: Configure/Enable Interceptors](#quick-start-configureenable-interceptors)
56
+ * [Interceptors on local request level](#interceptors-on-local-request-level)
57
+ * [Core Interceptors](#core-interceptors)
58
+ * [Authentication Interceptor](#authentication-interceptor)
59
+ * [Bearer Authentication](#bearer-authentication)
60
+ * [Basic Authentication](#basic-authentication)
61
+ * [Reauthenticate](#reauthenticate)
62
+ * [Bearer Authentication with client access token](#bearer-authentication-with-client-access-token)
63
+ * [Caching Interceptor](#caching-interceptor)
64
+ * [Options](#options)
65
+ * [Default Timeout Interceptor](#default-timeout-interceptor)
66
+ * [Overwrite defaults](#overwrite-defaults)
67
+ * [Logging Interceptor](#logging-interceptor)
68
+ * [Installation](#installation)
69
+ * [What and how it logs](#what-and-how-it-logs)
70
+ * [Configure](#configure)
71
+ * [Monitoring Interceptor](#monitoring-interceptor)
72
+ * [Installation](#installation-1)
73
+ * [Environment](#environment)
74
+ * [What it tracks](#what-it-tracks)
75
+ * [Configure](#configure-1)
76
+ * [Prometheus Interceptor](#prometheus-interceptor)
77
+ * [Retry Interceptor](#retry-interceptor)
78
+ * [Limit the amount of retries while making the request](#limit-the-amount-of-retries-while-making-the-request)
79
+ * [Change the default maximum of retries of the retry interceptor](#change-the-default-maximum-of-retries-of-the-retry-interceptor)
80
+ * [Retry all requests](#retry-all-requests)
81
+ * [Do not retry certain response codes](#do-not-retry-certain-response-codes)
82
+ * [Rollbar Interceptor](#rollbar-interceptor)
83
+ * [Forward additional parameters](#forward-additional-parameters)
84
+ * [Throttle](#throttle)
85
+ * [Zipkin](#zipkin)
86
+ * [Create an interceptor from scratch](#create-an-interceptor-from-scratch)
87
+ * [Interceptor callbacks](#interceptor-callbacks)
88
+ * [Interceptor request/response](#interceptor-requestresponse)
89
+ * [Provide a response replacement through an interceptor](#provide-a-response-replacement-through-an-interceptor)
90
+ * [Testing](#testing)
91
+ * [License](#license)
92
+
93
+
96
94
 
97
95
  ## Basic methods
98
96
 
@@ -403,7 +401,7 @@ timeout? => LHC::Timeout
403
401
  anything_else => LHC::UnknownError
404
402
  ```
405
403
 
406
- ### Custom error handling
404
+ ### Custom error handling (rescue)
407
405
 
408
406
  You can provide custom error handlers to handle errors happening during the request.
409
407
 
@@ -413,19 +411,21 @@ If your error handler returns anything else but `nil` it replaces the response b
413
411
 
414
412
  ```ruby
415
413
  handler = ->(response){ do_something_with_response; return {name: 'unknown'} }
416
- response = LHC.get('http://something', error_handler: handler)
414
+ response = LHC.get('http://something', rescue: handler)
417
415
  response.data.name # 'unknown'
418
416
  ```
419
417
 
420
418
  ### Ignore certain errors
421
419
 
422
420
  As it's discouraged to rescue errors and then don't handle them (ruby styleguide)[https://github.com/bbatsov/ruby-style-guide#dont-hide-exceptions],
423
- but you often want to continue working with `nil`, LHC provides the `ignored_errors` option.
421
+ but you often want to continue working with `nil`, LHC provides the `ignore` option.
424
422
 
425
423
  Errors listed in this option will not be raised and will leave the `response.body` and `response.data` to stay `nil`.
426
424
 
425
+ You can either pass the LHC error class you want to be ignored or an array of LHC error classes.
426
+
427
427
  ```ruby
428
- response = LHC.get('http://something', ignored_errors: [LHC::NotFound])
428
+ response = LHC.get('http://something', ignore: LHC::NotFound)
429
429
 
430
430
  response.body # nil
431
431
  response.data # nil
@@ -817,16 +817,16 @@ If you want to retry all requests made from your application, you just need to c
817
817
 
818
818
  ##### Do not retry certain response codes
819
819
 
820
- If you do not want to retry based on certain response codes, use retry in combination with explicit `ignore_errors`:
820
+ If you do not want to retry based on certain response codes, use retry in combination with explicit `ignore`:
821
821
 
822
822
  ```ruby
823
- LHC.get('http://local.ch', ignore_errors: [LHC::NotFound], retry: { max: 1 })
823
+ LHC.get('http://local.ch', ignore: LHC::NotFound, retry: { max: 1 })
824
824
  ```
825
825
 
826
826
  Or if you use `LHC::Retry.all`:
827
827
 
828
828
  ```ruby
829
- LHC.get('http://local.ch', ignore_errors: [LHC::NotFound])
829
+ LHC.get('http://local.ch', ignore: LHC::NotFound)
830
830
  ```
831
831
 
832
832
  #### Rollbar Interceptor
@@ -35,5 +35,5 @@ Gem::Specification.new do |s|
35
35
  s.add_development_dependency 'timecop'
36
36
  s.add_development_dependency 'webmock'
37
37
 
38
- s.license = 'GPL-3'
38
+ s.license = 'GPL-3.0'
39
39
  end
@@ -59,6 +59,10 @@ class LHC::Error < StandardError
59
59
  self.response = response
60
60
  end
61
61
 
62
+ def self.to_a
63
+ [self]
64
+ end
65
+
62
66
  def to_s
63
67
  return response if response.is_a?(String)
64
68
  request = response.request
@@ -27,7 +27,7 @@ class LHC::Auth < LHC::Interceptor
27
27
  def basic_authentication!
28
28
  auth = auth_options[:basic]
29
29
  credentials = "#{auth[:username]}:#{auth[:password]}"
30
- set_authorization_header("Basic #{Base64.encode64(credentials).chomp}")
30
+ set_authorization_header("Basic #{Base64.strict_encode64(credentials).chomp}")
31
31
  end
32
32
 
33
33
  def bearer_authentication!
@@ -15,10 +15,10 @@ class LHC::Request
15
15
  attr_accessor :response, :options, :raw, :format, :error_handler, :errors_ignored, :source
16
16
 
17
17
  def initialize(options, self_executing = true)
18
- self.errors_ignored = (options.fetch(:ignored_errors, []) || []).compact
18
+ self.errors_ignored = (options.fetch(:ignore, []) || []).to_a.compact
19
19
  self.source = options&.dig(:source)
20
20
  self.options = format!(options.deep_dup || {})
21
- self.error_handler = options.delete :error_handler
21
+ self.error_handler = options.delete :rescue
22
22
  use_configured_endpoint!
23
23
  generate_url_from_template!
24
24
  self.interceptors = LHC::Interceptors.new(self)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LHC
4
- VERSION ||= '11.1.1'
4
+ VERSION ||= '12.0.3'
5
5
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe LHC::Auth do
6
+ before(:each) do
7
+ LHC.config.interceptors = [LHC::Auth]
8
+ end
9
+
10
+ it 'adds basic auth in a correct way even if username and password are especially long' do
11
+ options = { basic: { username: '123456789101234', password: '12345678901234567890123456789012' } }
12
+ LHC.config.endpoint(:local, 'http://local.ch', auth: options)
13
+ stub_request(:get, 'http://local.ch')
14
+ .with(headers: { 'Authorization' => 'Basic MTIzNDU2Nzg5MTAxMjM0OjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEy' })
15
+ LHC.get(:local)
16
+ end
17
+ end
@@ -66,7 +66,7 @@ describe LHC::Rollbar do
66
66
 
67
67
  it 'does not retry if the error is explicitly ignored' do
68
68
  request_stub
69
- LHC.get('http://local.ch', retry: { max: 1 }, ignored_errors: [LHC::NotFound])
69
+ LHC.get('http://local.ch', retry: { max: 1 }, ignore: [LHC::NotFound])
70
70
  expect(request_stub).to have_been_requested.times(1)
71
71
  end
72
72
  end
@@ -67,21 +67,21 @@ describe LHC::Request do
67
67
  it 'handles errors with the provided handler and does not raise them' do
68
68
  stub_request(:get, "http://something").to_return(status: 400)
69
69
  handler = double('handler', call: -> {})
70
- LHC::Request.new(url: "http://something", error_handler: handler)
70
+ LHC::Request.new(url: "http://something", rescue: handler)
71
71
  expect(handler).to have_received(:call)
72
72
  end
73
73
 
74
74
  it 'exchanges body with handlers return if the handler returns something' do
75
75
  stub_request(:get, "http://something").to_return(status: 400)
76
76
  handler = ->(_response) { { name: 'unknown' }.to_json }
77
- request = LHC::Request.new(url: "http://something", error_handler: handler)
77
+ request = LHC::Request.new(url: "http://something", rescue: handler)
78
78
  expect(request.response.data.name).to eq 'unknown'
79
79
  end
80
80
 
81
81
  it 'does not exchange body with handlers return if the handler returns nil' do
82
82
  stub_request(:get, "http://something").to_return(status: 400, body: { message: 'an error occurred' }.to_json)
83
83
  handler = ->(_response) { nil }
84
- request = LHC::Request.new(url: "http://something", error_handler: handler)
84
+ request = LHC::Request.new(url: "http://something", rescue: handler)
85
85
  expect(request.response.data.message).to eq 'an error occurred'
86
86
  end
87
87
  end
@@ -4,7 +4,7 @@ require 'rails_helper'
4
4
 
5
5
  describe LHC::Request do
6
6
  context 'ignoring LHC::NotFound' do
7
- let(:response) { LHC.get('http://local.ch', ignored_errors: [LHC::NotFound]) }
7
+ let(:response) { LHC.get('http://local.ch', ignore: [LHC::NotFound]) }
8
8
 
9
9
  before { stub_request(:get, 'http://local.ch').to_return(status: 404) }
10
10
 
@@ -36,13 +36,13 @@ describe LHC::Request do
36
36
 
37
37
  it "does not raise an error when it's a subclass of the ignored error" do
38
38
  expect {
39
- LHC.get('http://local.ch', ignored_errors: [LHC::Error])
39
+ LHC.get('http://local.ch', ignore: [LHC::Error])
40
40
  }.not_to raise_error
41
41
  end
42
42
 
43
43
  it "does raise an error if it's not a subclass of the ignored error" do
44
44
  expect {
45
- LHC.get('http://local.ch', ignored_errors: [ArgumentError])
45
+ LHC.get('http://local.ch', ignore: [ArgumentError])
46
46
  }.to raise_error(LHC::NotFound)
47
47
  end
48
48
  end
@@ -52,14 +52,22 @@ describe LHC::Request do
52
52
 
53
53
  it "does not raise an error when ignored errors is set to array with nil" do
54
54
  expect {
55
- LHC.get('http://local.ch', ignored_errors: [nil])
55
+ LHC.get('http://local.ch', ignore: [nil])
56
56
  }.to raise_error(LHC::NotFound)
57
57
  end
58
58
 
59
59
  it "does not raise an error when ignored errors is set to nil" do
60
60
  expect {
61
- LHC.get('http://local.ch', ignored_errors: nil)
61
+ LHC.get('http://local.ch', ignore: nil)
62
62
  }.to raise_error(LHC::NotFound)
63
63
  end
64
64
  end
65
+
66
+ context 'passing keys instead of arrays' do
67
+ before { stub_request(:get, 'http://local.ch').to_return(status: 404) }
68
+
69
+ it "does not raise an error when ignored errors is a key instead of an array" do
70
+ LHC.get('http://local.ch', ignore: LHC::NotFound)
71
+ end
72
+ end
65
73
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lhc
3
3
  version: !ruby/object:Gem::Version
4
- version: 11.1.1
4
+ version: 12.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - https://github.com/local-ch/lhc/contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-20 00:00:00.000000000 Z
11
+ date: 2020-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -325,6 +325,7 @@ files:
325
325
  - spec/interceptors/after_response_spec.rb
326
326
  - spec/interceptors/auth/basic_auth_spec.rb
327
327
  - spec/interceptors/auth/bearer_spec.rb
328
+ - spec/interceptors/auth/long_basic_auth_credentials_spec.rb
328
329
  - spec/interceptors/auth/reauthentication_configuration_spec.rb
329
330
  - spec/interceptors/auth/reauthentication_spec.rb
330
331
  - spec/interceptors/before_request_spec.rb
@@ -384,7 +385,7 @@ files:
384
385
  - spec/timeouts/timings_spec.rb
385
386
  homepage: https://github.com/local-ch/lhc
386
387
  licenses:
387
- - GPL-3
388
+ - GPL-3.0
388
389
  metadata: {}
389
390
  post_install_message:
390
391
  rdoc_options: []
@@ -475,6 +476,7 @@ test_files:
475
476
  - spec/interceptors/after_response_spec.rb
476
477
  - spec/interceptors/auth/basic_auth_spec.rb
477
478
  - spec/interceptors/auth/bearer_spec.rb
479
+ - spec/interceptors/auth/long_basic_auth_credentials_spec.rb
478
480
  - spec/interceptors/auth/reauthentication_configuration_spec.rb
479
481
  - spec/interceptors/auth/reauthentication_spec.rb
480
482
  - spec/interceptors/before_request_spec.rb