sidewalk 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/sidewalk/regexp.rb +23 -0
- data/lib/sidewalk/request.rb +88 -0
- data/lib/sidewalk/uri_mapper.rb +81 -0
- data/lib/sidewalk/uri_match.rb +13 -0
- metadata +60 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
module Sidewalk
|
2
|
+
module Oniguruma
|
3
|
+
module MatchData
|
4
|
+
def names
|
5
|
+
if @named_captures
|
6
|
+
@named_captures.keys.map(&:to_s)
|
7
|
+
else
|
8
|
+
[]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
USING_ONIGURUMA = RUBY_VERSION.start_with?('1.8.')
|
15
|
+
if USING_ONIGURUMA
|
16
|
+
require 'oniguruma'
|
17
|
+
Regexp = ::Oniguruma::ORegexp
|
18
|
+
|
19
|
+
::MatchData.send(:include, Sidewalk::Oniguruma::MatchData)
|
20
|
+
else
|
21
|
+
Regexp = ::Regexp
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'sidewalk/uri_match'
|
2
|
+
|
3
|
+
require 'rack/request'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
module Sidewalk
|
7
|
+
class Request
|
8
|
+
attr_reader :root_uri, :request_uri
|
9
|
+
def initialize env
|
10
|
+
@env = env
|
11
|
+
@rack_version = env['rack.version']
|
12
|
+
|
13
|
+
sanity_check!
|
14
|
+
@rack_request = Rack::Request.new(@env)
|
15
|
+
|
16
|
+
initialize_uris
|
17
|
+
end
|
18
|
+
|
19
|
+
def secure?
|
20
|
+
@secure
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_params
|
24
|
+
@get_params ||= @rack_request.GET
|
25
|
+
end
|
26
|
+
|
27
|
+
def uri_match
|
28
|
+
@uri_match ||= @env['sidewalk.urimatch']
|
29
|
+
end
|
30
|
+
|
31
|
+
def post_params
|
32
|
+
@post_params ||= @rack_request.POST
|
33
|
+
end
|
34
|
+
|
35
|
+
def uri_params
|
36
|
+
uri_match.parameters
|
37
|
+
end
|
38
|
+
|
39
|
+
def params
|
40
|
+
# URI parameters take precendence
|
41
|
+
@params ||= post_params.merge(get_params.merge(uri_params))
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def initialize_uris
|
47
|
+
case @env['rack.url_scheme']
|
48
|
+
when 'http'
|
49
|
+
@secure = false
|
50
|
+
uri_class = URI::HTTP
|
51
|
+
when 'https'
|
52
|
+
@secure = true
|
53
|
+
uri_class = URI::HTTPS
|
54
|
+
else
|
55
|
+
raise "Unknown URL scheme: #{@env['rack.url_scheme'].inspect}"
|
56
|
+
end
|
57
|
+
|
58
|
+
root = @env['SCRIPT_NAME']
|
59
|
+
unless root.start_with? '/'
|
60
|
+
root[0,0] = '/' # no prepend on 1.8
|
61
|
+
end
|
62
|
+
|
63
|
+
@root_uri = uri_class.build(
|
64
|
+
:host => @env['SERVER_NAME'],
|
65
|
+
:port => @env['SERVER_PORT'].to_i,
|
66
|
+
:path => root
|
67
|
+
).freeze
|
68
|
+
path_info = @env['PATH_INFO']
|
69
|
+
if root.end_with? '/' and path_info.start_with? '/'
|
70
|
+
path_info = path_info[1..-1]
|
71
|
+
end
|
72
|
+
@request_uri = @root_uri.dup
|
73
|
+
@request_uri.path += path_info
|
74
|
+
@request_uri.query = @env['QUERY_STRING']
|
75
|
+
@request_uri.freeze
|
76
|
+
end
|
77
|
+
|
78
|
+
def sanity_check!
|
79
|
+
# Sanity checks
|
80
|
+
unless @rack_version
|
81
|
+
raise ArgumentError.new "env doesn't specify a Rack version"
|
82
|
+
end
|
83
|
+
if @rack_version != [1, 1]
|
84
|
+
raise "Expected Rack version [1, 1], got #{@rack_version}"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'sidewalk/regexp'
|
2
|
+
require 'sidewalk/uri_match'
|
3
|
+
|
4
|
+
module Sidewalk
|
5
|
+
class UriMapper
|
6
|
+
attr_reader :uri_map
|
7
|
+
def initialize uri_map = {}
|
8
|
+
unless uri_map.is_a? Hash
|
9
|
+
raise ArgumentError.new('URI map must be a Hash')
|
10
|
+
end
|
11
|
+
@uri_map = Sidewalk::UriMapper.convert_map(uri_map)
|
12
|
+
end
|
13
|
+
|
14
|
+
def map path
|
15
|
+
Sidewalk::UriMapper.map(
|
16
|
+
[], #stack
|
17
|
+
self.uri_map,
|
18
|
+
path
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Replace string keys with Sidewalk::Regexp instances
|
23
|
+
def self.convert_map uri_map
|
24
|
+
out = {}
|
25
|
+
uri_map.each do |key, value|
|
26
|
+
# In particular, we don't want standard regexp objects -
|
27
|
+
# those don't support named captures on 1.8
|
28
|
+
unless key.is_a? String
|
29
|
+
raise ArgumentError.new('URI map keys must be strings')
|
30
|
+
end
|
31
|
+
|
32
|
+
unless key.include? '^'
|
33
|
+
key = '^' + key
|
34
|
+
end
|
35
|
+
|
36
|
+
key = Sidewalk::Regexp.new(key)
|
37
|
+
if value.is_a? Hash
|
38
|
+
out[key] = convert_map(value)
|
39
|
+
else
|
40
|
+
out[key] = value
|
41
|
+
end
|
42
|
+
end
|
43
|
+
out
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.map stack, uri_map, path
|
47
|
+
uri_map.each do |re, next_map|
|
48
|
+
match = re.match(path)
|
49
|
+
next unless match
|
50
|
+
|
51
|
+
stack.push re.source[1..-1] # get rid of the '^' added
|
52
|
+
|
53
|
+
case next_map
|
54
|
+
when Hash
|
55
|
+
return map(stack, next_map, match.post_match)
|
56
|
+
else
|
57
|
+
params = {}
|
58
|
+
match.names.map.each do |name|
|
59
|
+
# the symbol vs string stuff is because of differences between
|
60
|
+
# Regexp on Ruby 1.9 and Oniguruma::ORegexp on Ruby 1.8
|
61
|
+
symbol = name.to_sym
|
62
|
+
string = name.to_s
|
63
|
+
|
64
|
+
value = match[symbol]
|
65
|
+
if value
|
66
|
+
params[string] = value
|
67
|
+
params[symbol] = value
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
return UriMatch.new(
|
72
|
+
stack,
|
73
|
+
params,
|
74
|
+
next_map
|
75
|
+
)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
nil
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Sidewalk
|
2
|
+
class UriMatch
|
3
|
+
attr_reader :parts, :parameters, :controller
|
4
|
+
def initialize parts = [], parameters = {}, controller = nil
|
5
|
+
unless parts.is_a?(Array) && parameters.is_a?(Hash)
|
6
|
+
raise ArgumentError.new(
|
7
|
+
'Sidewalk::UriMatch([parts], {parameters}, controller)'
|
8
|
+
)
|
9
|
+
end
|
10
|
+
@parts, @parameters, @controller = parts, parameters, controller
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sidewalk
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Fred Emmott
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-01-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rack
|
16
|
+
requirement: &70101453840880 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.4'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70101453840880
|
25
|
+
description:
|
26
|
+
email:
|
27
|
+
- sidewalk-gem@fredemmott.co.uk
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- lib/sidewalk/regexp.rb
|
33
|
+
- lib/sidewalk/request.rb
|
34
|
+
- lib/sidewalk/uri_mapper.rb
|
35
|
+
- lib/sidewalk/uri_match.rb
|
36
|
+
homepage: https://github.com/fredemmott/sidewalk
|
37
|
+
licenses: []
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options: []
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
requirements: []
|
55
|
+
rubyforge_project:
|
56
|
+
rubygems_version: 1.8.6
|
57
|
+
signing_key:
|
58
|
+
specification_version: 3
|
59
|
+
summary: A lightweight web framework
|
60
|
+
test_files: []
|