26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
# File 'lib/rack/url.rb', line 26
def call(env)
req = Rack::Request.new(env)
subdomain = env['SUBDOMAIN'] ? "#{env['SUBDOMAIN']}:" : ''
path = "#{subdomain}#{req.path_info}"
path.downcase! if downcase_before_lookup
target_url = ::Rewritten.translate(path)
chomped_fullpath = req.fullpath.split('?').map { |s| s.chomp('/') }.join('?')
if external_target?(target_url)
r = Rack::Response.new
r.redirect(target_url, 301)
r.finish
elsif ::Rewritten.includes?(chomped_fullpath) || ::Rewritten.includes?(path.chomp('/')) || backwards = (translate_backwards?(path) && ::Rewritten.exist_translation_for?(path))
to = ::Rewritten.includes?(chomped_fullpath)
to ||= ::Rewritten.includes?(path.chomp('/')) || path
current_path = ::Rewritten.get_current_translation(to)
current_path = current_path.split(':').last
current_path_with_query = current_path
current_path = current_path.split('?')[0]
if current_path.size + 1 == req.path_info.size and current_path == req.path_info.chomp('/')
r = Rack::Response.new
new_path = env['rack.url_scheme'].dup
new_path << '://'
new_path << env['HTTP_HOST'].dup.sub(/^#{subdomain.chomp(':')}\./, '')
new_path << current_path
new_path << ::Rewritten.appendix(chomped_fullpath) unless backwards
new_path << '?' << env['QUERY_STRING'] unless (env['QUERY_STRING'] || '').empty?
r.redirect(new_path, 301)
return r.finish
end
if (chomped_fullpath == current_path_with_query || current_path == req.path_info) || (::Rewritten.base_from(req.path_info) == current_path) || ::Rewritten.flag?(path, 'L')
tpath, tparams = split_to_path_params(to)
env['QUERY_STRING'] = Rack::Utils.build_nested_query(tparams.merge(req.params))
req.path_info = tpath + ::Rewritten.appendix(chomped_fullpath)
@app.call(req.env)
else
r = Rack::Response.new
new_path = env['rack.url_scheme'].dup
new_path << '://'
new_path << env['HTTP_HOST'].dup.sub(/^#{subdomain.chomp(':')}\./, '')
new_path << current_path
new_path << ::Rewritten.appendix(path) unless backwards
new_path << '?' << env['QUERY_STRING'] unless (env['QUERY_STRING'] || '').empty?
r.redirect(new_path, 301)
a = r.finish
end
else
@app.call(req.env)
end
end
|