Skip to content

Commit cdf36ba

Browse files
committed
feat(http): set http options globally
New feature allows users to configure their HTTP options with classic environment variables (e.g. http_proxy, https_proxy, no_proxy). Additionally, allows users to ignore SSL verification if uploading certificates for every use case is not practical. - Fixes pact-foundation#191 - Fixes pact-foundation#192
1 parent 18816e6 commit cdf36ba

File tree

6 files changed

+93
-21
lines changed

6 files changed

+93
-21
lines changed

.ruby-version

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.3.4
1+
2.4.0

lib/pact_broker/badges/service.rb

+5-6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
require 'pact_broker/project_root'
44
require 'pact_broker/logging'
55
require 'pact_broker/configuration'
6+
require 'pact_broker/build_http_options'
67

78
module PactBroker
89
module Badges
@@ -102,12 +103,10 @@ def escape_text text
102103
def do_request(uri)
103104
with_cache uri do
104105
request = Net::HTTP::Get.new(uri)
105-
Net::HTTP.start(uri.hostname, uri.port,
106-
use_ssl: uri.scheme == 'https',
107-
read_timeout: 3,
108-
open_timeout: 1,
109-
ssl_timeout: 1,
110-
continue_timeout: 1) do |http|
106+
options = {read_timeout: 3, open_timeout: 1, ssl_timeout: 1, continue_timeout: 1}
107+
options.merge! PactBroker::BuildHttpOptions.call(uri)
108+
109+
Net::HTTP.start(uri.hostname, uri.port, :ENV, options) do |http|
111110
http.request request
112111
end
113112
end

lib/pact_broker/build_http_options.rb

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
require 'pact_broker/services'
2+
3+
module PactBroker
4+
class BuildHttpOptions
5+
extend PactBroker::Services
6+
7+
def self.call uri
8+
uri = URI(uri)
9+
options = {}
10+
11+
if uri.scheme == 'https'
12+
options[:use_ssl] = true
13+
options[:cert_store] = cert_store
14+
if disable_ssl_verification?
15+
options[:verify_mode] = OpenSSL::SSL::VERIFY_NONE
16+
else
17+
options[:verify_mode] = OpenSSL::SSL::VERIFY_PEER
18+
end
19+
end
20+
options
21+
end
22+
23+
def self.disable_ssl_verification?
24+
PactBroker.configuration.disable_ssl_verification
25+
end
26+
27+
def self.cert_store
28+
certificate_service.cert_store
29+
end
30+
end
31+
end
32+

lib/pact_broker/configuration.rb

+4-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ class Configuration
1818
:shields_io_base_url,
1919
:check_for_potential_duplicate_pacticipant_names,
2020
:webhook_retry_schedule,
21-
:semver_formats
21+
:semver_formats,
22+
:disable_ssl_verification
2223
]
2324

2425
attr_accessor :log_dir, :database_connection, :auto_migrate_db, :use_hal_browser, :html_pact_renderer
@@ -28,6 +29,7 @@ class Configuration
2829
attr_accessor :semver_formats
2930
attr_accessor :enable_public_badge_access, :shields_io_base_url
3031
attr_accessor :webhook_retry_schedule
32+
attr_accessor :disable_ssl_verification
3133
attr_writer :logger
3234

3335
def initialize
@@ -60,6 +62,7 @@ def self.default_configuration
6062
config.semver_formats = ["%M.%m.%p%s%d", "%M.%m", "%M"]
6163
config.webhook_retry_schedule = [10, 60, 120, 300, 600, 1200] #10 sec, 1 min, 2 min, 5 min, 10 min, 20 min => 38 minutes
6264
config.check_for_potential_duplicate_pacticipant_names = true
65+
config.disable_ssl_verification = false
6366
config
6467
end
6568

lib/pact_broker/domain/webhook_request.rb

+4-13
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
require 'pact_broker/build_http_options'
12
require 'pact_broker/domain/webhook_request_header'
23
require 'pact_broker/domain/webhook_execution_result'
34
require 'pact_broker/logging'
45
require 'pact_broker/messages'
56
require 'net/http'
67
require 'pact_broker/webhooks/redact_logs'
78
require 'pact_broker/api/pact_broker_urls'
8-
require 'pact_broker/services'
9+
require 'pact_broker/build_http_options'
910

1011
module PactBroker
1112

@@ -24,7 +25,6 @@ class WebhookRequest
2425

2526
include PactBroker::Logging
2627
include PactBroker::Messages
27-
include PactBroker::Services
2828

2929
attr_accessor :method, :url, :headers, :body, :username, :password, :uuid
3030

@@ -104,13 +104,8 @@ def build_request uri, pact, execution_logger
104104

105105
def do_request uri, req
106106
logger.info "Making webhook #{uuid} request #{to_s}"
107-
options = {}
108-
if uri.scheme == 'https'
109-
options[:use_ssl] = true
110-
options[:verify_mode] = OpenSSL::SSL::VERIFY_PEER
111-
options[:cert_store] = cert_store
112-
end
113-
Net::HTTP.start(uri.hostname, uri.port, options) do |http|
107+
options = PactBroker::BuildHttpOptions.call(uri)
108+
Net::HTTP.start(uri.hostname, uri.port, :ENV, options) do |http|
114109
http.request req
115110
end
116111
end
@@ -174,10 +169,6 @@ def gsub_url pact, url
174169
escaped_pact_url = CGI::escape(pact_url)
175170
url.gsub('${pactbroker.pactUrl}', escaped_pact_url)
176171
end
177-
178-
def cert_store
179-
certificate_service.cert_store
180-
end
181172
end
182173
end
183174
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
require 'spec_helper'
2+
require 'pact_broker/build_http_options'
3+
4+
module PactBroker
5+
describe BuildHttpOptions do
6+
7+
subject { PactBroker::BuildHttpOptions.call(url) }
8+
9+
context "default http options" do
10+
before do
11+
PactBroker.configuration.disable_ssl_verification = false
12+
end
13+
14+
describe "when given an insecure URL" do
15+
let(:url) { 'http://example.org/insecure' }
16+
17+
it "should provide an empty configuration object" do
18+
expect(subject).to eq({})
19+
end
20+
21+
end
22+
23+
describe "when given a secure URL" do
24+
let(:url) { 'https://example.org/secure' }
25+
26+
it "should validate the full certificate chain" do
27+
expect(subject).to include({:use_ssl => true, :verify_mode => 1})
28+
end
29+
30+
end
31+
end
32+
33+
context "disable_ssl_verification is set to true" do
34+
before do
35+
PactBroker.configuration.disable_ssl_verification = true
36+
end
37+
38+
let(:url) { 'https://example.org/secure' }
39+
40+
describe "when given a secure URL" do
41+
it "should not validate certificates" do
42+
expect(subject).to include({:use_ssl => true, :verify_mode => 0})
43+
end
44+
end
45+
end
46+
end
47+
end

0 commit comments

Comments
 (0)