rack-reverse-proxy 0.11.0 → 0.12.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
  SHA1:
3
- metadata.gz: 5006b032a51816d16876f3a92b9a1e0435483832
4
- data.tar.gz: 8c5b31b2cff31606543f2d216bc2937178926b1f
3
+ metadata.gz: 585ae7eb632c419d011c716865928e286d795fcc
4
+ data.tar.gz: 90b7af6bfcabf097166b5e5e24f4fb3346baa4cc
5
5
  SHA512:
6
- metadata.gz: 20c79748659c8c1e0e52294322b7470a7f31cd4ac6c32e83f9d035044badb02f2c9ea5db1b97839c12e629643e26b6ecabced99f7ad6afdc80eccee015e87b38
7
- data.tar.gz: 5990b64a3e455ecfc80f67d5c6059fc48fc1fb0eb94c266653d511459628f118e3158c40612dd7dfe0e2da887916cff8ab4a1ce07e8159d907de7fd35e03c033
6
+ metadata.gz: af3323dcc567ef1c2f1bb177e926d3f65efe8ed3dd0218d3765a5495f30d45aa3527bd744beca11a103e8612b6d71976e8712414dea80abac85e7875d6f6d476
7
+ data.tar.gz: d9978acd0a9122f0a43b313a41ea25333e2ec387c46ca7cdb1835bdeb1ebb9fa0db124a28103127bc91eac8f3fa1e6a2884be9cd08ee354cf5bcb923f48edc86
@@ -1,12 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.8.7
4
- - 1.9.3
5
- - 2.0.0
6
- - 2.1
7
- - 2.2
8
- - jruby-18mode
9
- - jruby-19mode
3
+ - 2.2.5
4
+ - 2.3.1
5
+ - 2.4.1
6
+ - jruby-9.0.5.0
10
7
  - rbx
11
8
 
12
9
  before_install:
@@ -16,4 +13,7 @@ bundler_args: --without development
16
13
 
17
14
  script:
18
15
  - bundle exec rspec
19
- - script/rubocop
16
+
17
+ matrix:
18
+ allow_failures:
19
+ - rvm: rbx
data/Gemfile CHANGED
@@ -3,7 +3,7 @@ source "https://rubygems.org"
3
3
  gemspec
4
4
 
5
5
  ruby_version = RUBY_VERSION.to_f
6
- rubocop_platform = [:ruby_20, :ruby_21, :ruby_22]
6
+ rubocop_platform = [:ruby_20, :ruby_21, :ruby_22, :ruby_23, :ruby_24]
7
7
  rubocop_platform = [:ruby_20, :ruby_21] if ruby_version < 2.0
8
8
 
9
9
  group :test do
data/README.md CHANGED
@@ -39,7 +39,7 @@ use Rack::ReverseProxy do
39
39
  end
40
40
 
41
41
  app = proc do |env|
42
- [ 200, {'Content-Type' => 'text/plain'}, "b" ]
42
+ [ 200, {'Content-Type' => 'text/plain'}, ["b"] ]
43
43
  end
44
44
  run app
45
45
  ```
@@ -1,7 +1,7 @@
1
1
  module RackReverseProxy
2
2
  module Errors
3
3
  # GenericURI indicates that url is too generic
4
- class GenericURI < Exception
4
+ class GenericURI < RuntimeError
5
5
  attr_reader :url
6
6
 
7
7
  def intialize(url)
@@ -14,7 +14,7 @@ module RackReverseProxy
14
14
  end
15
15
 
16
16
  # AmbiguousMatch indicates that path matched more than one endpoint
17
- class AmbiguousMatch < Exception
17
+ class AmbiguousMatch < RuntimeError
18
18
  attr_reader :path, :matches
19
19
 
20
20
  def initialize(path, matches)
@@ -98,6 +98,7 @@ module RackReverseProxy
98
98
  return unless options[:x_forwarded_headers]
99
99
  target_request_headers["X-Forwarded-Host"] = source_request.host
100
100
  target_request_headers["X-Forwarded-Port"] = source_request.port.to_s
101
+ target_request_headers["X-Forwarded-Proto"] = source_request.scheme
101
102
  end
102
103
 
103
104
  def initialize_http_header
@@ -207,7 +208,11 @@ module RackReverseProxy
207
208
  setup_request
208
209
  setup_response_headers
209
210
 
210
- rack_response
211
+ transform_response(rack_response)
212
+ end
213
+
214
+ def transform_response(response)
215
+ rule.transform(path, env, response, uri, headers, source_request)
211
216
  end
212
217
 
213
218
  def format_headers(headers)
@@ -238,7 +243,7 @@ module RackReverseProxy
238
243
  end
239
244
 
240
245
  def find_rule
241
- return if matches.length < 1
246
+ return if matches.empty?
242
247
  non_ambiguous_match
243
248
  matches.first
244
249
  end
@@ -25,6 +25,16 @@ module RackReverseProxy
25
25
  ).build_uri
26
26
  end
27
27
 
28
+ def transform(path, env, response, request_uri, *args)
29
+ Candidate.new(
30
+ self,
31
+ has_custom_url,
32
+ path,
33
+ env,
34
+ matches(path, *args)
35
+ ).transform(response, request_uri)
36
+ end
37
+
28
38
  def to_s
29
39
  %("#{spec}" => "#{url}")
30
40
  end
@@ -68,6 +78,10 @@ module RackReverseProxy
68
78
  raw_uri
69
79
  end
70
80
 
81
+ def transform(response, request_uri)
82
+ matches.transform(response, request_uri)
83
+ end
84
+
71
85
  private
72
86
 
73
87
  attr_reader :rule, :url, :has_custom_url, :path, :env, :matches
@@ -138,6 +152,16 @@ module RackReverseProxy
138
152
  end
139
153
  end
140
154
 
155
+ def transform(response, request_uri)
156
+ found.inject(response) do |accumulator, match|
157
+ if match.respond_to?(:transform)
158
+ match.transform(accumulator, request_uri)
159
+ else
160
+ accumulator
161
+ end
162
+ end
163
+ end
164
+
141
165
  private
142
166
 
143
167
  attr_reader :spec, :url, :path, :headers, :rackreq, :spec_arity, :has_custom_url
@@ -1,4 +1,4 @@
1
1
  #:nodoc:
2
2
  module RackReverseProxy
3
- VERSION = "0.11.0".freeze
3
+ VERSION = "0.12.0".freeze
4
4
  end
@@ -2,6 +2,7 @@ lib = File.expand_path("../lib", __FILE__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
  require "rack_reverse_proxy/version"
4
4
 
5
+ # rubocop:disable
5
6
  Gem::Specification.new do |spec|
6
7
  spec.name = "rack-reverse-proxy"
7
8
  spec.version = RackReverseProxy::VERSION
@@ -35,8 +36,9 @@ eos
35
36
  spec.require_paths = ["lib"]
36
37
 
37
38
  spec.add_dependency "rack", ">= 1.0.0"
38
- spec.add_dependency "rack-proxy", "~> 0.5", ">= 0.5.14"
39
+ spec.add_dependency "rack-proxy", "~> 0.6", ">= 0.6.1"
39
40
 
40
41
  spec.add_development_dependency "bundler", "~> 1.7"
41
42
  spec.add_development_dependency "rake", "~> 10.3"
42
43
  end
44
+ # rubocop:enable
@@ -1,4 +1,6 @@
1
1
  require "spec_helper"
2
+ require "cgi"
3
+ require "base64"
2
4
 
3
5
  RSpec.describe Rack::ReverseProxy do
4
6
  include Rack::Test::Methods
@@ -102,6 +104,16 @@ RSpec.describe Rack::ReverseProxy do
102
104
  ).to have_been_made
103
105
  end
104
106
 
107
+ it "sets the X-Forwarded-Proto header to the proxying scheme by default" do
108
+ stub_request(:any, "example.com/test/stuff")
109
+ get "https://example.com/test/stuff"
110
+ expect(
111
+ a_request(:get, "example.com/test/stuff").with(
112
+ :headers => { "X-Forwarded-Proto" => "https" }
113
+ )
114
+ ).to have_been_made
115
+ end
116
+
105
117
  it "does not produce headers with a Status key" do
106
118
  stub_request(:get, "http://example.com/2test").to_return(
107
119
  :status => 301, :headers => { :status => "301 Moved Permanently" }
@@ -249,6 +261,17 @@ RSpec.describe Rack::ReverseProxy do
249
261
  ).not_to have_been_made
250
262
  expect(a_request(:get, "http://example.com/test/stuff")).to have_been_made
251
263
  end
264
+
265
+ it "does not set the X-Forwarded-Proto header to the proxying scheme" do
266
+ stub_request(:any, "example.com/test/stuff")
267
+ get "https://example.com/test/stuff"
268
+ expect(
269
+ a_request(:get, "example.com/test/stuff").with(
270
+ :headers => { "X-Forwarded-Proto" => "https" }
271
+ )
272
+ ).not_to have_been_made
273
+ expect(a_request(:get, "example.com/test/stuff")).to have_been_made
274
+ end
252
275
  end
253
276
 
254
277
  describe "with timeout configuration" do
@@ -289,7 +312,9 @@ RSpec.describe Rack::ReverseProxy do
289
312
  end
290
313
 
291
314
  it "makes request with basic auth" do
292
- stub_request(:get, "http://joe:shmoe@example.com/test/stuff").to_return(
315
+ stub_request(:get, "http://example.com/test/stuff").with(
316
+ :basic_auth => %w(joe shmoe)
317
+ ).to_return(
293
318
  :body => "secured content"
294
319
  )
295
320
  get "/test/stuff"
@@ -558,6 +583,46 @@ RSpec.describe Rack::ReverseProxy do
558
583
  end
559
584
  end
560
585
 
586
+ describe "with a matching and transforming class" do
587
+ #:nodoc:
588
+ class MatcherAndTransformer
589
+ def self.match(_path)
590
+ MatcherAndTransformer.new
591
+ end
592
+
593
+ def url(_path)
594
+ "http://example.org/redirecting"
595
+ end
596
+
597
+ def transform(response, request_uri)
598
+ status, headers, body = response
599
+ location = headers["Location"]
600
+ headers["Location"] = "?url=" + CGI.escape(location) +
601
+ "&request_uri=" + CGI.escape(request_uri.to_s)
602
+ [status, headers, body]
603
+ end
604
+ end
605
+
606
+ def app
607
+ Rack::ReverseProxy.new(dummy_app) do
608
+ reverse_proxy MatcherAndTransformer
609
+ end
610
+ end
611
+
612
+ it "transforms the proxied response" do
613
+ stub_request(:get, "http://example.org/redirecting").to_return(
614
+ :headers => {
615
+ "Location" => "http://example.org/target"
616
+ }
617
+ )
618
+
619
+ get "/"
620
+ expect(last_response.headers["Location"])
621
+ .to eq("?url=http%3A%2F%2Fexample.org%2Ftarget" \
622
+ "&request_uri=http%3A%2F%2Fexample.org%2Fredirecting")
623
+ end
624
+ end
625
+
561
626
  describe "with a matching class" do
562
627
  #:nodoc:
563
628
  class RequestMatcher
@@ -607,9 +672,9 @@ RSpec.describe Rack::ReverseProxy do
607
672
  #:nodoc:
608
673
  class MatcherHeaders
609
674
  def self.match(path, headers)
610
- if path.match(%r{^/test}) && headers["ACCEPT"] && headers["ACCEPT"] == "foo.bar"
611
- MatcherHeaders.new
612
- end
675
+ MatcherHeaders.new if path.match(%r{^/test}) &&
676
+ headers["ACCEPT"] &&
677
+ headers["ACCEPT"] == "foo.bar"
613
678
  end
614
679
 
615
680
  def url(path)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-reverse-proxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Swope
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2016-03-02 00:00:00.000000000 Z
14
+ date: 2017-04-05 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rack
@@ -33,20 +33,20 @@ dependencies:
33
33
  requirements:
34
34
  - - "~>"
35
35
  - !ruby/object:Gem::Version
36
- version: '0.5'
36
+ version: '0.6'
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: 0.5.14
39
+ version: 0.6.1
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '0.5'
46
+ version: '0.6'
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: 0.5.14
49
+ version: 0.6.1
50
50
  - !ruby/object:Gem::Dependency
51
51
  name: bundler
52
52
  requirement: !ruby/object:Gem::Requirement
@@ -131,7 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
131
  version: '0'
132
132
  requirements: []
133
133
  rubyforge_project:
134
- rubygems_version: 2.4.6
134
+ rubygems_version: 2.6.10
135
135
  signing_key:
136
136
  specification_version: 4
137
137
  summary: A Simple Reverse Proxy for Rack