miniproxy 0.2.0 → 0.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f44f0daaa7c8c5897ee86428737bb7bafba78d60935943056d8daed9baa2111
4
- data.tar.gz: 4ec7b5cf714b7afe7d81dda425a6a8f3095caefac4c9511405a189678df71910
3
+ metadata.gz: 15a74bd747d9a4d3f357e94815beedc9f9994000c2749068c85df8439dd5b2c5
4
+ data.tar.gz: 0c4c72bc17f6224bfb059b2f96021bb4151418ee712488d3bfb2d87d76b6ac48
5
5
  SHA512:
6
- metadata.gz: 5410429d11d0cdb1f97cf5423d97d8f3d3d88b80a39bab27de5fd265d2bd02e779c5946d7e28d0ac9ab618758afc1900e1cc294b3b9c7f19ff6c800bd96d0c71
7
- data.tar.gz: 2c987fde657f840ae2e6c976ea6bae574aa9ec31dfff19a48fe128f348b97d3aa89a6dedc2d2cc82fd8f497183065b3e02fb277ff2da2ffebe63d337a4995f91
6
+ metadata.gz: 1cd79a35601b70f84a2b8ff7fc86bbc6cac70b932aba1336d0b3ab089324d724d7051a4bfde63e7a1667bb5b410d6bb94c58da2c1979b14285b164aee8fb008a
7
+ data.tar.gz: 497e08a015ea8de92aa0fb711779e3105e1635ddeed8140f62d48386b245414cc33e6351eaa5b521b14de9bf6bf78b86777f22aaf0b491a0f45bb5a914ecf3dc
@@ -18,7 +18,11 @@ module MiniProxy
18
18
  end
19
19
 
20
20
  def self.host
21
- "127.0.0.1"
21
+ @host || "127.0.0.1"
22
+ end
23
+
24
+ def self.host=(host)
25
+ @host = host
22
26
  end
23
27
 
24
28
  def self.ignore_all_requests
@@ -33,10 +37,14 @@ module MiniProxy
33
37
  remote.stub_request(method: method, url: url, response: response)
34
38
  end
35
39
 
40
+ def self.allow_request(method:, url:)
41
+ remote.allow_request(method: method, url: url)
42
+ end
43
+
36
44
  private_class_method def self.remote
37
45
  Timeout.timeout(DRB_SERVICE_TIMEOUT) do
38
46
  begin
39
- remote = DRbObject.new(nil, Remote.server)
47
+ remote = DRbObject.new(nil, Remote.server(self.host))
40
48
 
41
49
  until remote.started?
42
50
  sleep 0.01
@@ -5,8 +5,6 @@ module MiniProxy
5
5
  # MiniProxy fake SSL enabled server, which receives relayed requests from the ProxyServer
6
6
  #
7
7
  class FakeSSLServer < WEBrick::HTTPServer
8
- ALLOWED_HOSTS = ["127.0.0.1", "localhost"].freeze
9
-
10
8
  def initialize(config = {}, default = WEBrick::Config::HTTP)
11
9
  config = config.merge({
12
10
  Logger: WEBrick::Log.new(nil, 0), # silence logging
@@ -21,7 +19,7 @@ module MiniProxy
21
19
  end
22
20
 
23
21
  def service(req, res)
24
- if ALLOWED_HOSTS.include?(req.host)
22
+ if self.config[:AllowedRequestCheck].call(req)
25
23
  super(req, res)
26
24
  else
27
25
  self.config[:MockHandlerCallback].call(req, res)
@@ -4,8 +4,6 @@ module MiniProxy
4
4
  # MiniProxy server, which boots a WEBrick proxy server
5
5
  #
6
6
  class ProxyServer < WEBrick::HTTPProxyServer
7
- ALLOWED_HOSTS = ["127.0.0.1", "localhost"].freeze
8
-
9
7
  attr_accessor :requests
10
8
 
11
9
  def initialize(config = {}, default = WEBrick::Config::HTTP)
@@ -17,32 +15,51 @@ module MiniProxy
17
15
  super(config, default)
18
16
  end
19
17
 
20
- def do_PUT(req, res)
21
- perform_proxy_request(req, res) do |http, path, header|
22
- http.put(path, req.body || "", header)
18
+ if RUBY_VERSION < "2.6.0"
19
+ def do_PUT(req, res)
20
+ perform_proxy_request(req, res) do |http, path, header|
21
+ http.put(path, req.body || "", header)
22
+ end
23
23
  end
24
- end
25
24
 
26
- def do_DELETE(req, res)
27
- perform_proxy_request(req, res) do |http, path, header|
28
- http.delete(path, header)
25
+ def do_DELETE(req, res)
26
+ perform_proxy_request(req, res) do |http, path, header|
27
+ http.delete(path, header)
28
+ end
29
29
  end
30
- end
31
30
 
32
- def do_PATCH(req, res)
33
- perform_proxy_request(req, res) do |http, path, header|
34
- http.patch(path, req.body || "", header)
31
+ def do_PATCH(req, res)
32
+ perform_proxy_request(req, res) do |http, path, header|
33
+ http.patch(path, req.body || "", header)
34
+ end
35
+ end
36
+ else
37
+ def do_PUT(req, res)
38
+ perform_proxy_request(req, res, Net::HTTP::Put, req.body_reader)
39
+ end
40
+
41
+ def do_DELETE(req, res)
42
+ perform_proxy_request(req, res, Net::HTTP::Delete)
43
+ end
44
+
45
+ def do_PATCH(req, res)
46
+ perform_proxy_request(req, res, Net::HTTP::Patch, req.body_reader)
35
47
  end
36
48
  end
37
49
 
38
50
  def service(req, res)
39
- if ALLOWED_HOSTS.include?(req.host)
51
+ if self.config[:AllowedRequestCheck].call(req)
40
52
  super(req, res)
41
53
  else
42
54
  if req.request_method == "CONNECT"
55
+ is_ssl = req.unparsed_uri.include?(":443")
56
+
43
57
  # If something is trying to initiate an SSL connection, rewrite
44
- # the URI to point to our fake server.
45
- req.instance_variable_set(:@unparsed_uri, "localhost:#{self.config[:FakeServerPort]}")
58
+ # the URI to point to our fake server so we can stub SSL requests.
59
+ if is_ssl
60
+ req.instance_variable_set(:@unparsed_uri, "localhost:#{self.config[:FakeServerPort]}")
61
+ end
62
+
46
63
  super(req, res)
47
64
  else
48
65
  # Otherwise, call our handler to respond with an appropriate
@@ -20,7 +20,7 @@ module MiniProxy
20
20
  false
21
21
  end
22
22
 
23
- def self.server
23
+ def self.server(host = "127.0.0.1")
24
24
  @unix_socket_uri ||= begin
25
25
  tempfile = Tempfile.new("mini_proxy")
26
26
  socket_path = tempfile.path
@@ -31,12 +31,13 @@ module MiniProxy
31
31
  return @unix_socket_uri if drb_process_alive?
32
32
 
33
33
  @pid = fork do
34
- remote = Remote.new
34
+ remote = Remote.new(host)
35
35
 
36
36
  Timeout.timeout(SERVER_START_TIMEOUT) do
37
37
  begin
38
38
  fake_server_port = SERVER_DYNAMIC_PORT_RANGE.sample
39
39
  fake_server = FakeSSLServer.new(
40
+ AllowedRequestCheck: remote.method(:allowed_request?),
40
41
  Port: fake_server_port,
41
42
  MockHandlerCallback: remote.method(:handler),
42
43
  )
@@ -48,6 +49,7 @@ module MiniProxy
48
49
  begin
49
50
  remote.port = ENV["MINI_PROXY_PORT"] || SERVER_DYNAMIC_PORT_RANGE.sample
50
51
  proxy = MiniProxy::ProxyServer.new(
52
+ AllowedRequestCheck: remote.method(:allowed_request?),
51
53
  Port: remote.port,
52
54
  FakeServerPort: fake_server_port,
53
55
  MockHandlerCallback: remote.method(:handler),
@@ -88,6 +90,16 @@ module MiniProxy
88
90
  @stubs.push(request)
89
91
  end
90
92
 
93
+ def allow_request(method:, url:)
94
+ @allowed_requests.push(MiniProxy::Stub::Request.new(method: method, url: url, response: nil))
95
+ end
96
+
97
+ def allowed_request?(req)
98
+ return true if ["127.0.0.1", "localhost", @host].include?(req.host)
99
+
100
+ @allowed_requests.any? { |allowed_request| allowed_request.match?(req) }
101
+ end
102
+
91
103
  def port
92
104
  @port
93
105
  end
@@ -102,6 +114,7 @@ module MiniProxy
102
114
 
103
115
  def clear
104
116
  @stubs.clear
117
+ @allowed_requests.clear
105
118
  end
106
119
 
107
120
  def drain_messages
@@ -119,9 +132,11 @@ module MiniProxy
119
132
  @messages.push msg
120
133
  end
121
134
 
122
- def initialize
135
+ def initialize(host)
136
+ @host = host
123
137
  @stubs = []
124
138
  @messages = []
139
+ @allowed_requests = []
125
140
  end
126
141
  end
127
142
  end
@@ -16,8 +16,13 @@ module MiniProxy
16
16
 
17
17
  # @param [WEBrick::HTTPRequest] http_request
18
18
  def match?(http_request)
19
- request_uri = http_request.host + http_request.path
20
- http_request.request_method == @method && request_uri.match?(@url)
19
+ if http_request.request_method == "CONNECT"
20
+ host = http_request.unparsed_uri.split(":").first
21
+ @url.match?(host)
22
+ else
23
+ request_uri = http_request.host + http_request.path
24
+ http_request.request_method == @method && request_uri.match?(@url)
25
+ end
21
26
  end
22
27
  end
23
28
  end
@@ -1,3 +1,3 @@
1
1
  module MiniProxy
2
- VERSION = "0.2.0".freeze
2
+ VERSION = "0.6.0".freeze
3
3
  end
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEowIBAAKCAQEApiAVWSSbE3OwJ51puqy/AcKu87rMYd0sSz2/Ej8sbtcAI2wA
3
+ /lWMqOxyMcwrDQOQQY5I3zbicVSoNyyXyyEmZNgHRT3WYWaF++AYFEAWjT0hrdBx
4
+ 53cBYP7nSAYQjqX+yhDHplukjZ8Pf3wAXVoB67h7SoGopDldbi7Le3hwMPutAkX8
5
+ N8bmGmZ65Oc5ay1EJdUxHS8qyp6I+5kjvFUvLJXMY6DYSEghHOppIHUKSHUno42M
6
+ 0ToS97hDbk52rMYPdjmdJtVuNdUkdf+dyieABMObCrnepBe2NS/luGlEvDru6ZHw
7
+ OwhLA9Y5e4imNMyk9Iz7mYZbm85FT75hVXi8LQIDAQABAoIBADU2EaB8GTAh3krS
8
+ IQuqSYRG18M6Ej1Gmul+3bT6h0D5nRG7hpXw0R1Kn0lUHHYOriZRbQYSjnW+qCME
9
+ JZrrA2FJ0QpcxE5uiHwlS5Ew9ghHjIIgQlvhwo9PFsX7K1KF2RbgSRMAR7UVPeGX
10
+ 1oYQTo0yiktTPLFdro+cbZEfAtCtSHAKO4/fsKdLKHRiXzvGh5auGu1c4d8p5tW7
11
+ C4ijM+/nwzqZi0V5ymm+XBOCk6M6dORCAba30Ej8RKVWoeTO9rbezRKc1DLhVzdA
12
+ Vdjbm/rOuoeUfRYDHMEKojQE4vyIZftXzQogE8zQjSBdWK1RMIPZqCscfPxfArKj
13
+ SB3pOAECgYEA2ZmE6/O51+z6gnp/b4Syg58IV2SwKGJ1AIGAwFY8+r6TJo8Qid3I
14
+ LwBw0aOm8kM2Sh9ILdPVGMsGyqulzTWoBv2HdTimX2RDyJX0h+92wmkrDjhp1ag0
15
+ FOkFRmRceXu588HAH9DD92f5mf4Y3cx36cuXj6uxrPR+XLPuY0Pl9BcCgYEAw3Ec
16
+ oR5BV3VHGGvVmSR1P2PNznV5XDYRQ8xp7w+rwj7X4Lp06upwJGjbFO2aGq5whbo8
17
+ Upc6vtkHKL2kq9zD8PxWAqUWY7NBoEIY+XMQGKbISjVAXlG9jCx3dfqZAE7N1BXl
18
+ OV4CZpLVSEJh0aSyzmplRmhPgqShFzkCAfTfyFsCgYEApG6yV2tSIK1fkIHpEuh/
19
+ zZ67uu7Hf30HVV6HYNDKO+EPaa/qm4QQ5hO7LXAxlBjeSZzh+l99RMMHWtfi7vOB
20
+ CedEGXy5nJQz9Lv8kUyPvdGjS5etwlrdIIAGEG9+wf6RQnZDLMehjq/vmkK9n74H
21
+ T5Ed8t+X4E7RvlPp7PE+L/kCgYA+33WBU3VbyEutzIrzcCoT0WyU3W/EPVSChhES
22
+ Ke1sWMEj93fDVtXqsJzB98naiYGDU60yOJpaaQEHlzKRYzzZmqOkyC0St8kF4B2e
23
+ qehktcq7LLRfY1Zh8LAhkROFaNSIRN7v/JEzJEteqpRDWAN5qfqYktf5RDLagKln
24
+ rboL/wKBgGWKf1MarJRJBmGV4nO2dJhP/AA8jL2OPDlP2BqEbSgoh389nbOJ6/23
25
+ QW67fvoeiGN2ahX/lqsh6+fsV2UnimXd6MWfAXqFF2CP+7po1tWXKnxSEA8Q8xJl
26
+ rFmBRkDrDWz5rjtISAzKDqlSSQHH6oSiriSeud0MSP79VE8VhE3P
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,23 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDzzCCAregAwIBAgIJUuraSSDsABizMA0GCSqGSIb3DQEBCwUAMEwxCzAJBgNV
3
+ BAYTAlVTMRMwEQYDVQQKDApGYXV0aGVudGljMQ0wCwYDVQQLDARUZXN0MRkwFwYD
4
+ VQQDDBB0ZXN0LmV4YW1wbGUuY29tMCAXDTE4MDYyMTA0Mzg1MloYDzIxMTgwNTI4
5
+ MDQzODUyWjBMMQswCQYDVQQGEwJVUzETMBEGA1UECgwKRmF1dGhlbnRpYzENMAsG
6
+ A1UECwwEVGVzdDEZMBcGA1UEAwwQdGVzdC5leGFtcGxlLmNvbTCCASIwDQYJKoZI
7
+ hvcNAQEBBQADggEPADCCAQoCggEBAKYgFVkkmxNzsCedabqsvwHCrvO6zGHdLEs9
8
+ vxI/LG7XACNsAP5VjKjscjHMKw0DkEGOSN824nFUqDcsl8shJmTYB0U91mFmhfvg
9
+ GBRAFo09Ia3Qced3AWD+50gGEI6l/soQx6ZbpI2fD398AF1aAeu4e0qBqKQ5XW4u
10
+ y3t4cDD7rQJF/DfG5hpmeuTnOWstRCXVMR0vKsqeiPuZI7xVLyyVzGOg2EhIIRzq
11
+ aSB1Ckh1J6ONjNE6Eve4Q25OdqzGD3Y5nSbVbjXVJHX/ncongATDmwq53qQXtjUv
12
+ 5bhpRLw67umR8DsISwPWOXuIpjTMpPSM+5mGW5vORU++YVV4vC0CAwEAAaOBsTCB
13
+ rjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQG073fuLEEQGaNZZ33uCDv801H
14
+ JDB8BgNVHSMEdTBzgBQG073fuLEEQGaNZZ33uCDv801HJKFQpE4wTDELMAkGA1UE
15
+ BhMCVVMxEzARBgNVBAoMCkZhdXRoZW50aWMxDTALBgNVBAsMBFRlc3QxGTAXBgNV
16
+ BAMMEHRlc3QuZXhhbXBsZS5jb22CCVLq2kkg7AAYszANBgkqhkiG9w0BAQsFAAOC
17
+ AQEAJ1ZACsEQzlhwCzVWib4IRYsdPimHd7VrLTlqGJFbBp8y+CnCWevA8gJXQxlv
18
+ VZ7eAOlOMyBba0gluz+zis+3nixZXzlZyvfh4bTMKVU/7UO/m8p9v44g7ErT3Zrc
19
+ 4DD+TGEcTwasqb4y5GoKcFF6Rd9j2tbaKWY13JtxMe8gZKW0bubae0pfBPLAw3ep
20
+ p1c4/3uzxbFNGkyacb1scFEdqq8RNRmhgdFzcM00Kqk5niftfgZgPjYK+hwzK2vY
21
+ Q8ZQ3EoF2OTte46qf6chHuhJHvmyIXArX13O3H7aUWirOtY+5dt+CCRS9szQY4K6
22
+ pdnjOJ5PefUoIunXv6BtmMHsGQ==
23
+ -----END CERTIFICATE-----
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: miniproxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - The Conversation Dev Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-02 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: rspec
@@ -66,6 +66,8 @@ files:
66
66
  - lib/miniproxy/stub/request.rb
67
67
  - lib/miniproxy/stub/response.rb
68
68
  - lib/miniproxy/version.rb
69
+ - ssl/cert.key
70
+ - ssl/cert.pem
69
71
  homepage: https://github.com/conversation/miniproxy
70
72
  licenses:
71
73
  - MIT