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 ADDED
@@ -0,0 +1,16 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - rbx
6
+ - rbx-2.0
7
+ - jruby
8
+ - ruby-head
9
+ env:
10
+ - "rack=1.3.0"
11
+ - "rack=master"
12
+ - "tilt=1.3.2"
13
+ - "tilt=master"
14
+ notifications:
15
+ recipients:
16
+ - k.haase@finn.de
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 adjusted.
18
- Moreover, since we do no longer need to keep an unescaped version of
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 now may be an options hash. (Konstantin Haase)
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 on at
32
- least Rack 1.3.0. This means that it is incompatible to Rails prior to 3.1.0.
33
- Please use 1.2.x if you require an earlier version for Ruby or Rack, which we
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
- * It is now possible to use a different target class for the top level DSL (aka
37
- classic style) than `Sinatra::Application` by setting `Delegator.target`.
38
- This was mainly introduced to ease testing. (Konstantin Haase)
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
- * Error handlers defined for an error class will now also handle subclasses of
41
- that class, unless more specific error handlers exist. (Konstantin Haase)
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 avoid
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
- * `Sinatra.run!` now prints to stderr rather than stdout. (Andrew Armenia)
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
- * Middleware setup is now distributed across multiple methods, allowing Sinatra
69
- extensions to easily hook into the setup process. (Konstantin Haase)
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', :group => 'haml'
27
- gem 'sass', :group => 'sass'
28
- gem 'builder', :group => 'builder'
29
- gem 'erubis', :group => 'erubis'
30
- gem 'less', '~> 1.0', :group => 'less'
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
- gem 'nokogiri', :group => 'nokogiri' if RUBY_ENGINE != 'maglev'
41
- #nokogiri_options = {:group => 'nokogiri'}
42
- #nokogiri_options[:git] = "https://github.com/MagLev/nokogiri.git" if RUBY_ENGINE == 'maglev'
43
- #gem 'nokogiri', nokogiri_options if RUBY_ENGINE != 'maglev'
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', :group => 'rdiscount'
48
- gem 'redcarpet', :group => 'redcarpet'
58
+ gem 'rdiscount'
59
+ gem 'redcarpet'
49
60
 
50
61
  ## bluecloth is broken
51
- #gem 'bluecloth', :group => 'bluecloth'
62
+ #gem 'bluecloth'
52
63
  end
53
64
 
54
- platforms :ruby_18, :jruby do
55
- gem 'json', :group => 'coffee-script'
56
- gem 'markaby', :group => 'markaby'
57
- gem 'radius', :group => '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', :group => '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 <tt>:public</tt>-Option
214
- setzt:
246
+ möglich, einen anderen Ort zu definieren, indem man die
247
+ <tt>:public_folder</tt>-Option setzt:
215
248
 
216
- set :public, File.dirname(__FILE__) + '/static'
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
- und eine {Möglichkeit JavaScript auszuführen}[https://github.com/sstephenson/execjs/blob/master/README.md#readme]
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:: <tt>coffee :index</tt>
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 :session
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+ und +last_modified+ verwendet
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 Cache-Lösungen
882
- bietet sich z.B. {rack-cache}[http://rtomayko.github.com/rack-cache/] an:
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] Wenn ausgeschaltet, wird Sinatra relative Redirects
1095
- zulassen. Jedoch ist Sinatra dann nicht mehr mit RFC 2616
1096
- (HTTP 1.1) konform, das nur absolute Redirects zulässt.
1097
-
1098
- Sollte eingeschaltet werden, wenn die Applikation hinter
1099
- einem Reverse-Proxy liegt, der nicht ordentlich
1100
- eingerichtet ist. Beachte, dass die +url+-Helfer-Methode
1101
- nach wie vor absolute URLs erstellen wird, es sei denn,
1102
- es wird als zweiter Parameter +false+ angegeben.
1103
-
1104
- Standardmäßig nicht aktiviert.
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] Mime-Types werden hier automatisch der Helfer-Methode
1108
- <tt>content_type</tt> zugeordnet.
1250
+ [add_charsets] Mime-Types werden hier automatisch der Helfer-Methode
1251
+ <tt>content_type</tt> zugeordnet.
1109
1252
 
1110
- Es empfielt sich, Werte hinzuzufügen statt sie zu
1111
- überschreiben:
1253
+ Es empfielt sich, Werte hinzuzufügen statt sie zu
1254
+ überschreiben:
1112
1255
 
1113
- settings.add_charsets << "application/foobar"
1256
+ settings.add_charsets << "application/foobar"
1114
1257
 
1115
- [app_file] Hauptdatei der Applikation. Wird verwendet, um das
1116
- Wurzel-, Inline-, View- und öffentliche Verzeichnis des
1117
- Projekts festzustellen.
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] IP-Address, an die gebunden wird (Standardwert: 0.0.0.0).
1120
- Wird nur für den eingebauten Server verwendet.
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] Das Encoding, falls keines angegeben wurde.
1123
- Standardwert ist <tt>"utf-8"</tt>.
1266
+ [default_encoding] Das Encoding, falls keines angegeben wurde.
1267
+ Standardwert ist <tt>"utf-8"</tt>.
1124
1268
 
1125
- [dump_errors] Fehler im Log anzeigen.
1269
+ [dump_errors] Fehler im Log anzeigen.
1126
1270
 
1127
- [environment] Momentane Umgebung. Standardmäßig auf
1128
- <tt>content_type</tt> oder <tt>"development"</tt>
1129
- eingestellt, soweit ersteres nicht vorhanden.
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] Den Logger verwenden.
1275
+ [logging] Den Logger verwenden.
1132
1276
 
1133
- [lock] Jeder Request wird gelocked. Es kann nur ein Request pro
1134
- Ruby-Prozess gleichzeitig verarbeitet werden.
1277
+ [lock] Jeder Request wird gelocked. Es kann nur ein Request
1278
+ pro Ruby-Prozess gleichzeitig verarbeitet werden.
1135
1279
 
1136
- Eingeschaltet, wenn die Applikation threadsicher ist.
1137
- Standardmäßig nicht aktiviert.
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
- [method_override] Verwende <tt>_method</tt>, um put/delete-Formulardaten in
1140
- Browsern zu verwenden, die dies normalerweise nicht
1141
- unterstützen.
1287
+ [port] Port für die Applikation. Wird nur im internen Server
1288
+ verwendet.
1142
1289
 
1143
- [port] Port für die Applikation. Wird nur im internen Server
1144
- verwendet.
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
- [prefixed_redirects] Entscheidet, ob <tt>request.script_name</tt> in Redirects
1147
- eingefügt wird oder nicht, wenn kein absoluter Pfad
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
- [public] Das öffentliche Verzeichnis, aus dem Daten zur Verfügung
1154
- gestellt werden können.
1305
+ [reload_templates] Im development-Modus aktiviert.
1155
1306
 
1156
- [reload_templates] Im development-Modus aktiviert.
1307
+ [root] Wurzelverzeichnis des Projekts.
1157
1308
 
1158
- [root] Wurzelverzeichnis des Projekts.
1309
+ [raise_errors] Einen Ausnahmezustand aufrufen. Beendet die
1310
+ Applikation.
1159
1311
 
1160
- [raise_errors] Einen Ausnahmezustand aufrufen. Beendet die Applikation.
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
- [run] Wenn aktiviert, wird Sinatra versuchen, den Webserver zu
1163
- starten. Nicht verwenden, wenn Rackup oder anderes
1164
- verwendet werden soll.
1316
+ [running] Läuft der eingebaute Server? Diese Einstellung nicht
1317
+ ändern!
1165
1318
 
1166
- [running] Läuft der eingebaute Server? Diese Einstellung nicht
1167
- ändern!
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
- [server] Server oder Liste von Servern, die als eingebaute Server
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
- [sessions] Sessions auf Cookiebasis aktivieren.
1326
+ [show_exceptions] Stacktrace im Browser bei Fehlern anzeigen.
1175
1327
 
1176
- [show_exceptions] Stacktrace im Browser bei Fehlern anzeigen.
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
- [static] Entscheidet, ob Sinatra statische Dateien zur Verfügung
1179
- stellen soll oder nicht.
1180
- Sollte nicht aktiviert werden, wenn ein Server verwendet
1181
- wird, der dies auch selbstständig erledigen kann.
1182
- Deaktivieren wird die Performance erhöhen.
1183
- Standardmäßig aktiviert.
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] Verzeichnis der 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.0p0 sollte nicht
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.3) wird offiziell unter Einbezug aller Templates
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.1). Probleme mit Template-
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.3) mit eingebunden. Da noch alles im Fluss ist, kann zur
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.3p0 von Sinatra unterstützt werden wird.
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
- == Der neueste Stand (The Bleeding Edge)
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/]