sinatra 1.3.0.e → 1.3.0.f
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- data/.travis.yml +16 -0
- data/CHANGES +77 -18
- data/Gemfile +43 -26
- data/README.de.rdoc +264 -88
- data/README.es.rdoc +241 -80
- data/README.fr.rdoc +206 -81
- data/README.hu.rdoc +2 -2
- data/README.jp.rdoc +2 -2
- data/README.pt-br.rdoc +2 -2
- data/README.pt-pt.rdoc +2 -2
- data/README.rdoc +169 -23
- data/README.ru.rdoc +373 -433
- data/README.zh.rdoc +5 -5
- data/Rakefile +8 -2
- data/lib/sinatra/base.rb +191 -46
- data/lib/sinatra/main.rb +1 -1
- data/lib/sinatra/showexceptions.rb +2 -2
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +7 -5
- data/test/contest.rb +62 -28
- data/test/filter_test.rb +2 -2
- data/test/helpers_test.rb +185 -12
- data/test/mapped_error_test.rb +25 -6
- data/test/nokogiri_test.rb +5 -6
- data/test/response_test.rb +10 -1
- data/test/result_test.rb +2 -2
- data/test/routing_test.rb +13 -0
- data/test/server_test.rb +3 -2
- data/test/settings_test.rb +98 -11
- data/test/slim_test.rb +15 -25
- data/test/static_test.rb +3 -3
- data/test/streaming_test.rb +100 -0
- metadata +82 -35
data/.travis.yml
ADDED
data/CHANGES
CHANGED
@@ -1,7 +1,19 @@
|
|
1
1
|
= 1.3.0 / Not Yet Released
|
2
2
|
|
3
|
+
* Added `stream` helper method for easily creating streaming APIs, Server
|
4
|
+
Sent Events or even WebSockets. See README for more on that topic.
|
5
|
+
(Konstantin Haase)
|
6
|
+
|
7
|
+
* If a HTTP 1.1 client is redirected from a different verb than GET, use 303
|
8
|
+
instead of 302 by default. You may still pass 302 explicitly. Fixes AJAX
|
9
|
+
redirects in Internet Explorer 9 (to be fair, everyone else is doing it
|
10
|
+
wrong and IE is behaving correct). (Konstantin Haase)
|
11
|
+
|
3
12
|
* Added support for HTTP PATCH requests. (Konstantin Haase)
|
4
13
|
|
14
|
+
* Use rack-protection to defend against common opportunistic attacks.
|
15
|
+
(Konstantin Haase)
|
16
|
+
|
5
17
|
* Support for Creole templates, Creole is a standardized wiki markup,
|
6
18
|
supported by many wiki implementations. (Konstanin Haase)
|
7
19
|
|
@@ -14,9 +26,9 @@
|
|
14
26
|
version. This makes Sinatra confirm with RFC 2396 section 2.2 and RFC 2616
|
15
27
|
section 3.2.3 (escaped reserved characters should not be treated like the
|
16
28
|
unescaped version), meaning that "/:name" will also match `/foo%2Fbar`, but
|
17
|
-
not `/foo/bar`. To avoid incompatibility, pattern matching has been
|
18
|
-
Moreover, since we do no longer need to keep an unescaped version
|
19
|
-
path_info around, we handle all changes to `env['PATH_INFO']` correctly.
|
29
|
+
not `/foo/bar`. To avoid incompatibility, pattern matching has been
|
30
|
+
adjusted. Moreover, since we do no longer need to keep an unescaped version
|
31
|
+
of path_info around, we handle all changes to `env['PATH_INFO']` correctly.
|
20
32
|
(Konstantin Haase)
|
21
33
|
|
22
34
|
* `settings.app_file` now defaults to the file subclassing `Sinatra::Base` in
|
@@ -26,36 +38,61 @@
|
|
26
38
|
was enabled or not. Also, expose that logger with the `logger` helper
|
27
39
|
method. (Konstantin Haase)
|
28
40
|
|
29
|
-
* The sessions setting
|
41
|
+
* The sessions setting may be an options hash now. (Konstantin Haase)
|
30
42
|
|
31
|
-
* Important: 1.8.6 support has been dropped. This version also depends
|
32
|
-
least Rack 1.3.0. This means that it is incompatible to Rails prior
|
33
|
-
Please use 1.2.x if you require an earlier version
|
34
|
-
will continue to supply with bug fixes. (Konstantin Haase)
|
43
|
+
* Important: Ruby 1.8.6 support has been dropped. This version also depends
|
44
|
+
on at least Rack 1.3.0. This means that it is incompatible to Rails prior
|
45
|
+
to 3.1.0. Please use 1.2.x if you require an earlier version of Ruby or
|
46
|
+
Rack, which we will continue to supply with bug fixes. (Konstantin Haase)
|
35
47
|
|
36
|
-
*
|
37
|
-
|
38
|
-
|
48
|
+
* Renamed `:public` to `:public_folder` to avoid overriding Ruby's built-in
|
49
|
+
`public` method/keyword. `set(:public, ...)` is still possible but shows a
|
50
|
+
warning. (Konstantin Haase)
|
39
51
|
|
40
|
-
*
|
41
|
-
|
52
|
+
* It is now possible to use a different target class for the top level DSL
|
53
|
+
(aka classic style) than `Sinatra::Application` by setting
|
54
|
+
`Delegator.target`. This was mainly introduced to ease testing. (Konstantin
|
55
|
+
Haase)
|
56
|
+
|
57
|
+
* Error handlers defined for an error class will now also handle subclasses
|
58
|
+
of that class, unless more specific error handlers exist. (Konstantin
|
59
|
+
Haase)
|
42
60
|
|
43
61
|
* Error handling respects Exception#code, again. (Konstantin Haase)
|
44
62
|
|
45
63
|
* Changing a setting will merge hashes: `set(:x, :a => 1); set(:x :b => 2)`
|
46
|
-
will result in `{:a => 1, :b => 2}`. Use `set(:x, {:a => 1}, true)` to
|
47
|
-
this behavior. (Konstantin Haase)
|
64
|
+
will result in `{:a => 1, :b => 2}`. Use `set(:x, {:a => 1}, true)` to
|
65
|
+
avoid this behavior. (Konstantin Haase)
|
48
66
|
|
49
67
|
* Added `request.accept?` and `request.preferred_type` to ease dealing with
|
50
68
|
`Accept` headers. (Konstantin Haase)
|
51
69
|
|
70
|
+
* Added `:static_cache_control` setting to automatically set cache control
|
71
|
+
headers to static files. (Kenichi Nakamura)
|
72
|
+
|
73
|
+
* Added `informal?`, `success?`, `redirect?`, `client_error?`,
|
74
|
+
`server_error?` and `not_found?` helper methods to ease dealing with status
|
75
|
+
codes. (Konstantin Haase)
|
76
|
+
|
52
77
|
* Uses SecureRandom to generate default session secret. (Konstantin Haase)
|
53
78
|
|
54
|
-
* `
|
79
|
+
* The `attachment` helper will set Content-Type (if it hasn't been set yet)
|
80
|
+
depending on the supplied file name. (Vasiliy Ermolovich)
|
81
|
+
|
82
|
+
* Conditional requests on `etag` helper now work properly for unsafe HTTP
|
83
|
+
methods. (Matthew Schinckel, Konstantin Haase)
|
84
|
+
|
85
|
+
* `Sinatra::Base.run!` now prints to stderr rather than stdout. (Andrew
|
86
|
+
Armenia)
|
87
|
+
|
88
|
+
* `Sinatra::Base.run!` takes a block allowing access to the Rack handler.
|
89
|
+
(David Waite)
|
55
90
|
|
56
91
|
* Automatic `app_file` detection now works in directories containing brackets
|
57
92
|
(Konstantin Haase)
|
58
93
|
|
94
|
+
* Exception objects are now passed to error handlers. (Konstantin Haase)
|
95
|
+
|
59
96
|
* Improved documentation. (Emanuele Vicentini, Peter Higgins, Takanori
|
60
97
|
Ishikawa, Konstantin Haase)
|
61
98
|
|
@@ -65,11 +102,24 @@
|
|
65
102
|
allows you to run Sinatra with custom Rack handlers, like Kirk or Mongrel2.
|
66
103
|
Example: `ruby app.rb -s Mongrel2` (Konstantin Haase)
|
67
104
|
|
68
|
-
*
|
69
|
-
|
105
|
+
* Ignore `to_ary` on response bodies. Fixes compatibility to Rails 3.1.
|
106
|
+
(Konstantin Haase)
|
107
|
+
|
108
|
+
* Middleware setup is now distributed across multiple methods, allowing
|
109
|
+
Sinatra extensions to easily hook into the setup process. (Konstantin
|
110
|
+
Haase)
|
70
111
|
|
71
112
|
* Internal refactoring and minor performance improvements. (Konstantin Haase)
|
72
113
|
|
114
|
+
* Move Sinatra::VERSION to separate file, so it can be checked without
|
115
|
+
loading Sinatra. (Konstantin Haase)
|
116
|
+
|
117
|
+
* Command line options now complain if value passed to `-p` is not a valid
|
118
|
+
integer. (Konstantin Haase)
|
119
|
+
|
120
|
+
* Fix handling of broken query params when displaying exceptions. (Luke
|
121
|
+
Jahnke)
|
122
|
+
|
73
123
|
= 1.2.7 (backports release) / Not Yet Released
|
74
124
|
|
75
125
|
Custom changes:
|
@@ -78,6 +128,9 @@ Custom changes:
|
|
78
128
|
|
79
129
|
Backported from 1.3.0:
|
80
130
|
|
131
|
+
* Ignore `to_ary` on response bodies. Fixes compatibility to Rails 3.1.
|
132
|
+
(Konstantin Haase)
|
133
|
+
|
81
134
|
* `Sinatra.run!` now prints to stderr rather than stdout. (Andrew Armenia)
|
82
135
|
|
83
136
|
* Automatic `app_file` detection now works in directories containing brackets
|
@@ -94,6 +147,12 @@ Backported from 1.3.0:
|
|
94
147
|
|
95
148
|
* Fix uninitialized instance variable warning. (David Kellum)
|
96
149
|
|
150
|
+
* Command line options now complain if value passed to `-p` is not a valid
|
151
|
+
integer. (Konstantin Haase)
|
152
|
+
|
153
|
+
* Fix handling of broken query params when displaying exceptions. (Luke
|
154
|
+
Jahnke)
|
155
|
+
|
97
156
|
= 1.2.6 / 2011-05-01
|
98
157
|
|
99
158
|
* Fix broken delegation, backport delegation tests from Sinatra 1.3.
|
data/Gemfile
CHANGED
@@ -8,9 +8,11 @@
|
|
8
8
|
|
9
9
|
RUBY_ENGINE = 'ruby' unless defined? RUBY_ENGINE
|
10
10
|
source :rubygems unless ENV['QUICK']
|
11
|
+
gemspec
|
11
12
|
|
12
13
|
gem 'rake'
|
13
14
|
gem 'rack-test', '>= 0.5.6'
|
15
|
+
gem 'ci_reporter', :group => :ci
|
14
16
|
|
15
17
|
# Allows stuff like `tilt=1.2.2 bundle install` or `tilt=master ...`.
|
16
18
|
# Used by the CI.
|
@@ -23,42 +25,57 @@ repos = { 'tilt' => github % "rtomayko/tilt", 'rack' => github % "rack/rack" }
|
|
23
25
|
gem lib, dep
|
24
26
|
end
|
25
27
|
|
26
|
-
gem 'haml', '>= 3.0'
|
27
|
-
gem 'sass'
|
28
|
-
gem 'builder'
|
29
|
-
gem 'erubis'
|
30
|
-
gem 'less', '~> 1.0'
|
31
|
-
gem 'liquid', :group => 'liquid'
|
32
|
-
gem 'slim', :group => 'slim'
|
33
|
-
gem 'RedCloth', :group => 'redcloth' if RUBY_VERSION < "1.9.3" and not RUBY_ENGINE.start_with? 'ma'
|
34
|
-
gem 'coffee-script', '>= 2.0', :group => 'coffee-script'
|
35
|
-
gem 'rdoc', :group => 'rdoc'
|
36
|
-
gem 'kramdown', :group => 'kramdown'
|
37
|
-
gem 'maruku', :group => 'maruku'
|
38
|
-
gem 'creole', :group => 'creole'
|
28
|
+
gem 'haml', '>= 3.0'
|
29
|
+
gem 'sass'
|
30
|
+
gem 'builder'
|
31
|
+
gem 'erubis'
|
32
|
+
gem 'less', '~> 1.0'
|
39
33
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
34
|
+
if RUBY_ENGINE == "maglev"
|
35
|
+
gem 'liquid', :git => "https://github.com/Shopify/liquid.git"
|
36
|
+
else
|
37
|
+
gem 'liquid'
|
38
|
+
end
|
39
|
+
|
40
|
+
gem 'slim', '~> 1.0'
|
41
|
+
gem 'temple', '!= 0.3.3'
|
42
|
+
gem 'RedCloth' if RUBY_VERSION < "1.9.3" and not RUBY_ENGINE.start_with? 'ma'
|
43
|
+
gem 'coffee-script', '>= 2.0'
|
44
|
+
gem 'rdoc'
|
45
|
+
gem 'kramdown'
|
46
|
+
gem 'maruku'
|
47
|
+
gem 'creole'
|
48
|
+
|
49
|
+
if RUBY_ENGINE == 'jruby'
|
50
|
+
gem 'nokogiri', '!= 1.5.0'
|
51
|
+
gem 'jruby-openssl'
|
52
|
+
elsif RUBY_ENGINE != 'maglev'
|
53
|
+
gem 'nokogiri'
|
54
|
+
end
|
44
55
|
|
45
|
-
unless RUBY_ENGINE == 'jruby' && JRUBY_VERSION < "1.6.1"
|
56
|
+
unless RUBY_ENGINE == 'jruby' && JRUBY_VERSION < "1.6.1" && !ENV['TRAVIS']
|
46
57
|
# C extensions
|
47
|
-
gem 'rdiscount'
|
48
|
-
gem 'redcarpet'
|
58
|
+
gem 'rdiscount'
|
59
|
+
gem 'redcarpet'
|
49
60
|
|
50
61
|
## bluecloth is broken
|
51
|
-
#gem 'bluecloth'
|
62
|
+
#gem 'bluecloth'
|
52
63
|
end
|
53
64
|
|
54
|
-
|
55
|
-
gem 'json', :
|
56
|
-
gem 'markaby'
|
57
|
-
gem 'radius'
|
65
|
+
if RUBY_ENGINE == 'maglev'
|
66
|
+
gem 'json', :git => "https://github.com/MagLev/json.git"
|
67
|
+
gem 'markaby'
|
68
|
+
gem 'radius'
|
69
|
+
else
|
70
|
+
platforms :ruby_18, :jruby do
|
71
|
+
gem 'json'
|
72
|
+
gem 'markaby'
|
73
|
+
gem 'radius'
|
74
|
+
end
|
58
75
|
end
|
59
76
|
|
60
77
|
platforms :mri_18 do
|
61
78
|
# bundler platforms are broken
|
62
79
|
next if RUBY_ENGINE != 'ruby' or RUBY_VERSION > "1.8"
|
63
|
-
gem 'rcov'
|
80
|
+
gem 'rcov'
|
64
81
|
end
|
data/README.de.rdoc
CHANGED
@@ -96,6 +96,17 @@ Und auch hier können Block-Parameter genutzt werden:
|
|
96
96
|
"Hallo, #{c}!"
|
97
97
|
end
|
98
98
|
|
99
|
+
Routen-Muster können auch mit optionalen Parametern ausgestattet werden:
|
100
|
+
|
101
|
+
get '/posts.?:format?' do
|
102
|
+
# passt auf "GET /posts" sowie jegliche Erweiterung
|
103
|
+
# wie "GET /posts.json", "GET /posts.xml" etc.
|
104
|
+
end
|
105
|
+
|
106
|
+
Anmerkung: Solange man den sog. Path Traversal Attack-Schutz nicht deaktiviert
|
107
|
+
(siehe weiter unten), kann es sein, dass der Request-Pfad noch vor dem Abgleich
|
108
|
+
mit den Routen modifiziert wird.
|
109
|
+
|
99
110
|
=== Bedingungen
|
100
111
|
|
101
112
|
An Routen können eine Vielzahl von Bedingungen angehängt werden, die erfüllt
|
@@ -136,6 +147,25 @@ Es können auch andere Bedingungen relativ einfach hinzugefügt werden:
|
|
136
147
|
"Tut mir leid, verloren."
|
137
148
|
end
|
138
149
|
|
150
|
+
Bei Bedingungen, die mehrere Werte annehmen können, sollte ein Splat verwendet
|
151
|
+
werden:
|
152
|
+
|
153
|
+
set(:auth) do |*roles| # <- hier kommt der Splat ins Spiel
|
154
|
+
condition do
|
155
|
+
unless logged_in? && roles.any? {|role| current_user.in_role? role }
|
156
|
+
redirect "/login/", 303
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
get "/mein/account/", :auth => [:user, :admin] do
|
162
|
+
"Mein Account"
|
163
|
+
end
|
164
|
+
|
165
|
+
get "/nur/admin/", :auth => :admin do
|
166
|
+
"Nur Admins dürfen hier rein!"
|
167
|
+
end
|
168
|
+
|
139
169
|
=== Rückgabewerte
|
140
170
|
|
141
171
|
Durch den Rückgabewert eines Routen-Blocks wird mindestens der Response-Body
|
@@ -165,6 +195,9 @@ Damit lässt sich relativ einfach Streaming implementieren:
|
|
165
195
|
|
166
196
|
get('/') { Stream.new }
|
167
197
|
|
198
|
+
Ebenso kann die +stream+-Helfer-Methode (s.u.) verwendet werden, die Streaming
|
199
|
+
direkt in die Route integriert.
|
200
|
+
|
168
201
|
=== Eigene Routen-Muster
|
169
202
|
|
170
203
|
Wie oben schon beschrieben, ist Sinatra von Haus aus mit Unterstützung für
|
@@ -210,15 +243,18 @@ Oder unter Verwendung eines negativen look ahead:
|
|
210
243
|
== Statische Dateien
|
211
244
|
|
212
245
|
Statische Dateien werden aus dem <tt>./public</tt>-Ordner ausgeliefert. Es ist
|
213
|
-
möglich, einen anderen Ort zu definieren, indem man die
|
214
|
-
setzt:
|
246
|
+
möglich, einen anderen Ort zu definieren, indem man die
|
247
|
+
<tt>:public_folder</tt>-Option setzt:
|
215
248
|
|
216
|
-
set :
|
249
|
+
set :public_folder, File.dirname(__FILE__) + '/static'
|
217
250
|
|
218
251
|
Zu beachten ist, dass der Ordnername public nicht Teil der URL ist. Die Datei
|
219
252
|
<tt>./public/css/style.css</tt> ist unter
|
220
253
|
<tt>http://example.com/css/style.css</tt> zu finden.
|
221
254
|
|
255
|
+
Um den <tt>Cache-Control</tt>-Header mit Informationen zu versorgen, verwendet
|
256
|
+
man die <tt>:static_cache_control</tt>-Einstellung (s.u.).
|
257
|
+
|
222
258
|
== Views/Templates
|
223
259
|
|
224
260
|
Standardmäßig wird davon ausgegangen, dass sich Templates im
|
@@ -423,9 +459,9 @@ Templates zu verwenden und einen anderen für das Layout, indem die
|
|
423
459
|
=== CoffeeScript Templates
|
424
460
|
|
425
461
|
Abhängigkeit:: {coffee-script}[https://github.com/josh/ruby-coffee-script]
|
426
|
-
|
462
|
+
und eine {Möglichkeit JavaScript auszuführen}[https://github.com/sstephenson/execjs/blob/master/README.md#readme]
|
427
463
|
Dateierweiterungs:: <tt>.coffee</tt>
|
428
|
-
Beispiel::
|
464
|
+
Beispiel:: <tt>coffee :index</tt>
|
429
465
|
|
430
466
|
=== Eingebettete Templates
|
431
467
|
|
@@ -729,7 +765,7 @@ Vergleichbar mit +body+ lassen sich auch Status-Code und Header setzen:
|
|
729
765
|
get '/foo' do
|
730
766
|
status 418
|
731
767
|
headers \
|
732
|
-
"Allow" => "BREW, POST, GET, PROPFIND, WHEN"
|
768
|
+
"Allow" => "BREW, POST, GET, PROPFIND, WHEN",
|
733
769
|
"Refresh" => "Refresh: 20; http://www.ietf.org/rfc/rfc2324.txt"
|
734
770
|
halt "Ich bin ein Teekesselchen"
|
735
771
|
end
|
@@ -737,6 +773,56 @@ Vergleichbar mit +body+ lassen sich auch Status-Code und Header setzen:
|
|
737
773
|
Genau wie bei +body+ liest ein Aufrufen von +headers+ oder +status+ ohne
|
738
774
|
Argumente den aktuellen Wert aus.
|
739
775
|
|
776
|
+
=== Response-Streams
|
777
|
+
|
778
|
+
In manchen Situationen sollen Daten bereits an den Client zurückgeschickt
|
779
|
+
werden, bevor ein vollständiger Response bereit steht. Manchmal will man die
|
780
|
+
Verbindung auch erst dann beenden und Daten so lange an den Client
|
781
|
+
zurückschicken, bis er die Verbindung abbricht. Für diese Fälle gibt es die
|
782
|
+
+stream+-Helfer-Methode, die es einem erspart eigene Lösungen zu schreiben:
|
783
|
+
|
784
|
+
get '/' do
|
785
|
+
stream do |out|
|
786
|
+
out << "Das ist ja mal wieder fanta -\n"
|
787
|
+
sleep 0.5
|
788
|
+
out << " (bitte warten…) \n"
|
789
|
+
sleep 1
|
790
|
+
out << "- stisch!\n"
|
791
|
+
end
|
792
|
+
end
|
793
|
+
|
794
|
+
Damit lassen sich Streaming-APIs realisieren, sog. {Server Sent Events}[http://dev.w3.org/html5/eventsource/]
|
795
|
+
die als Basis für {WebSockets}[http://en.wikipedia.org/wiki/WebSocket] dienen.
|
796
|
+
Ebenso können sie verwendet werden, um den Durchsatz zu erhöhen, wenn ein Teil
|
797
|
+
der Daten von langsamen Ressourcen abhängig ist.
|
798
|
+
|
799
|
+
Es ist zu beachten, dass das Verhalten beim Streaming, insbesondere die Anzahl
|
800
|
+
nebenläufiger Anfragen, stark davon abhängt, welcher Webserver für die
|
801
|
+
Applikation verwendet wird. Einige Server, z.B. WEBRick, unterstützen Streaming
|
802
|
+
nicht oder nur teilweise. Sollte der Server Streaming nicht unterstützen, wird
|
803
|
+
ein vollständiger Response-Body zurückgeschickt, sobald der an +stream+
|
804
|
+
weitergegebene Block abgearbeitet ist.
|
805
|
+
|
806
|
+
Ist der optionale Parameter +keep_open+ aktiviert, wird beim gestreamten Objekt
|
807
|
+
+close+ nicht aufgerufen und es ist einem überlassen dies an einem beliebigen
|
808
|
+
späteren Zeitpunkt nachholen. Die Funktion ist jedoch nur bei Event-gesteuerten
|
809
|
+
Serven wie Thin oder Rainbows möglich, andere Server werden trotzdem den Stream
|
810
|
+
beenden:
|
811
|
+
|
812
|
+
set :server, :thin
|
813
|
+
connections = []
|
814
|
+
|
815
|
+
get '/' do
|
816
|
+
# Den Stream offen halten
|
817
|
+
stream(:keep_open) { |out| connections << out }
|
818
|
+
end
|
819
|
+
|
820
|
+
post '/' do
|
821
|
+
# In alle offenen Streams schreiben
|
822
|
+
connections.each { |out| out << params[:message] << "\n" }
|
823
|
+
"Nachricht verschickt"
|
824
|
+
end
|
825
|
+
|
740
826
|
=== Logger
|
741
827
|
|
742
828
|
Im Geltungsbereich eines Request stellt die +logger+ Helfer-Methode eine
|
@@ -823,7 +909,7 @@ Um Argumente an ein Redirect weiterzugeben, können sie entweder dem Query
|
|
823
909
|
|
824
910
|
oder eine Session verwendet werden:
|
825
911
|
|
826
|
-
enable :
|
912
|
+
enable :sessions
|
827
913
|
|
828
914
|
get '/foo' do
|
829
915
|
session[:secret] = 'foo'
|
@@ -860,7 +946,7 @@ Headers, wird <tt>Cache-Control</tt> automatisch eigestellt:
|
|
860
946
|
expires 500, :public, :must_revalidate
|
861
947
|
end
|
862
948
|
|
863
|
-
Um alles richtig zu machen, sollten auch +etag+
|
949
|
+
Um alles richtig zu machen, sollten auch +etag+ oder +last_modified+ verwendet
|
864
950
|
werden. Es wird empfohlen, dass diese Helfer aufgerufen werden *bevor* die
|
865
951
|
eigentliche Arbeit anfängt, da sie sofort eine Antwort senden, wenn der
|
866
952
|
Client eine aktuelle Version im Cache vorhält:
|
@@ -878,8 +964,9 @@ ebenso ist es möglich einen
|
|
878
964
|
etag @article.sha1, :weak
|
879
965
|
|
880
966
|
Diese Helfer führen nicht das eigentliche Caching aus, sondern geben die dafür
|
881
|
-
notwendigen Informationen an den Cache weiter. Für schnelle
|
882
|
-
bietet sich z.B.
|
967
|
+
notwendigen Informationen an den Cache weiter. Für schnelle Reverse-Proxy
|
968
|
+
Cache-Lösungen bietet sich z.B.
|
969
|
+
{rack-cache}[http://rtomayko.github.com/rack-cache/] an:
|
883
970
|
|
884
971
|
require "rack/cache"
|
885
972
|
require "sinatra"
|
@@ -891,6 +978,9 @@ bietet sich z.B. {rack-cache}[http://rtomayko.github.com/rack-cache/] an:
|
|
891
978
|
sleep 5
|
892
979
|
"hello"
|
893
980
|
end
|
981
|
+
|
982
|
+
Um den <tt>Cache-Control</tt>-Header mit Informationen zu versorgen, verwendet
|
983
|
+
man die <tt>:static_cache_control</tt>-Einstellung (s.u.).
|
894
984
|
|
895
985
|
=== Dateien versenden
|
896
986
|
|
@@ -997,6 +1087,37 @@ Ebenso kann eine Dateiname als Parameter hinzugefügt werden:
|
|
997
1087
|
"Speichern!"
|
998
1088
|
end
|
999
1089
|
|
1090
|
+
=== Umgang mit Datum und Zeit
|
1091
|
+
|
1092
|
+
Sinatra bietet eine <tt>time_for</tt>-Helfer-Methode, die aus einem gegebenen
|
1093
|
+
Wert ein Time-Objekt generiert. Ebenso kann sie nach +DateTime+, +Date+ und
|
1094
|
+
ähnliche Klassen konvertieren:
|
1095
|
+
|
1096
|
+
get '/' do
|
1097
|
+
pass if Time.now > time_for('Dec 23, 2012')
|
1098
|
+
"noch Zeit"
|
1099
|
+
end
|
1100
|
+
|
1101
|
+
Diese Methode wird intern für +expires, +last_modiefied+ und Freunde verwendet.
|
1102
|
+
Mit ein paar Handgriffen lässt sich diese Methode also in ihrem Verhalten
|
1103
|
+
erweitern, indem man +time_for+ in der eigenen Applikation überschreibt:
|
1104
|
+
|
1105
|
+
helpers do
|
1106
|
+
def time_for(value)
|
1107
|
+
case value
|
1108
|
+
when :yesterday then Time.now - 24*60*60
|
1109
|
+
when :tomorrow then Time.now + 24*60*60
|
1110
|
+
else super
|
1111
|
+
end
|
1112
|
+
end
|
1113
|
+
end
|
1114
|
+
|
1115
|
+
get '/' do
|
1116
|
+
last_modified :yesterday
|
1117
|
+
expires :tomorrow
|
1118
|
+
"Hallo"
|
1119
|
+
end
|
1120
|
+
|
1000
1121
|
=== Nachschlagen von Template-Dateien
|
1001
1122
|
|
1002
1123
|
Die <tt>find_template</tt>-Helfer-Methode wird genutzt, um Template-Dateien zum
|
@@ -1089,100 +1210,138 @@ Diese Einstellungen sind über +settings+ erreichbar:
|
|
1089
1210
|
...
|
1090
1211
|
end
|
1091
1212
|
|
1213
|
+
=== Einstellung des Angriffsschutzes
|
1214
|
+
|
1215
|
+
Sinatra verwendet
|
1216
|
+
{Rack::Protection}[https://github.com/rkh/rack-protection#readme], um die
|
1217
|
+
Anwendung vor häufig vorkommenden Angriffen zu schützen. Diese Voreinstellung
|
1218
|
+
lässt sich selbstverständlich auch deaktivieren, z.B. um
|
1219
|
+
Geschwindigkeitsvorteile zu gewinnen:
|
1220
|
+
|
1221
|
+
disable :protection
|
1222
|
+
|
1223
|
+
Um einen bestimmten Schutzmechanismus zu deaktivieren, fügt man +protection+
|
1224
|
+
einen Hash mit Optionen hinzu:
|
1225
|
+
|
1226
|
+
set :protection, :except => :path_traversal
|
1227
|
+
|
1228
|
+
Neben Strings akzeptiert <tt>:except</tt> auch Arrays, um gleich mehrere
|
1229
|
+
Schutzmechanismen zu deaktivieren:
|
1230
|
+
|
1231
|
+
set :protections, :except => [:path_traversal, :session_hijacking]
|
1232
|
+
|
1092
1233
|
=== Mögliche Einstellungen
|
1093
1234
|
|
1094
|
-
[absolute_redirects]
|
1095
|
-
|
1096
|
-
|
1097
|
-
|
1098
|
-
|
1099
|
-
|
1100
|
-
|
1101
|
-
|
1102
|
-
|
1103
|
-
|
1104
|
-
|
1235
|
+
[absolute_redirects] Wenn ausgeschaltet, wird Sinatra relative Redirects
|
1236
|
+
zulassen. Jedoch ist Sinatra dann nicht mehr mit RFC
|
1237
|
+
2616 (HTTP 1.1) konform, das nur absolute Redirects
|
1238
|
+
zulässt.
|
1239
|
+
|
1240
|
+
Sollte eingeschaltet werden, wenn die Applikation
|
1241
|
+
hinter einem Reverse-Proxy liegt, der nicht ordentlich
|
1242
|
+
eingerichtet ist. Beachte, dass die
|
1243
|
+
+url+-Helfer-Methode nach wie vor absolute URLs
|
1244
|
+
erstellen wird, es sei denn, es wird als zweiter
|
1245
|
+
Parameter +false+ angegeben.
|
1246
|
+
|
1247
|
+
Standardmäßig nicht aktiviert.
|
1105
1248
|
|
1106
1249
|
|
1107
|
-
[add_charsets]
|
1108
|
-
|
1250
|
+
[add_charsets] Mime-Types werden hier automatisch der Helfer-Methode
|
1251
|
+
<tt>content_type</tt> zugeordnet.
|
1109
1252
|
|
1110
|
-
|
1111
|
-
|
1253
|
+
Es empfielt sich, Werte hinzuzufügen statt sie zu
|
1254
|
+
überschreiben:
|
1112
1255
|
|
1113
|
-
|
1256
|
+
settings.add_charsets << "application/foobar"
|
1114
1257
|
|
1115
|
-
[app_file]
|
1116
|
-
|
1117
|
-
|
1258
|
+
[app_file] Hauptdatei der Applikation. Wird verwendet, um das
|
1259
|
+
Wurzel-, Inline-, View- und öffentliche Verzeichnis des
|
1260
|
+
Projekts festzustellen.
|
1118
1261
|
|
1119
|
-
[bind]
|
1120
|
-
|
1262
|
+
[bind] IP-Address, an die gebunden wird
|
1263
|
+
(Standardwert: 0.0.0.0). Wird nur für den eingebauten
|
1264
|
+
Server verwendet.
|
1121
1265
|
|
1122
|
-
[default_encoding]
|
1123
|
-
|
1266
|
+
[default_encoding] Das Encoding, falls keines angegeben wurde.
|
1267
|
+
Standardwert ist <tt>"utf-8"</tt>.
|
1124
1268
|
|
1125
|
-
[dump_errors]
|
1269
|
+
[dump_errors] Fehler im Log anzeigen.
|
1126
1270
|
|
1127
|
-
[environment]
|
1128
|
-
|
1129
|
-
|
1271
|
+
[environment] Momentane Umgebung. Standardmäßig auf
|
1272
|
+
<tt>content_type</tt> oder <tt>"development"</tt>
|
1273
|
+
eingestellt, soweit ersteres nicht vorhanden.
|
1130
1274
|
|
1131
|
-
[logging]
|
1275
|
+
[logging] Den Logger verwenden.
|
1132
1276
|
|
1133
|
-
[lock]
|
1134
|
-
|
1277
|
+
[lock] Jeder Request wird gelocked. Es kann nur ein Request
|
1278
|
+
pro Ruby-Prozess gleichzeitig verarbeitet werden.
|
1135
1279
|
|
1136
|
-
|
1137
|
-
|
1280
|
+
Eingeschaltet, wenn die Applikation threadsicher ist.
|
1281
|
+
Standardmäßig nicht aktiviert.
|
1282
|
+
|
1283
|
+
[method_override] Verwende <tt>_method</tt>, um put/delete-Formulardaten
|
1284
|
+
in Browsern zu verwenden, die dies normalerweise nicht
|
1285
|
+
unterstützen.
|
1138
1286
|
|
1139
|
-
[
|
1140
|
-
|
1141
|
-
unterstützen.
|
1287
|
+
[port] Port für die Applikation. Wird nur im internen Server
|
1288
|
+
verwendet.
|
1142
1289
|
|
1143
|
-
[
|
1144
|
-
|
1290
|
+
[prefixed_redirects] Entscheidet, ob <tt>request.script_name</tt> in
|
1291
|
+
Redirects eingefügt wird oder nicht, wenn kein
|
1292
|
+
absoluter Pfad angegeben ist. Auf diese Weise verhält
|
1293
|
+
sich <tt>redirect '/foo'</tt> so, als wäre es ein
|
1294
|
+
<tt>redirect to('/foo')</tt>. Standardmäßig nicht
|
1295
|
+
aktiviert.
|
1296
|
+
|
1297
|
+
[protection] Legt fest, ob der Schutzmechanismus für häufig
|
1298
|
+
Vorkommende Webangriffe auf Webapplikationen aktiviert
|
1299
|
+
wird oder nicht. Weitere Informationen im vorhergehenden
|
1300
|
+
Abschnitt.
|
1145
1301
|
|
1146
|
-
[
|
1147
|
-
|
1148
|
-
angegeben ist. Auf diese Weise verhält sich
|
1149
|
-
<tt>redirect '/foo'</tt> so, als wäre es ein
|
1150
|
-
<tt>redirect to('/foo')</tt>.
|
1151
|
-
Standardmäßig nicht aktiviert.
|
1302
|
+
[public_folder] Das öffentliche Verzeichnis, aus dem Daten zur
|
1303
|
+
Verfügung gestellt werden können.
|
1152
1304
|
|
1153
|
-
[
|
1154
|
-
gestellt werden können.
|
1305
|
+
[reload_templates] Im development-Modus aktiviert.
|
1155
1306
|
|
1156
|
-
[
|
1307
|
+
[root] Wurzelverzeichnis des Projekts.
|
1157
1308
|
|
1158
|
-
[
|
1309
|
+
[raise_errors] Einen Ausnahmezustand aufrufen. Beendet die
|
1310
|
+
Applikation.
|
1159
1311
|
|
1160
|
-
[
|
1312
|
+
[run] Wenn aktiviert, wird Sinatra versuchen, den Webserver
|
1313
|
+
zu starten. Nicht verwenden, wenn Rackup oder anderes
|
1314
|
+
verwendet werden soll.
|
1161
1315
|
|
1162
|
-
[
|
1163
|
-
|
1164
|
-
verwendet werden soll.
|
1316
|
+
[running] Läuft der eingebaute Server? Diese Einstellung nicht
|
1317
|
+
ändern!
|
1165
1318
|
|
1166
|
-
[
|
1167
|
-
|
1319
|
+
[server] Server oder Liste von Servern, die als eingebaute
|
1320
|
+
Server zur Verfügung stehen.
|
1321
|
+
Standardmäßig auf ['thin', 'mongrel', 'webrick']
|
1322
|
+
voreingestellt. Die Anordnung gibt die Priorität vor.
|
1168
1323
|
|
1169
|
-
[
|
1170
|
-
zur Verfügung stehen.
|
1171
|
-
Standardmäßig auf ['thin', 'mongrel', 'webrick']
|
1172
|
-
voreingestellt. Die Anordnung gibt die Priorität vor.
|
1324
|
+
[sessions] Sessions auf Cookiebasis aktivieren.
|
1173
1325
|
|
1174
|
-
[
|
1326
|
+
[show_exceptions] Stacktrace im Browser bei Fehlern anzeigen.
|
1175
1327
|
|
1176
|
-
[
|
1328
|
+
[static] Entscheidet, ob Sinatra statische Dateien zur Verfügung
|
1329
|
+
stellen soll oder nicht.
|
1330
|
+
Sollte nicht aktiviert werden, wenn ein Server
|
1331
|
+
verwendet wird, der dies auch selbstständig erledigen
|
1332
|
+
kann. Deaktivieren wird die Performance erhöhen.
|
1333
|
+
Standardmäßig aktiviert.
|
1177
1334
|
|
1178
|
-
[
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1183
|
-
|
1335
|
+
[static_cache_control] Wenn Sinatra statische Daten zur Verfügung stellt,
|
1336
|
+
können mit dieser Einstellung die +Cache-Control+
|
1337
|
+
Header zu den Responses hinzugefügt werden. Die
|
1338
|
+
Einstellung verwendet dazu die +cache_control+
|
1339
|
+
Helfer-Methode. Standardmäßig deaktiviert.
|
1340
|
+
Ein Array wird verwendet, um mehrere Werte gleichzeitig
|
1341
|
+
zu übergeben:
|
1342
|
+
<tt>set :static_cache_control, [:public, :max_age => 300]</tt>
|
1184
1343
|
|
1185
|
-
[views]
|
1344
|
+
[views] Verzeichnis der Views.
|
1186
1345
|
|
1187
1346
|
== Fehlerbehandlung
|
1188
1347
|
|
@@ -1501,6 +1660,7 @@ ohne dass sie einer Konstanten zugeordnet werden. Dies lässt sich mit
|
|
1501
1660
|
|
1502
1661
|
Die Applikation kann mit Hilfe eines optionalen Parameters erstellt werden:
|
1503
1662
|
|
1663
|
+
# config.ru
|
1504
1664
|
require 'sinatra/base'
|
1505
1665
|
|
1506
1666
|
controller = Sinatra.new do
|
@@ -1643,50 +1803,65 @@ Die folgenden Versionen werden offiziell unterstützt:
|
|
1643
1803
|
[ Ruby 1.8.7 ]
|
1644
1804
|
1.8.7 wird vollständig unterstützt, aber solange nichts dagegen spricht,
|
1645
1805
|
wird ein Update auf 1.9.2 oder ein Umstieg auf JRuby/Rubinius empfohlen.
|
1806
|
+
Unterstützung für 1.8.7 wird es mindestens bis Sinatra 2.0 und Ruby 2.0 geben,
|
1807
|
+
es sei denn, dass der unwahrscheinliche Fall eintritt und 1.8.8 rauskommt. Doch
|
1808
|
+
selbst dann ist es eher wahrscheinlich, dass 1.8.7 weiterhin unterstützt wird.
|
1809
|
+
<b>Ruby 1.8.6 wird nicht mehr unterstützt.</b> Soll Sinatra unter 1.8.6
|
1810
|
+
eingesetzt werden, muss Sinatra 1.2 verwendet werden, dass noch bis zum
|
1811
|
+
Release von Sinatra 1.4.0 fortgeführt wird.
|
1646
1812
|
|
1647
1813
|
[ Ruby 1.9.2 ]
|
1648
|
-
1.9.2 wird unterstützt und empfohlen. Beachte, dass Markaby und Radius
|
1649
|
-
momentan noch nicht kompatibel mit 1.9 sind. Version 1.9.
|
1814
|
+
1.9.2 wird voll unterstützt und empfohlen. Beachte, dass Markaby und Radius
|
1815
|
+
momentan noch nicht kompatibel mit 1.9 sind. Version 1.9.2p0 sollte nicht
|
1650
1816
|
verwendet werden, da unter Sinatra immer wieder Segfaults auftreten.
|
1651
|
-
|
1817
|
+
Unterstützung wird es mindestens bis zum Release von Ruby 1.9.4/2.0 geben und
|
1818
|
+
das letzte Sinatra Release für 1.9 wird so lange unterstützt, wie das Ruby
|
1819
|
+
Core-Team 1.9 pflegt.
|
1820
|
+
|
1821
|
+
[ Ruby 1.9.3 ]
|
1822
|
+
Obwohl Tests bereits auf 1.9.3 laufen, sind bisher keine Applikationen auf
|
1823
|
+
1.9.3 in Produktion bekannt. Ebenso wie bei 1.9.2 besteht die gleiche Warnung
|
1824
|
+
zum Patchlevel 0.
|
1825
|
+
|
1652
1826
|
[ Rubinius ]
|
1653
|
-
Rubinius (rbx >= 1.2.
|
1827
|
+
Rubinius (rbx >= 1.2.4) wird offiziell unter Einbezug aller Templates
|
1654
1828
|
unterstützt.
|
1655
1829
|
|
1656
1830
|
[ JRuby ]
|
1657
|
-
JRuby wird offiziell unterstützt (JRuby >= 1.6.
|
1831
|
+
JRuby wird offiziell unterstützt (JRuby >= 1.6.3). Probleme mit Template-
|
1658
1832
|
Bibliotheken Dritter sind nicht bekannt. Falls JRuby zum Einsatz kommt,
|
1659
1833
|
sollte aber darauf geachtet werden, dass ein JRuby-Rack-Handler zum Einsatz
|
1660
1834
|
kommt – der Thin-Web-Server wird bisher nicht unterstütz. JRubys
|
1661
1835
|
Unterstützung für C-Erweiterungen sind zur Zeit noch experimenteller Natur,
|
1662
1836
|
betrifft im Moment aber nur RDiscount und Redcarpet.
|
1663
1837
|
|
1664
|
-
<b>Ruby 1.8.6 wird nicht weiter unterstützt.</b> Falls Sinatra trotzdem unter
|
1665
|
-
1.8.6 eingesetzt wird, muss Sinatra 1.2 verwendet werden, dass noch bis zum
|
1666
|
-
Release von Sinatra 1.4.0 mit kleinen Bugfixes versorgt werden wird.
|
1667
1838
|
|
1668
1839
|
Weiterhin werden wir auf kommende Ruby-Versionen ein Auge haben.
|
1669
1840
|
|
1670
1841
|
Die nachfolgend aufgeführten Ruby-Implementierungen werden offiziell nicht von
|
1671
1842
|
Sinatra unterstützt, funktionieren aber normalerweise:
|
1672
1843
|
|
1844
|
+
* Ruby Enterprise Edition
|
1673
1845
|
* Ältere Versionen von JRuby und Rubinius
|
1674
1846
|
* MacRuby, Maglev, IronRuby
|
1675
|
-
* Ruby 1.9.0 und 1.9.1
|
1847
|
+
* Ruby 1.9.0 und 1.9.1 (wird jedoch nicht empfohlen, s.o.)
|
1676
1848
|
|
1677
1849
|
Nicht offiziell unterstützt bedeutet, dass wenn Sachen nicht funktionieren,
|
1678
1850
|
wir davon ausgehen, dass es nicht an Sinatra sondern an der jeweiligen
|
1679
1851
|
Implentierung liegt.
|
1680
1852
|
|
1681
1853
|
Im Rahmen unserer CI (Kontinuierlichen Integration) wird bereits ruby-head
|
1682
|
-
(das kommende Ruby 1.9.
|
1854
|
+
(das kommende Ruby 1.9.4) mit eingebunden. Da noch alles im Fluss ist, kann zur
|
1683
1855
|
Zeit für nichts garantiert werden. Es kann aber erwartet werden, dass Ruby
|
1684
|
-
1.9.
|
1856
|
+
1.9.4p0 von Sinatra unterstützt werden wird.
|
1685
1857
|
|
1686
1858
|
Sinatra sollte auf jedem Betriebssystem laufen, dass den gewählten Ruby-
|
1687
1859
|
Interpreter unterstützt.
|
1688
1860
|
|
1689
|
-
|
1861
|
+
Sinatra wird aktuell nicht unter Cardinal, SmallRuby, BleuRuby oder irgendeiner
|
1862
|
+
Version von Ruby vor 1.8.7 laufen.
|
1863
|
+
|
1864
|
+
== Der neuste Stand (The Bleeding Edge)
|
1690
1865
|
|
1691
1866
|
Um auf dem neusten Stand zu bleiben, kann der Master-Branch verwendet werden.
|
1692
1867
|
Er sollte recht stabil sein. Ebenso gibt es von Zeit zu Zeit prerelease Gems,
|
@@ -1783,3 +1958,4 @@ SemVer und SemVerTag.
|
|
1783
1958
|
* API Dokumentation für die {aktuelle Version}[http://rubydoc.info/gems/sinatra]
|
1784
1959
|
oder für {HEAD}[http://rubydoc.info/github/sinatra/sinatra] auf
|
1785
1960
|
http://rubydoc.info
|
1961
|
+
* {CI Server}[http://ci.rkh.im/view/Sinatra/]
|