Module: RestCore::Middleware
- Includes:
- RestCore
- Included in:
- AuthBasic, Cache, ClashResponse, CommonLogger, DefaultHeaders, DefaultPayload, DefaultQuery, DefaultSite, Defaults, Dry, Engine, ErrorDetector, ErrorHandler, FollowRedirect, JsonRequest, JsonResponse, Oauth1Header, Oauth2Header, Oauth2Query, QueryResponse, SmashResponse, Timeout
- Defined in:
- lib/rest-core/middleware.rb
Constant Summary
collapse
- UNRESERVED =
/[^a-zA-Z0-9\-\.\_\~]+/u
Constants included
from RestCore
ASYNC, CLIENT, DRY, FAIL, HIJACK, LOG, PROMISE, REQUEST_HEADERS, REQUEST_METHOD, REQUEST_PATH, REQUEST_PAYLOAD, REQUEST_QUERY, REQUEST_URI, RESPONSE_BODY, RESPONSE_HEADERS, RESPONSE_KEY, RESPONSE_SOCKET, RESPONSE_STATUS, Simple, TIMER, Universal, VERSION
Class Method Summary
collapse
Instance Method Summary
collapse
Methods included from RestCore
eagerload, id
Class Method Details
.contain_binary?(payload) ⇒ Boolean
92
93
94
95
96
97
98
99
100
101
|
# File 'lib/rest-core/middleware.rb', line 92
def contain_binary? payload
return false unless payload
return true if payload.respond_to?(:read)
return true if payload.find{ |k, v|
(v || k).respond_to?(:read) ||
(v.kind_of?(Array) && v.any?{ |vv| vv.respond_to?(:read) }) }
return false
end
|
.escape(string) ⇒ Object
85
86
87
88
89
|
# File 'lib/rest-core/middleware.rb', line 85
def escape string
string.gsub(UNRESERVED) do |s|
"%#{s.unpack('H2' * s.bytesize).join('%')}".upcase
end
end
|
.included(mod) ⇒ Object
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
# File 'lib/rest-core/middleware.rb', line 8
def self.included mod
mod.send(:include, RestCore)
mod.send(:attr_reader, :app)
mem = if mod.respond_to?(:members) then mod.members else [] end
src = mem.map{ |member| <<-RUBY }
attr_writer :#{member}
def #{member} env
if env.key?('#{member}')
env['#{member}']
else
@#{member}
end
end
RUBY
args = [:app] + mem
para_list = args.map{ |a| "#{a}=nil"}.join(', ')
args_list = args .join(', ')
ivar_list = args.map{ |a| "@#{a}" }.join(', ')
src << <<-RUBY
def initialize #{para_list}
#{ivar_list} = #{args_list}
end
RUBY
accessor = Module.new
accessor.module_eval(src.join("\n"), __FILE__, __LINE__)
mod.const_set(:Accessor, accessor)
mod.send(:include, accessor)
end
|
.merge_hash(*hashes) ⇒ Object
this method is intended to merge payloads if they are non-empty hashes, but prefer the right most one if they are not hashes.
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
# File 'lib/rest-core/middleware.rb', line 122
def merge_hash *hashes
hashes.reverse_each.inject do |r, i|
if r.kind_of?(Hash)
if i.kind_of?(Hash)
Middleware.string_keys(i).merge(Middleware.string_keys(r))
elsif r.empty?
i else
r end
else
r
end
end
end
|
.percent_encode(query) ⇒ Object
73
74
75
76
77
78
79
80
81
|
# File 'lib/rest-core/middleware.rb', line 73
def percent_encode query
query.sort.map{ |(k, v)|
if v.kind_of?(Array)
v.map{ |vv| "#{escape(k.to_s)}=#{escape(vv.to_s)}" }.join('&')
else
"#{escape(k.to_s)}=#{escape(v.to_s)}"
end
}.join('&')
end
|
.request_uri(env) ⇒ Object
62
63
64
65
66
67
68
69
70
|
# File 'lib/rest-core/middleware.rb', line 62
def request_uri env
if (query = (env[REQUEST_QUERY] || {}).select{ |k, v| v }).empty?
env[REQUEST_PATH].to_s
else
q = if env[REQUEST_PATH] =~ /\?/u then '&' else '?' end
"#{env[REQUEST_PATH]}#{q}#{percent_encode(query)}"
end
end
|
.string_keys(hash) ⇒ Object
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
# File 'lib/rest-core/middleware.rb', line 104
def string_keys hash
hash.inject({}){ |r, (k, v)|
if v.kind_of?(Hash)
r[k.to_s] = case k.to_s
when REQUEST_QUERY, REQUEST_PAYLOAD, REQUEST_HEADERS
string_keys(v)
else; v
end
else
r[k.to_s] = v
end
r
}
end
|
Instance Method Details
#call(env, &k) ⇒ Object
37
|
# File 'lib/rest-core/middleware.rb', line 37
def call env, &k; app.call(env, &(k || id)); end
|
#contain_binary?(payload) ⇒ Object
92
93
94
95
96
97
98
99
100
101
|
# File 'lib/rest-core/middleware.rb', line 92
def contain_binary? payload
return false unless payload
return true if payload.respond_to?(:read)
return true if payload.find{ |k, v|
(v || k).respond_to?(:read) ||
(v.kind_of?(Array) && v.any?{ |vv| vv.respond_to?(:read) }) }
return false
end
|
#escape(string) ⇒ Object
85
86
87
88
89
|
# File 'lib/rest-core/middleware.rb', line 85
def escape string
string.gsub(UNRESERVED) do |s|
"%#{s.unpack('H2' * s.bytesize).join('%')}".upcase
end
end
|
#fail(env, obj) ⇒ Object
39
40
41
42
43
44
45
|
# File 'lib/rest-core/middleware.rb', line 39
def fail env, obj
if obj
env.merge(FAIL => (env[FAIL] || []) + [obj])
else
env
end
end
|
#id ⇒ Object
38
|
# File 'lib/rest-core/middleware.rb', line 38
def id ; RC.id ; end
|
#log(env, obj) ⇒ Object
46
47
48
49
50
51
52
|
# File 'lib/rest-core/middleware.rb', line 46
def log env, obj
if obj
env.merge(LOG => (env[LOG] || []) + [obj])
else
env
end
end
|
#merge_hash(*hashes) ⇒ Object
this method is intended to merge payloads if they are non-empty hashes, but prefer the right most one if they are not hashes.
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
# File 'lib/rest-core/middleware.rb', line 122
def merge_hash *hashes
hashes.reverse_each.inject do |r, i|
if r.kind_of?(Hash)
if i.kind_of?(Hash)
Middleware.string_keys(i).merge(Middleware.string_keys(r))
elsif r.empty?
i else
r end
else
r
end
end
end
|
#percent_encode(query) ⇒ Object
73
74
75
76
77
78
79
80
81
|
# File 'lib/rest-core/middleware.rb', line 73
def percent_encode query
query.sort.map{ |(k, v)|
if v.kind_of?(Array)
v.map{ |vv| "#{escape(k.to_s)}=#{escape(vv.to_s)}" }.join('&')
else
"#{escape(k.to_s)}=#{escape(v.to_s)}"
end
}.join('&')
end
|
#request_uri(env) ⇒ Object
62
63
64
65
66
67
68
69
70
|
# File 'lib/rest-core/middleware.rb', line 62
def request_uri env
if (query = (env[REQUEST_QUERY] || {}).select{ |k, v| v }).empty?
env[REQUEST_PATH].to_s
else
q = if env[REQUEST_PATH] =~ /\?/u then '&' else '?' end
"#{env[REQUEST_PATH]}#{q}#{percent_encode(query)}"
end
end
|
#run(app = app) ⇒ Object
53
54
55
56
57
58
59
|
# File 'lib/rest-core/middleware.rb', line 53
def run app=app
if app.respond_to?(:app) && app.app
run(app.app)
else
app
end
end
|
#string_keys(hash) ⇒ Object
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
# File 'lib/rest-core/middleware.rb', line 104
def string_keys hash
hash.inject({}){ |r, (k, v)|
if v.kind_of?(Hash)
r[k.to_s] = case k.to_s
when REQUEST_QUERY, REQUEST_PAYLOAD, REQUEST_HEADERS
string_keys(v)
else; v
end
else
r[k.to_s] = v
end
r
}
end
|