Class: Cuba
- Inherits:
-
Object
show all
- Defined in:
- lib/cuba/safe/secure_headers.rb,
lib/cuba.rb,
lib/cuba/safe.rb,
lib/cuba/render.rb,
lib/cuba/safe/csrf.rb
Overview
Defined Under Namespace
Modules: Render, Safe
Classes: Response
Constant Summary
collapse
- SLASH =
"/".freeze
- EMPTY =
"".freeze
- SEGMENT =
"([^\\/]+)".freeze
- DEFAULT =
"text/html; charset=utf-8".freeze
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(&blk) ⇒ Cuba
Returns a new instance of Cuba.
107
108
109
110
|
# File 'lib/cuba.rb', line 107
def initialize(&blk)
@blk = blk
@captures = []
end
|
Instance Attribute Details
#captures ⇒ Object
Returns the value of attribute captures.
105
106
107
|
# File 'lib/cuba.rb', line 105
def captures
@captures
end
|
#env ⇒ Object
Returns the value of attribute env.
102
103
104
|
# File 'lib/cuba.rb', line 102
def env
@env
end
|
#req ⇒ Object
Returns the value of attribute req.
103
104
105
|
# File 'lib/cuba.rb', line 103
def req
@req
end
|
#res ⇒ Object
Returns the value of attribute res.
104
105
106
|
# File 'lib/cuba.rb', line 104
def res
@res
end
|
Class Method Details
.app ⇒ Object
63
64
65
|
# File 'lib/cuba.rb', line 63
def self.app
@app ||= Rack::Builder.new
end
|
.call(env) ⇒ Object
79
80
81
|
# File 'lib/cuba.rb', line 79
def self.call(env)
prototype.call(env)
end
|
.deepclone(obj) ⇒ Object
94
95
96
|
# File 'lib/cuba.rb', line 94
def self.deepclone(obj)
Marshal.load(Marshal.dump(obj))
end
|
.define(&block) ⇒ Object
71
72
73
|
# File 'lib/cuba.rb', line 71
def self.define(&block)
app.run new(&block)
end
|
.inherited(child) ⇒ Object
98
99
100
|
# File 'lib/cuba.rb', line 98
def self.inherited(child)
child.settings.replace(deepclone(settings))
end
|
.plugin(mixin) ⇒ Object
83
84
85
86
87
88
|
# File 'lib/cuba.rb', line 83
def self.plugin(mixin)
include mixin
extend mixin::ClassMethods if defined?(mixin::ClassMethods)
mixin.setup(self) if mixin.respond_to?(:setup)
end
|
.prototype ⇒ Object
75
76
77
|
# File 'lib/cuba.rb', line 75
def self.prototype
@prototype ||= app.to_app
end
|
.reset! ⇒ Object
58
59
60
61
|
# File 'lib/cuba.rb', line 58
def self.reset!
@app = nil
@prototype = nil
end
|
.settings ⇒ Object
90
91
92
|
# File 'lib/cuba.rb', line 90
def self.settings
@settings ||= {}
end
|
.use(middleware, *args, &block) ⇒ Object
67
68
69
|
# File 'lib/cuba.rb', line 67
def self.use(middleware, *args, &block)
app.use(middleware, *args, &block)
end
|
Instance Method Details
#accept(mimetype) ⇒ Object
If you want to match against the HTTP_ACCEPT value.
287
288
289
290
291
292
293
294
295
|
# File 'lib/cuba.rb', line 287
def accept(mimetype)
lambda do
accept = String(env["HTTP_ACCEPT"]).split(",")
if accept.any? { |s| s.strip == mimetype }
res[Rack::CONTENT_TYPE] = mimetype
end
end
end
|
#call(env) ⇒ Object
116
117
118
|
# File 'lib/cuba.rb', line 116
def call(env)
dup.call!(env)
end
|
#call!(env) ⇒ Object
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
# File 'lib/cuba.rb', line 120
def call!(env)
@env = env
@req = settings[:req].new(env)
@res = settings[:res].new(settings[:default_headers].dup)
catch(:halt) do
instance_eval(&@blk)
not_found
res.finish
end
end
|
#default ⇒ Object
Syntactic sugar for providing catch-all matches.
303
304
305
|
# File 'lib/cuba.rb', line 303
def default
true
end
|
#delete ⇒ Object
331
|
# File 'lib/cuba.rb', line 331
def delete; req.delete? end
|
#extension(ext = "\\w+") ⇒ Object
A matcher for files with a certain extension.
245
246
247
|
# File 'lib/cuba.rb', line 245
def extension(ext = "\\w+")
lambda { consume("([^\\/]+?)\.#{ext}\\z") }
end
|
#get ⇒ Object
Syntatic sugar for providing HTTP Verb matching.
327
|
# File 'lib/cuba.rb', line 327
def get; req.get? end
|
#halt(response) ⇒ Object
355
356
357
|
# File 'lib/cuba.rb', line 355
def halt(response)
throw :halt, response
end
|
#head ⇒ Object
332
|
# File 'lib/cuba.rb', line 332
def head; req.head? end
|
#host(hostname) ⇒ Object
Useful for matching against the request host (i.e. HTTP_HOST).
275
276
277
|
# File 'lib/cuba.rb', line 275
def host(hostname)
hostname === req.host
end
|
#link ⇒ Object
334
|
# File 'lib/cuba.rb', line 334
def link; req.link? end
|
#match(matcher, segment = SEGMENT) ⇒ Object
227
228
229
230
231
232
233
234
235
236
|
# File 'lib/cuba.rb', line 227
def match(matcher, segment = SEGMENT)
case matcher
when String then consume(matcher.gsub(/:\w+/, segment))
when Regexp then consume(matcher)
when Symbol then consume(segment)
when Proc then matcher.call
else
matcher
end
end
|
#not_found ⇒ Object
402
403
404
|
# File 'lib/cuba.rb', line 402
def not_found
res.status = 404
end
|
#on(*args, &block) ⇒ Object
The heart of the path / verb / any condition matching.
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
# File 'lib/cuba.rb', line 166
def on(*args, &block)
try do
@captures = []
return unless args.all? { |arg| match(arg) }
yield(*captures)
if res.status.nil?
if res.body.empty?
not_found
else
res.[Rack::CONTENT_TYPE] ||= DEFAULT
res.status = 200
end
end
halt(res.finish)
end
end
|
#options ⇒ Object
333
|
# File 'lib/cuba.rb', line 333
def options; req.options? end
|
#param(key, default = nil) ⇒ Object
Ensures that certain request parameters are present. Acts like a precondition / assertion for your route. A default value can be provided as a second argument. In that case, it always matches and the result is either the parameter or the default value.
263
264
265
266
267
|
# File 'lib/cuba.rb', line 263
def param(key, default = nil)
value = req[key] || default
lambda { captures << value unless value.to_s.empty? }
end
|
#patch ⇒ Object
330
|
# File 'lib/cuba.rb', line 330
def patch; req.patch? end
|
#post ⇒ Object
328
|
# File 'lib/cuba.rb', line 328
def post; req.post? end
|
#put ⇒ Object
329
|
# File 'lib/cuba.rb', line 329
def put; req.put? end
|
#root ⇒ Object
Access the root of the application.
315
316
317
|
# File 'lib/cuba.rb', line 315
def root
env[Rack::PATH_INFO] == SLASH || env[Rack::PATH_INFO] == EMPTY
end
|
#run(app) ⇒ Object
If you want to halt the processing of an existing handler and continue it via a different handler.
351
352
353
|
# File 'lib/cuba.rb', line 351
def run(app)
halt app.call(req.env)
end
|
#session ⇒ Object
140
141
142
143
144
|
# File 'lib/cuba.rb', line 140
def session
env["rack.session"] || raise(RuntimeError,
"You're missing a session handler. You can get started " +
"by adding Cuba.use Rack::Session::Cookie")
end
|
#settings ⇒ Object
112
113
114
|
# File 'lib/cuba.rb', line 112
def settings
self.class.settings
end
|
#trace ⇒ Object
336
|
# File 'lib/cuba.rb', line 336
def trace; req.trace? end
|
#unlink ⇒ Object
335
|
# File 'lib/cuba.rb', line 335
def unlink; req.unlink? end
|
#vars ⇒ Object
Returns a hash with the information set by the #with method.
with(role: "admin", site: "main") do
on default do
res.write(vars.inspect)
end
end
398
399
400
|
# File 'lib/cuba.rb', line 398
def vars
env["cuba.vars"] ||= {}
end
|
#with(dict = {}) ⇒ Object
Adds ability to pass information to a nested Cuba application. It receives two parameters: a hash that represents the passed information and a block. The #vars method is used to retrieve a hash with the passed information.
class Platforms < Cuba
define do
platform = vars[:platform]
on default do
res.write(platform) end
end
end
Cuba.define do
on "(heroku|salesforce)" do |platform|
with(platform: platform) do
run(Platforms)
end
end
end
382
383
384
385
386
387
|
# File 'lib/cuba.rb', line 382
def with(dict = {})
old, env["cuba.vars"] = vars, vars.merge(dict)
yield
ensure
env["cuba.vars"] = old
end
|