miniproxy 0.2.0 → 0.6.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
  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