pretty_proxy 1.0.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/example/example_conf.json +2 -1
- data/lib/pretty_proxy.rb +47 -33
- data/spec/pretty_proxy_spec.rb +14 -9
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53c916eb8a133fba2863121b82f713be339870d9
|
4
|
+
data.tar.gz: 20203a8923d5fdf6a74a28f88fb9cd48ed29ec0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3df53ebf6c8ddcff87a78488ca2d21f862017d5916c6daa7aad70cf242bfe17238b431c538baca7586c51ed55d04d8edb8e491f153ec5042c38d2b380741ca7a
|
7
|
+
data.tar.gz: 9a5eb9afaa314dd26f3efa3e491431413aea0d1df5f08640f5e8a8e904992ba3560ccb312a7e5a2e8a6f791ab7e0f88d1179fa72e3c431cf01b84b444431fc6a
|
data/example/example_conf.json
CHANGED
@@ -23,7 +23,8 @@
|
|
23
23
|
" </div>",
|
24
24
|
" <div>",
|
25
25
|
" <a href=\"ORIGINAL_DOMAIN/PROXY_PATH/p1\" >and yet another link</a>",
|
26
|
-
" <p><a href=\"../PROXY_PATH/p1\" >
|
26
|
+
" <p><a href=\"../PROXY_PATH/p1\" >almost there</a></p>",
|
27
|
+
" <p><a href=\"/p1\" >the last link</a></p>",
|
27
28
|
" </div>",
|
28
29
|
"</body>",
|
29
30
|
"</html>"
|
data/lib/pretty_proxy.rb
CHANGED
@@ -84,10 +84,11 @@ class PrettyProxy < Rack::Proxy
|
|
84
84
|
|
85
85
|
@proxy_path = proxy_path.clone
|
86
86
|
@original_domain = URI(original_domain.clone)
|
87
|
+
@original_paths = Set.new
|
87
88
|
if original_paths.respond_to? :each
|
88
|
-
@original_paths
|
89
|
+
original_paths.each { | value | @original_paths << value.clone }
|
89
90
|
else
|
90
|
-
@original_paths
|
91
|
+
@original_paths << original_paths.clone
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
@@ -96,7 +97,8 @@ class PrettyProxy < Rack::Proxy
|
|
96
97
|
# @!attribute original_domain
|
97
98
|
# return the clone of the internal value
|
98
99
|
# @!attribute original_paths
|
99
|
-
# return the clone of the internal value
|
100
|
+
# return the clone of the internal value (always a Set, no matter what is
|
101
|
+
# passed to initialize).
|
100
102
|
[:proxy_path, :original_domain, :original_paths].each do | reader |
|
101
103
|
define_method(reader) { instance_variable_get("@#{reader.to_s}").clone }
|
102
104
|
end
|
@@ -158,32 +160,33 @@ class PrettyProxy < Rack::Proxy
|
|
158
160
|
def proxify_hyperlink(hyperlink, proxy_page_url)
|
159
161
|
hyperlink = URI(hyperlink.clone)
|
160
162
|
proxy_page_url = URI(proxy_page_url)
|
161
|
-
if
|
162
|
-
|
163
|
+
if hyperlink.scheme
|
164
|
+
if inside_proxy_control? hyperlink
|
165
|
+
unless point_to_a_proxy_page?(hyperlink, proxy_page_url)
|
166
|
+
hyperlink = proxify_uri(hyperlink, proxy_page_url)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
else
|
170
|
+
# recreate the original site url from the relative/absolute path
|
163
171
|
absolute_link = unproxify_url proxy_page_url
|
164
172
|
absolute_link.path = Pathname.new(absolute_link.path).join(hyperlink.path).to_s
|
165
173
|
if inside_proxy_control? absolute_link
|
166
|
-
if
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
+
if Pathname.new(hyperlink.path).relative?
|
175
|
+
if same_domain_as_original?(proxy_page_url) &&
|
176
|
+
valid_path_for_proxy?(absolute_link.path)
|
177
|
+
# in the case of a relative path in the original page who points
|
178
|
+
# to a proxy page, and the proxy page is inside the proxy control
|
179
|
+
# we have to use the absolute_link or the page will be double proxified
|
180
|
+
# example: ../proxy/content in http://example.com/proxy/content, with
|
181
|
+
# original_path as '/' is http://example.com/proxy/proxy/content
|
182
|
+
hyperlink = absolute_link
|
183
|
+
end
|
184
|
+
else # is absolute
|
185
|
+
hyperlink.path = @proxy_path + hyperlink.path[1..-1]
|
174
186
|
end
|
175
187
|
else
|
176
188
|
hyperlink = absolute_link
|
177
189
|
end
|
178
|
-
else
|
179
|
-
if inside_proxy_control? hyperlink
|
180
|
-
unless point_to_a_proxy_page?(hyperlink, proxy_page_url)
|
181
|
-
hyperlink.scheme = proxy_page_url.scheme
|
182
|
-
hyperlink.host = proxy_page_url.host
|
183
|
-
hyperlink.port = proxy_page_url.port
|
184
|
-
hyperlink.path = @proxy_path + hyperlink.path[1..-1]
|
185
|
-
end
|
186
|
-
end
|
187
190
|
end
|
188
191
|
|
189
192
|
hyperlink.to_s
|
@@ -375,17 +378,19 @@ class PrettyProxy < Rack::Proxy
|
|
375
378
|
# Check if the absolute path begin with a proxy_path and is followed by a
|
376
379
|
# original_paths element.
|
377
380
|
def valid_path_for_proxy?(absolute_path)
|
381
|
+
return false unless absolute_path.start_with?(@proxy_path)
|
382
|
+
|
378
383
|
path_without_proxy_prefix = absolute_path[(@proxy_path.size-1)..-1]
|
379
|
-
# if we don't add the trailing slash '/about' and '/about_us' match
|
380
|
-
original_paths_with_trailing_slash = []
|
381
|
-
@original_paths.each do | path |
|
382
|
-
original_paths_with_trailing_slash << (path.end_with?('/') ? path : "#{path}/")
|
383
|
-
end
|
384
384
|
|
385
|
-
|
386
|
-
|
385
|
+
@original_paths.any? do | original_path |
|
386
|
+
# if we don't test this '/about' and '/about_us' will match
|
387
|
+
if original_path.end_with? '/'
|
387
388
|
path_without_proxy_prefix.start_with? original_path
|
389
|
+
else
|
390
|
+
path_without_proxy_prefix == original_path ||
|
391
|
+
path_without_proxy_prefix.start_with?("#{original_path}/")
|
388
392
|
end
|
393
|
+
end
|
389
394
|
end
|
390
395
|
|
391
396
|
# Take a url and the proxy domain (scheme, host and port) and return if
|
@@ -395,12 +400,21 @@ class PrettyProxy < Rack::Proxy
|
|
395
400
|
valid_path_for_proxy?(hyperlink.path)
|
396
401
|
end
|
397
402
|
|
403
|
+
# api private Don't use this method.
|
404
|
+
def proxify_uri(uri, proxy_domain)
|
405
|
+
uri = uri.clone
|
406
|
+
|
407
|
+
uri.scheme = proxy_domain.scheme
|
408
|
+
uri.host = proxy_domain.host
|
409
|
+
uri.port = proxy_domain.port
|
410
|
+
uri.path = @proxy_path + uri.path[1..-1]
|
411
|
+
|
412
|
+
uri
|
413
|
+
end
|
414
|
+
private :proxify_uri
|
415
|
+
|
398
416
|
# api private Don't use the methods of this class. They are for internal use only.
|
399
417
|
module Utils
|
400
|
-
def self.relative_path?(hyperlink)
|
401
|
-
! hyperlink.scheme
|
402
|
-
end
|
403
|
-
|
404
418
|
def self.same_domain?(u1, u2)
|
405
419
|
u1.scheme == u2.scheme &&
|
406
420
|
u1.host == u2.host &&
|
data/spec/pretty_proxy_spec.rb
CHANGED
@@ -39,7 +39,8 @@ describe PrettyProxy do
|
|
39
39
|
</div>
|
40
40
|
<div>
|
41
41
|
<a href="ARG_4" >and yet another link</a>
|
42
|
-
<p><a href="ARG_5" >
|
42
|
+
<p><a href="ARG_5" >almost there</a></p>
|
43
|
+
<p><a href="ARG_6" >the last link</a></p>
|
43
44
|
</div>
|
44
45
|
</body>
|
45
46
|
</html>
|
@@ -53,13 +54,14 @@ describe PrettyProxy do
|
|
53
54
|
'http://othersite.net',
|
54
55
|
'../p3', '../p2/p2_2/',
|
55
56
|
'http://site.net/proxy/p1',
|
56
|
-
'../proxy/p1']) }
|
57
|
+
'../proxy/p1', '/p1']) }
|
57
58
|
|
58
59
|
let(:proxified_html) { generate_html_for_test(['http://site.net/proxy/p2/p2_2/',
|
59
60
|
'http://othersite.net',
|
60
61
|
'http://site.net/p3', '../p2/p2_2/',
|
61
62
|
'http://site.net/proxy/p1',
|
62
|
-
'http://site.net/proxy/p1'
|
63
|
+
'http://site.net/proxy/p1',
|
64
|
+
'/proxy/p1']) }
|
63
65
|
|
64
66
|
let (:correct_new_args_example) { ['/proxy/', 'http://myoriginalsite.com', '/content'] }
|
65
67
|
let (:pp) { described_class.new(*correct_new_args_example) }
|
@@ -113,7 +115,7 @@ describe PrettyProxy do
|
|
113
115
|
describe "##{reader_method.to_s}" do
|
114
116
|
return_changers = { proxy_path: :chop!,
|
115
117
|
original_domain: ->(uri){ uri.host = 'otherdomain.com'},
|
116
|
-
original_paths: :
|
118
|
+
original_paths: :clear }
|
117
119
|
|
118
120
|
it_behaves_like 'an reader method who encapsulate a mutable variable' do
|
119
121
|
let(:reader_method_name) { reader_method }
|
@@ -185,13 +187,16 @@ describe PrettyProxy do
|
|
185
187
|
describe '#proxify_hyperlink' do
|
186
188
|
let (:pp) { described_class.new('/proxy/', 'http://site.net', ['/p1', '/p2/p2_2/']) }
|
187
189
|
|
188
|
-
it "proxify absolute
|
190
|
+
it "proxify absolute paths to inside the proxy control" do
|
191
|
+
expect(pp.proxify_hyperlink('/p2/p2_2/', 'http://theproxy.net/proxy/p1')).to eq '/proxy/p2/p2_2/'
|
192
|
+
end
|
193
|
+
it "proxify hyperlinks with scheme to inside the proxy control" do
|
189
194
|
expect(pp.proxify_hyperlink('http://site.net/p2/p2_2/', 'http://theproxy.net/proxy/p1')).to eq 'http://theproxy.net/proxy/p2/p2_2/'
|
190
195
|
end
|
191
|
-
it "don't change
|
196
|
+
it "don't change hyperlinks with scheme to ouside the proxy control" do
|
192
197
|
expect(pp.proxify_hyperlink('http://othersite.net', 'http://theproxy.net/proxy/p1')).to eq 'http://othersite.net'
|
193
198
|
end
|
194
|
-
it 'change to
|
199
|
+
it 'change to urls the relative paths to outside the proxy control' do
|
195
200
|
expect(pp.proxify_hyperlink('../p3', 'http://theproxy.net/proxy/p1')).to eq 'http://site.net/p3'
|
196
201
|
expect(pp.proxify_hyperlink('../p2/p2_2', 'http://theproxy.net/proxy/p1')).to eq 'http://site.net/p2/p2_2' # without the trailing '/'
|
197
202
|
end
|
@@ -202,11 +207,11 @@ describe PrettyProxy do
|
|
202
207
|
context 'when the proxy itself is inside the proxy control' do
|
203
208
|
let (:pp) { described_class.new('/proxy/', 'http://site.net', '/') }
|
204
209
|
|
205
|
-
it "dont't change
|
210
|
+
it "dont't change urls to the proxy itself" do
|
206
211
|
expect(pp.proxify_hyperlink('http://site.net/proxy/p1', 'http://site.net/proxy/p1')).to eq 'http://site.net/proxy/p1'
|
207
212
|
expect(pp.proxify_hyperlink('http://site.net/proxy/p1', 'http://site.net/proxy/p2/p2_2/')).to eq 'http://site.net/proxy/p1'
|
208
213
|
end
|
209
|
-
it 'change to
|
214
|
+
it 'change to urls the relative paths to the proxy itself' do
|
210
215
|
expect(pp.proxify_hyperlink('../proxy/p1', 'http://site.net/proxy/p1')).to eq 'http://site.net/proxy/p1'
|
211
216
|
expect(pp.proxify_hyperlink('../../proxy/p1', 'http://site.net/proxy/p2/p2_2/')).to eq 'http://site.net/proxy/p1'
|
212
217
|
end
|