redirectly 0.1.1 → 0.2.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: 07d69d903b03e28e92766735ab44db1c243bbae86491a43b9ff0b24de325ebbc
4
- data.tar.gz: f3f48ba2349caf72bd63613537d638558a0a0cac0374ba29931a6dd3b8b0cb20
3
+ metadata.gz: dee36588a0b7625818f348fdaa4afefa27e0f16c1987a5656dd70397114d4989
4
+ data.tar.gz: 3e6a9704b9cfd7730d13d84002add38e2d350b6409176833d8861e7e3489f567
5
5
  SHA512:
6
- metadata.gz: eff123b2ad167f2088cb7bbf9f4b66b450e17ad9eea457d3f201f4dde8819a9d8fcc9ec1e9997df0ec1ee5838ab0eeb536501d9f54f80490ac05d1c7b650d146
7
- data.tar.gz: ce4b1c849af4cd096ae5caeca10ae92b873098f5c1890954b0eaa1930ef07fff1fc8c1e14666f3ddad940b75460d58fb3c78cb88a355ac9ea7bb2dfb06947437
6
+ metadata.gz: 205afe31c98f93b7269f95fc6ebac5729c5070107547e5ff8d160ed5de742f67e633c14ab7072bf5328b9bc4968fa73b0bbca7a9e520b747b63d49409c5b2678
7
+ data.tar.gz: 7115a8ae99fb4a59b18a198851f10266035504f9473aa06cf85dd8ef26b5fd9723990d957b2263a628405f504a90fff8125a54acfe61b192c0697eba0fdc47b0
data/README.md CHANGED
@@ -64,7 +64,7 @@ $ redirectly --init
64
64
  $ redirectly
65
65
 
66
66
  # In another terminal, access the server using one of the configured rules
67
- $ curl -v something.lvh.me:3000
67
+ $ curl -v something.localhost:3000
68
68
  ```
69
69
 
70
70
  You should receive a redirect header:
@@ -94,7 +94,7 @@ example.com = https://other-site.com/
94
94
  *.mygoogle.com/:anything = https://google.com/?q=%{anything}
95
95
  example.org/* = https://other-site.com/
96
96
  *.old-site.com = !https://permanent.redirect.com
97
- :sub.lvh.me/* = http://it-works.com/%{sub}
97
+ :sub.app.localhost/* = http://it-works.com/%{sub}
98
98
  ```
99
99
 
100
100
  For additional server options, see:
data/bin/redirectly CHANGED
@@ -8,18 +8,15 @@ router = Redirectly::CLI.router
8
8
 
9
9
  begin
10
10
  exit router.run ARGV
11
-
12
11
  rescue Interrupt
13
12
  say "\nGoodbye"
14
- exit 1
15
-
13
+ exit 1
16
14
  rescue => e
17
15
  if ENV['DEBUG']
18
- puts e.backtrace.reverse
19
- say ""
16
+ puts e.backtrace.reverse
17
+ say ''
20
18
  end
21
- say "!undred!ERROR: #{e.class}"
19
+ say "ru`ERROR: #{e.class}`"
22
20
  say e.message
23
21
  exit 1
24
-
25
- end
22
+ end
@@ -6,58 +6,85 @@ module Redirectly
6
6
  class App
7
7
  using Refinements
8
8
 
9
- attr_reader :config_path
9
+ attr_reader :config_path, :req
10
10
 
11
11
  def initialize(config_path)
12
12
  @config_path = config_path
13
13
  end
14
14
 
15
15
  def call(env)
16
- req = Rack::Request.new(env)
17
- found = match req
16
+ @req = Rack::Request.new env
17
+ found = match
18
18
 
19
19
  if found
20
- if found.start_with? '!'
21
- code, target = 301, found[1..-1]
22
- else
23
- code, target = 302, found
24
- end
25
-
26
- [code, {'Location' => target}, []]
27
-
20
+ redirect_to found
28
21
  else
29
- [404, {'Content-Type' => 'text/plain'}, ['Not Found']]
30
-
22
+ not_found
31
23
  end
32
24
  end
33
25
 
34
26
  private
35
27
 
28
+ def redirect_to(target)
29
+ code = 302
30
+
31
+ if target.start_with? '!'
32
+ code = 301
33
+ target = target[1..]
34
+ end
35
+
36
+ [code, { 'location' => target }, []]
37
+ end
38
+
39
+ def not_found
40
+ [404, { 'content-type' => 'text/plain' }, ['Not Found']]
41
+ end
42
+
36
43
  def redirects
37
44
  @redirects ||= ini_read(config_path)
38
45
  end
39
46
 
40
47
  def ini_read(path)
41
- content = File.readlines(path, chomp:true).reject { |line| line.comment? }
42
- content.map { |line| line.split(/\s*=\s*/, 2) }.to_h
48
+ content = File.readlines(path, chomp: true).reject(&:comment?)
49
+ content.to_h { |line| line.split(/\s*=\s*/, 2) }
43
50
  end
44
51
 
45
- def match(req)
52
+ def match
46
53
  redirects.each do |pattern, target|
47
- pattern = "#{pattern}/" unless pattern.include? "/"
48
- requested = "#{req.host}#{req.path}"
49
- matcher = Mustermann.new(pattern)
50
- params = matcher.params(requested)
51
- if params
52
- params.transform_keys! &:to_sym
53
- params.delete :splat
54
- params.transform_values! { |v| CGI.escape v }
55
- return target % params
56
- end
54
+ found = find_target pattern, target
55
+ return found if found
57
56
  end
58
57
 
59
58
  nil
60
59
  end
61
60
 
61
+ def find_target(pattern, target)
62
+ params = get_params pattern
63
+ params ? composite_target(target, params) : nil
64
+ end
65
+
66
+ def get_params(pattern)
67
+ pattern = "#{pattern}/" unless pattern.include? '/'
68
+ requested = "#{req.host}#{req.path}"
69
+ matcher = Mustermann.new pattern
70
+ params = matcher.params requested
71
+
72
+ if params
73
+ params.transform_keys!(&:to_sym)
74
+ params.delete :splat
75
+ params.transform_values! { |v| CGI.escape v }
76
+ end
77
+
78
+ params
79
+ end
80
+
81
+ def composite_target(target, params)
82
+ result = target % params
83
+ unless req.query_string.empty?
84
+ glue = result.include?('?') ? '&' : '?'
85
+ result = "#{result}#{glue}#{req.query_string}"
86
+ end
87
+ result
88
+ end
62
89
  end
63
90
  end
@@ -5,7 +5,7 @@ module Redirectly
5
5
  class CLI
6
6
  def self.router
7
7
  router = MisterBin::Runner.new version: VERSION,
8
- header: "Redirectly Redirect Server"
8
+ header: 'Redirectly Redirect Server'
9
9
 
10
10
  router.route_all to: Command
11
11
  router
@@ -1,41 +1,40 @@
1
- require "colsole"
2
- require "mister_bin"
1
+ require 'colsole'
2
+ require 'mister_bin'
3
+ require 'rackup'
3
4
 
4
5
  module Redirectly
5
6
  class Command < MisterBin::Command
6
7
  include Colsole
7
- help "Start the redirect server"
8
+ help 'Start the redirect server'
8
9
  version Redirectly::VERSION
9
10
 
10
- usage "redirectly [CONFIG --port PORT]"
11
- usage "redirectly --init"
12
- usage "redirectly --help | --version"
11
+ usage 'redirectly [CONFIG --port PORT]'
12
+ usage 'redirectly --init'
13
+ usage 'redirectly --help | --version'
13
14
 
14
- option "-p --port PORT", "Listening port [default: 3000]"
15
- option "-i --init", "Create a sample config file and exit"
15
+ option '-p --port PORT', 'Listening port [default: 3000]'
16
+ option '-i --init', 'Create a sample config file and exit'
16
17
 
17
- param "CONFIG", "Path to config file [default: redirects.ini]"
18
+ param 'CONFIG', 'Path to config file [default: redirects.ini]'
18
19
 
19
- example "redirectly --init"
20
- example "redirectly config.ini"
20
+ example 'redirectly --init'
21
+ example 'redirectly config.ini'
21
22
 
22
23
  attr_reader :config_path, :port
23
24
 
24
25
  def run
25
26
  @port = args['--port'].to_i
26
- @config_path = args['CONFIG'] || "redirects.ini"
27
+ @config_path = args['CONFIG'] || 'redirects.ini'
27
28
  args['--init'] ? init_file : start_server
28
29
  end
29
30
 
30
31
  private
31
32
 
32
33
  def init_file
33
- if File.exist? config_path
34
- raise ArgumentError, "#{config_path} already exists"
35
- else
36
- File.write config_path, template
37
- say "Initialized #{config_path}"
38
- end
34
+ raise ArgumentError, "#{config_path} already exists" if File.exist? config_path
35
+
36
+ File.write config_path, template
37
+ say "Initialized #{config_path}"
39
38
  end
40
39
 
41
40
  def template
@@ -44,13 +43,14 @@ module Redirectly
44
43
  *.mygoogle.com/:anything = https://google.com/?q=%{anything}
45
44
  example.org/* = https://other-site.com/
46
45
  *.old-site.com = !https://permanent.redirect.com
47
- :sub.lvh.me/* = http://it-works.com/%{sub}
46
+ :sub.app.localhost/* = http://it-works.com/%{sub}
48
47
  TEMPLATE
49
48
  end
50
49
 
51
50
  def start_server
52
51
  raise ArgumentError, "Cannot find config file #{config_path}" unless File.exist? config_path
53
- Rack::Server.start(app: app, Port: port, environment: 'production')
52
+
53
+ Rackup::Server.start(app: app, Port: port, environment: 'production')
54
54
  end
55
55
 
56
56
  def app
@@ -1,3 +1,3 @@
1
1
  module Redirectly
2
- VERSION = "0.1.1"
2
+ VERSION = '0.2.0'
3
3
  end
data/lib/redirectly.rb CHANGED
@@ -1,5 +1,5 @@
1
- require "byebug" if ENV["BYEBUG"]
1
+ require 'byebug' if ENV['BYEBUG']
2
2
 
3
- require "redirectly/refinements"
4
- require "redirectly/version"
5
- require "redirectly/app"
3
+ require 'redirectly/refinements'
4
+ require 'redirectly/version'
5
+ require 'redirectly/app'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redirectly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danny Ben Shitrit
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-05 00:00:00.000000000 Z
11
+ date: 2024-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mister_bin
@@ -25,47 +25,73 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.7'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rack
28
+ name: mustermann
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '1.1'
34
+ - - "<"
32
35
  - !ruby/object:Gem::Version
33
- version: '2.2'
36
+ version: '4'
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
- - - "~>"
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '1.1'
44
+ - - "<"
39
45
  - !ruby/object:Gem::Version
40
- version: '2.2'
46
+ version: '4'
41
47
  - !ruby/object:Gem::Dependency
42
- name: mustermann
48
+ name: puma
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '5.3'
54
+ - - "<"
55
+ - !ruby/object:Gem::Version
56
+ version: '7'
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '5.3'
64
+ - - "<"
65
+ - !ruby/object:Gem::Version
66
+ version: '7'
67
+ - !ruby/object:Gem::Dependency
68
+ name: rack
43
69
  requirement: !ruby/object:Gem::Requirement
44
70
  requirements:
45
71
  - - "~>"
46
72
  - !ruby/object:Gem::Version
47
- version: '1.1'
73
+ version: '3.0'
48
74
  type: :runtime
49
75
  prerelease: false
50
76
  version_requirements: !ruby/object:Gem::Requirement
51
77
  requirements:
52
78
  - - "~>"
53
79
  - !ruby/object:Gem::Version
54
- version: '1.1'
80
+ version: '3.0'
55
81
  - !ruby/object:Gem::Dependency
56
- name: puma
82
+ name: rackup
57
83
  requirement: !ruby/object:Gem::Requirement
58
84
  requirements:
59
85
  - - "~>"
60
86
  - !ruby/object:Gem::Version
61
- version: '5.3'
87
+ version: '2.1'
62
88
  type: :runtime
63
89
  prerelease: false
64
90
  version_requirements: !ruby/object:Gem::Requirement
65
91
  requirements:
66
92
  - - "~>"
67
93
  - !ruby/object:Gem::Version
68
- version: '5.3'
94
+ version: '2.1'
69
95
  description: Redirect server with dynamic URL and hostname support
70
96
  email: db@dannyben.com
71
97
  executables:
@@ -87,7 +113,8 @@ licenses:
87
113
  metadata:
88
114
  bug_tracker_uri: https://github.com/DannyBen/redirectly/issues
89
115
  source_code_uri: https://github.com/dannyben/redirectly
90
- post_install_message:
116
+ rubygems_mfa_required: 'true'
117
+ post_install_message:
91
118
  rdoc_options: []
92
119
  require_paths:
93
120
  - lib
@@ -95,15 +122,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
95
122
  requirements:
96
123
  - - ">="
97
124
  - !ruby/object:Gem::Version
98
- version: 2.5.0
125
+ version: '3.0'
99
126
  required_rubygems_version: !ruby/object:Gem::Requirement
100
127
  requirements:
101
128
  - - ">="
102
129
  - !ruby/object:Gem::Version
103
130
  version: '0'
104
131
  requirements: []
105
- rubygems_version: 3.2.16
106
- signing_key:
132
+ rubygems_version: 3.5.6
133
+ signing_key:
107
134
  specification_version: 4
108
135
  summary: Redirectly redirect server
109
136
  test_files: []