refraction2 0.2.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 8b9be8d806089e0ab258abdb8d39764f6b4aa9a3b0da00624e4c1a6c8807725a
4
+ data.tar.gz: 1e3721b59574a86f9bd4fc8571030fdbb965201d2d2cdd77358347f541a9979c
5
+ SHA512:
6
+ metadata.gz: ce9d8cedf5f47c6fc7e8759552525acddef855446757d5a8451f577756350c25b0c1e58de9cc9bdeda5fc505ecc28ade10487af8f91902b95327e55cfc833e03
7
+ data.tar.gz: 3ed4cb5e21d061206f8fb93d25ab85ef0e63bc01a197afaba006426499b4e917fa104ba90da0630a28f7de7095c63628b0bdc4ad2448ea1108e302e438b347d0
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/CHANGELOG.md ADDED
@@ -0,0 +1,16 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.2.1] - 2022-05-30 (first release as `refraction2`)
11
+
12
+ ### Fixed
13
+
14
+ - fixed host and port overrides for Rack 2.2+
15
+
16
+ ## [0.1.3] - 2010-02-01 (last release as `refraction` by Josh Susser)
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in repper.gemspec
4
+ gemspec
5
+
6
+ gem 'rack-test', '~> 1.1'
7
+ gem 'rake', '~> 13.0'
8
+ gem 'rspec', '~> 3.0'
9
+
data/LICENSE.txt ADDED
@@ -0,0 +1,44 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2022 Janosch Müller
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
22
+
23
+ Based on refraction by Pivotal Labs, Josh Susser, Sam Pierson, Wai Lun Mang.
24
+
25
+ Copyright (c) 2009-2010 Pivotal Labs
26
+
27
+ Permission is hereby granted, free of charge, to any person obtaining
28
+ a copy of this software and associated documentation files (the
29
+ "Software"), to deal in the Software without restriction, including
30
+ without limitation the rights to use, copy, modify, merge, publish,
31
+ distribute, sublicense, and/or sell copies of the Software, and to
32
+ permit persons to whom the Software is furnished to do so, subject to
33
+ the following conditions:
34
+
35
+ The above copyright notice and this permission notice shall be
36
+ included in all copies or substantial portions of the Software.
37
+
38
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
39
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
40
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
41
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
42
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
43
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
44
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,138 @@
1
+ # Refraction2
2
+
3
+ `refraction2` is a Rack 2.2+ compatible re-release and drop-in replacement for
4
+ [joshsusser/refraction](https://github.com/joshsusser/refraction).
5
+
6
+ ## Original README
7
+
8
+ Refraction is a Rack middleware replacement for `mod_rewrite`. It can rewrite URLs before they are
9
+ processed by your web application, and can redirect using 301 and 302 status codes. Refraction is
10
+ thread-safe, so it doesn't need to be guarded by Rack::Lock.
11
+
12
+ The best thing about Refraction is that rewrite rules are written in plain old Ruby code, not some
13
+ funky web server config syntax. That means you can use Ruby regular expressions, case statements,
14
+ conditionals, and whatever else you feel like.
15
+
16
+ For example:
17
+
18
+ Refraction.configure do |req|
19
+ feedburner = "http://feeds.pivotallabs.com/pivotallabs"
20
+
21
+ if req.env['HTTP_USER_AGENT'] !~ /FeedBurner|FeedValidator/ && req.host =~ /pivotallabs\.com/
22
+ case req.path
23
+ when %r{^/(talks|blabs|blog)\.(atom|rss)$} ; req.found! "#{feedburner}/#{$1}.#{$2}"
24
+ when %r{^/users/(chris|edward)/blog\.(atom|rss)$} ; req.found! "#{feedburner}/#{$1}.#{$2}"
25
+ end
26
+ else
27
+ case req.host
28
+ when 'tweed.pivotallabs.com'
29
+ req.rewrite! "http://pivotallabs.com/tweed#{req.path}"
30
+ when /([-\w]+\.)?pivotallabs\.com/
31
+ # passthrough with no change
32
+ else # wildcard domains (e.g. pivotalabs.com)
33
+ req.permanent! :host => "pivotallabs.com"
34
+ end
35
+ end
36
+ end
37
+
38
+ Notice the use of regular expressions, the $1, $2, etc pseudo-variables, and string interpolation.
39
+ This is an easy way to match URL patterns and assemble the new URL based on what was matched.
40
+
41
+ ## Installation (Rails)
42
+
43
+ Refraction can be installed in a Rails application as a plugin.
44
+
45
+ $ script/plugin install git://github.com/pivotal/refraction.git
46
+
47
+ It can also be used as a gem:
48
+
49
+ $ gem install refraction
50
+
51
+ In `environments/production.rb`, add Refraction at or near the top of your middleware stack.
52
+
53
+ config.middleware.insert_before(::Rack::Lock, ::Refraction, {})
54
+
55
+ You may want to occasionally turn on Refraction in the development environment for testing
56
+ purposes, but if your rules redirect to other servers that can be a problem.
57
+
58
+ Put your rules in `config/initializers/refraction_rules.rb` (see example above). The file name
59
+ doesn't actually matter, but convention is useful.
60
+
61
+ ## Server Configuration
62
+
63
+ If your application is serving multiple virtual hosts, it's probably easiest to configure your web
64
+ server to handle a wildcard server name and let Refraction handle managing the virtual hosts. For
65
+ example, in nginx, that is done with a `server_name _;` directive.
66
+
67
+ ## Writing Rules
68
+
69
+ Set up your rewrite/redirection rules during your app initialization using `Refraction.configure`.
70
+ The `configure` method takes a block which is run for every request to process the rules. The block
71
+ is passed a RequestContext object that contains information about the request URL and environment.
72
+ The request object also has a small API for effecting rewrites and redirects.
73
+
74
+ > Important note: don't do a `return` from within the configuration
75
+ > block. That would be bad (meaning your entire application would
76
+ > break). That's just how blocks work in Ruby.
77
+
78
+ ### `RequestContext#set(options)`
79
+
80
+ The `set` method takes an options hash that sets pieces of the rewritten URL or redirect location
81
+ header.
82
+
83
+ * :scheme - Usually `http` or `https`.
84
+ * :host - The server name.
85
+ * :port - The server port. Usually not needed, as the scheme implies a default value.
86
+ * :path - The path of the URL.
87
+ * :query - Added at the end of the URL after a question mark (?)
88
+
89
+ Any URL components not explicitly set remain unchanged from the original request URL. You can use
90
+ `set` before calls to `rewrite!`, `permanent!`, or `found!` to set common values. Subsequent
91
+ methods will merge their component values into values from `set`.
92
+
93
+ ### `RequestContext#rewrite!(options)`
94
+
95
+ The `rewrite!` method modifies the request URL and relevant pieces of the environment. When
96
+ Refraction rule processing results in a `rewrite!`, the request is passed on down the Rack stack
97
+ to the app or the next middleware component. `rewrite!` can take a single argument, either an
98
+ options hash that uses the same options as the `set` method, or a string that sets all components
99
+ of the URL.
100
+
101
+ ### `RequestContext#permanent!(options)`
102
+
103
+ The `permanent!` method tells Refraction to return a response with a `301 Moved Permanently`
104
+ status, and sets the URL for the Location header. Like `rewrite!` it can take either a string or
105
+ hash argument to set the URL or some of its components.
106
+
107
+ ### `RequestContext#found!(options)`
108
+
109
+ The `found!` method tells Refraction to return a response with a `302 Found` status, and sets the
110
+ URL for the Location header. Like `#rewrite!` it can take either a string or hash argument to set
111
+ the URL or some of its components.
112
+
113
+ ### `RequestContext#respond!(status, headers, content)`
114
+
115
+ Use `respond!` to return an arbitrary response to the request. This is useful for responding with
116
+ the contents of a static file. For example:
117
+
118
+ req.respond!(503, {'Content-Type' => 'text/html'}, File.read(MAINTENANCE_PATH))
119
+
120
+ The args are largely the same as the contents of a standard Rack response array with the exceptions
121
+ that you don't need to wrap the content in an array, and the Content-Length header is generated so it
122
+ should not be supplied.
123
+
124
+ ### URL components
125
+
126
+ The request object provides the following components of the URL for matching requests: `scheme`,
127
+ `host`, `port`, `path`, and `query`. It also provides a full environment hash as the `env`
128
+ attribute. For example, `req.env['HTTP_USER_AGENT']` can be used to access the request's user
129
+ agent property.
130
+
131
+ ## Contributors
132
+
133
+ * Josh Susser (maintainer)
134
+ * Sam Pierson
135
+ * Wai Lun Mang
136
+ * Brian Morearty
137
+
138
+ Copyright (c) 2009-2010 Pivotal Labs. This software is licensed under the MIT License.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: %i[spec]
@@ -0,0 +1,3 @@
1
+ class Refraction
2
+ VERSION = '0.2.1'
3
+ end
data/lib/refraction.rb ADDED
@@ -0,0 +1,123 @@
1
+ require 'rack'
2
+ require_relative 'refraction/version'
3
+
4
+ class Refraction
5
+ class Request < Rack::Request
6
+ attr_reader :action, :status, :message
7
+
8
+ # backward compatibility: support URI::HTTP component names
9
+ def method; request_method; end
10
+ def query; query_string; end
11
+
12
+ ### actions
13
+
14
+ def set(options)
15
+ if options.is_a?(String)
16
+ @re_location = options
17
+ else
18
+ @re_scheme = options[:protocol] if options[:protocol] # :protocol is alias for :scheme
19
+ @re_scheme = options[:scheme] if options[:scheme]
20
+ @re_host = options[:host] if options[:host]
21
+ @re_port = options[:port] if options[:port]
22
+ @re_path = options[:path] if options[:path]
23
+ @re_query = options[:query] if options[:query]
24
+ end
25
+ end
26
+
27
+ def rewrite!(options)
28
+ @action = :rewrite
29
+ set(options)
30
+ end
31
+
32
+ def permanent!(options)
33
+ @action = :permanent
34
+ @status = 301
35
+ set(options)
36
+ @message = "moved to #{@uri}"
37
+ end
38
+
39
+ def found!(options)
40
+ @action = :found
41
+ @status = 302
42
+ set(options)
43
+ @message = "moved to #{@uri}"
44
+ end
45
+
46
+ def respond!(status, headers, content)
47
+ @action = :respond
48
+ @status = status
49
+ @headers = headers
50
+ @message = content
51
+ end
52
+
53
+ ### response
54
+
55
+ def response
56
+ headers = @headers || { 'Location' => location, 'Content-Type' => 'text/plain' }
57
+ headers['Content-Length'] = message.length.to_s
58
+ [status, headers, [message]]
59
+ end
60
+
61
+ def location
62
+ @re_location || url
63
+ end
64
+
65
+ # use original request's values when not set explicitly
66
+ def scheme; @re_scheme || super; end
67
+ def host; @re_host || super; end
68
+ def path; @re_path || super; end
69
+ def query_string; @re_query || super; end
70
+
71
+ # changing the scheme or host means use default port instead of port in original request
72
+ def port
73
+ @re_port || ((@re_scheme || @re_host) && DEFAULT_PORTS[scheme]) || super
74
+ end
75
+
76
+ def host_with_port
77
+ port.nil? || port == DEFAULT_PORTS[scheme] ? host : "#{host}:#{port}"
78
+ end
79
+
80
+ def http_host
81
+ port ? "#{host}:#{port}" : host
82
+ end
83
+ end ### class Request
84
+
85
+ def self.configure(&block)
86
+ @rules = block
87
+ end
88
+
89
+ def self.rules
90
+ @rules
91
+ end
92
+
93
+ def initialize(app)
94
+ @app = app
95
+ end
96
+
97
+ def rules
98
+ self.class.rules
99
+ end
100
+
101
+ def call(env)
102
+ return @app.call(env) unless rules
103
+
104
+ request = Request.new(env)
105
+ rules.call(request)
106
+
107
+ case request.action
108
+ when :permanent, :found, :respond
109
+ request.response
110
+ when :rewrite
111
+ env["rack.url_scheme"] = request.scheme
112
+ env["HTTP_HOST"] = request.http_host
113
+ env["SERVER_NAME"] = request.host
114
+ env["HTTP_PORT"] = request.port if request.port
115
+ env["PATH_INFO"] = request.path
116
+ env["QUERY_STRING"] = request.query
117
+ env["REQUEST_URI"] = request.fullpath
118
+ @app.call(env)
119
+ else
120
+ @app.call(env)
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,2 @@
1
+ # make gem require-able as "refraction2"
2
+ require_relative 'refraction'
@@ -0,0 +1,26 @@
1
+ require_relative 'lib/refraction/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'refraction2'
5
+ spec.version = Refraction::VERSION
6
+ spec.authors = ['Pivotal Labs', 'Josh Susser', 'Sam Pierson', 'Wai Lun Mang', 'Janosch Müller']
7
+ spec.email = ['janosch84@gmail.com']
8
+
9
+ spec.summary = 'Rack middleware replacement for joshsusser/refraction'
10
+ spec.homepage = 'https://github.com/jaynetics/refraction2'
11
+ spec.license = 'MIT'
12
+ spec.required_ruby_version = '>= 2.5.0'
13
+
14
+ spec.metadata['homepage_uri'] = spec.homepage
15
+ spec.metadata['source_code_uri'] = spec.homepage
16
+
17
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
18
+ `git ls-files -z`.split("\x0").reject do |f|
19
+ (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|circleci)|appveyor)})
20
+ end
21
+ end
22
+ spec.require_paths = ['lib']
23
+
24
+ spec.add_runtime_dependency 'rack', '>= 2.2'
25
+ end
26
+
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: refraction2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Pivotal Labs
8
+ - Josh Susser
9
+ - Sam Pierson
10
+ - Wai Lun Mang
11
+ - Janosch Müller
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+ date: 2022-05-30 00:00:00.000000000 Z
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: rack
19
+ requirement: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: '2.2'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ version: '2.2'
31
+ description:
32
+ email:
33
+ - janosch84@gmail.com
34
+ executables: []
35
+ extensions: []
36
+ extra_rdoc_files: []
37
+ files:
38
+ - ".rspec"
39
+ - CHANGELOG.md
40
+ - Gemfile
41
+ - LICENSE.txt
42
+ - README.md
43
+ - Rakefile
44
+ - lib/refraction.rb
45
+ - lib/refraction/version.rb
46
+ - lib/refraction2.rb
47
+ - refraction.gemspec
48
+ homepage: https://github.com/jaynetics/refraction2
49
+ licenses:
50
+ - MIT
51
+ metadata:
52
+ homepage_uri: https://github.com/jaynetics/refraction2
53
+ source_code_uri: https://github.com/jaynetics/refraction2
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 2.5.0
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ requirements: []
69
+ rubygems_version: 3.4.0.dev
70
+ signing_key:
71
+ specification_version: 4
72
+ summary: Rack middleware replacement for joshsusser/refraction
73
+ test_files: []