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, Retry, SmashResponse, Timeout
- Defined in:
- lib/rest-core/middleware.rb
Constant Summary
collapse
- METHODS_WITH_PAYLOAD =
[:post, :put, :patch]
- UNRESERVED =
/[^a-zA-Z0-9\-\.\_\~]+/
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
105
106
107
108
109
110
111
112
113
114
|
# File 'lib/rest-core/middleware.rb', line 105
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
93
94
95
96
97
|
# File 'lib/rest-core/middleware.rb', line 93
def escape string
string.gsub(UNRESERVED) do |s|
"%#{s.unpack('H2' * s.bytesize).join('%')}".upcase
end
end
|
.has_payload?(env) ⇒ Boolean
100
101
102
|
# File 'lib/rest-core/middleware.rb', line 100
def has_payload? env
METHODS_WITH_PAYLOAD.include?(env[REQUEST_METHOD])
end
|
.included(mod) ⇒ Object
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
36
|
# File 'lib/rest-core/middleware.rb', line 9
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| " attr_writer :\#{member}\n def \#{member} env\n if env.key?('\#{member}')\n env['\#{member}']\n else\n @\#{member}\n end\n end\n RUBY\n args = [:app] + mem\n para_list = args.map{ |a| \"\#{a}=nil\"}.join(', ')\n args_list = args .join(', ')\n ivar_list = args.map{ |a| \"@\#{a}\" }.join(', ')\n src << <<-RUBY\n def initialize \#{para_list}\n \#{ivar_list} = \#{args_list}\n end\n RUBY\n accessor = Module.new\n accessor.module_eval(src.join(\"\\n\"), __FILE__, __LINE__)\n mod.const_set(:Accessor, accessor)\n mod.send(:include, accessor)\nend\n" }
|
.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.
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
# File 'lib/rest-core/middleware.rb', line 135
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
81
82
83
84
85
86
87
88
89
|
# File 'lib/rest-core/middleware.rb', line 81
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
70
71
72
73
74
75
76
77
78
|
# File 'lib/rest-core/middleware.rb', line 70
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] =~ /\?/ then '&' else '?' end
"#{env[REQUEST_PATH]}#{q}#{percent_encode(query)}"
end
end
|
.string_keys(hash) ⇒ Object
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
# File 'lib/rest-core/middleware.rb', line 117
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,
string_keys(v)
else; v
end
else
r[k.to_s] = v
end
r
}
end
|
Instance Method Details
#call(env, &k) ⇒ Object
38
|
# File 'lib/rest-core/middleware.rb', line 38
def call env, &k; app.call(env, &(k || id)); end
|
#contain_binary?(payload) ⇒ Object
105
106
107
108
109
110
111
112
113
114
|
# File 'lib/rest-core/middleware.rb', line 105
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
|
#error_callback(res, err) ⇒ Object
61
62
63
64
|
# File 'lib/rest-core/middleware.rb', line 61
def error_callback res, err
res[CLIENT].error_callback.call(err) if
res[CLIENT] && res[CLIENT].error_callback
end
|
#escape(string) ⇒ Object
93
94
95
96
97
|
# File 'lib/rest-core/middleware.rb', line 93
def escape string
string.gsub(UNRESERVED) do |s|
"%#{s.unpack('H2' * s.bytesize).join('%')}".upcase
end
end
|
#fail(env, obj) ⇒ Object
40
41
42
43
44
45
46
|
# File 'lib/rest-core/middleware.rb', line 40
def fail env, obj
if obj
env.merge(FAIL => (env[FAIL] || []) + [obj])
else
env
end
end
|
#give_promise(res) ⇒ Object
65
66
67
|
# File 'lib/rest-core/middleware.rb', line 65
def give_promise res
res[CLIENT].give_promise(res) if res[CLIENT]
end
|
#has_payload?(env) ⇒ Object
100
101
102
|
# File 'lib/rest-core/middleware.rb', line 100
def has_payload? env
METHODS_WITH_PAYLOAD.include?(env[REQUEST_METHOD])
end
|
#id ⇒ Object
39
|
# File 'lib/rest-core/middleware.rb', line 39
def id ; RC.id ; end
|
#log(env, obj) ⇒ Object
47
48
49
50
51
52
53
|
# File 'lib/rest-core/middleware.rb', line 47
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.
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
# File 'lib/rest-core/middleware.rb', line 135
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
81
82
83
84
85
86
87
88
89
|
# File 'lib/rest-core/middleware.rb', line 81
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
70
71
72
73
74
75
76
77
78
|
# File 'lib/rest-core/middleware.rb', line 70
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] =~ /\?/ then '&' else '?' end
"#{env[REQUEST_PATH]}#{q}#{percent_encode(query)}"
end
end
|
#run(a = app) ⇒ Object
54
55
56
57
58
59
60
|
# File 'lib/rest-core/middleware.rb', line 54
def run a=app
if a.respond_to?(:app) && a.app
run(a.app)
else
a
end
end
|
#string_keys(hash) ⇒ Object
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
# File 'lib/rest-core/middleware.rb', line 117
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,
string_keys(v)
else; v
end
else
r[k.to_s] = v
end
r
}
end
|