Capcode 0.9.8 → 0.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +4 -0
- data/doc/rdoc/classes/Capcode.html +468 -440
- data/doc/rdoc/classes/Capcode/Configuration.html +29 -28
- data/doc/rdoc/classes/Capcode/Helpers.html +139 -139
- data/doc/rdoc/classes/Capcode/StaticFiles.html +199 -0
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/README_rdoc.html +12 -1
- data/doc/rdoc/files/lib/capcode/configuration_rb.html +1 -1
- data/doc/rdoc/files/lib/capcode_rb.html +3 -2
- data/doc/rdoc/fr_class_index.html +1 -0
- data/doc/rdoc/fr_method_index.html +6 -4
- data/examples/static.rb +26 -0
- data/examples/static/bye.html +6 -0
- data/examples/static/static-index.html +6 -0
- data/lib/capcode.rb +103 -48
- data/lib/capcode.rbSAVE +881 -0
- data/lib/capcode/configuration.rb +1 -1
- data/lib/capcode/core_ext.rb +8 -0
- data/lib/capcode/version.rb +1 -1
- metadata +11 -7
- data/examples/rest.log +0 -70
@@ -0,0 +1,199 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
7
|
+
<head>
|
8
|
+
<title>Class: Capcode::StaticFiles</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
11
|
+
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
12
|
+
<script type="text/javascript">
|
13
|
+
// <![CDATA[
|
14
|
+
|
15
|
+
function popupCode( url ) {
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
+
}
|
18
|
+
|
19
|
+
function toggleCode( id ) {
|
20
|
+
if ( document.getElementById )
|
21
|
+
elem = document.getElementById( id );
|
22
|
+
else if ( document.all )
|
23
|
+
elem = eval( "document.all." + id );
|
24
|
+
else
|
25
|
+
return false;
|
26
|
+
|
27
|
+
elemStyle = elem.style;
|
28
|
+
|
29
|
+
if ( elemStyle.display != "block" ) {
|
30
|
+
elemStyle.display = "block"
|
31
|
+
} else {
|
32
|
+
elemStyle.display = "none"
|
33
|
+
}
|
34
|
+
|
35
|
+
return true;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Make codeblocks hidden by default
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
+
|
41
|
+
// ]]>
|
42
|
+
</script>
|
43
|
+
|
44
|
+
</head>
|
45
|
+
<body>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
<div id="classHeader">
|
50
|
+
<table class="header-table">
|
51
|
+
<tr class="top-aligned-row">
|
52
|
+
<td><strong>Class</strong></td>
|
53
|
+
<td class="class-name-in-header">Capcode::StaticFiles</td>
|
54
|
+
</tr>
|
55
|
+
<tr class="top-aligned-row">
|
56
|
+
<td><strong>In:</strong></td>
|
57
|
+
<td>
|
58
|
+
<a href="../../files/lib/capcode_rb.html">
|
59
|
+
lib/capcode.rb
|
60
|
+
</a>
|
61
|
+
<br />
|
62
|
+
</td>
|
63
|
+
</tr>
|
64
|
+
|
65
|
+
<tr class="top-aligned-row">
|
66
|
+
<td><strong>Parent:</strong></td>
|
67
|
+
<td>
|
68
|
+
Object
|
69
|
+
</td>
|
70
|
+
</tr>
|
71
|
+
</table>
|
72
|
+
</div>
|
73
|
+
<!-- banner header -->
|
74
|
+
|
75
|
+
<div id="bodyContent">
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
<div id="contextContent">
|
80
|
+
|
81
|
+
<div id="description">
|
82
|
+
<p>
|
83
|
+
Static file loader
|
84
|
+
</p>
|
85
|
+
<p>
|
86
|
+
Use :
|
87
|
+
</p>
|
88
|
+
<pre>
|
89
|
+
set :static, "path/to/static"
|
90
|
+
</pre>
|
91
|
+
|
92
|
+
</div>
|
93
|
+
|
94
|
+
|
95
|
+
</div>
|
96
|
+
|
97
|
+
<div id="method-list">
|
98
|
+
<h3 class="section-bar">Methods</h3>
|
99
|
+
|
100
|
+
<div class="name-list">
|
101
|
+
<a href="#M000026">call</a>
|
102
|
+
<a href="#M000025">new</a>
|
103
|
+
</div>
|
104
|
+
</div>
|
105
|
+
|
106
|
+
</div>
|
107
|
+
|
108
|
+
|
109
|
+
<!-- if includes -->
|
110
|
+
|
111
|
+
<div id="section">
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
|
120
|
+
<!-- if method_list -->
|
121
|
+
<div id="methods">
|
122
|
+
<h3 class="section-bar">Public Class methods</h3>
|
123
|
+
|
124
|
+
<div id="method-M000025" class="method-detail">
|
125
|
+
<a name="M000025"></a>
|
126
|
+
|
127
|
+
<div class="method-heading">
|
128
|
+
<a href="#M000025" class="method-signature">
|
129
|
+
<span class="method-name">new</span><span class="method-args">(app)</span>
|
130
|
+
</a>
|
131
|
+
</div>
|
132
|
+
|
133
|
+
<div class="method-description">
|
134
|
+
<p><a class="source-toggle" href="#"
|
135
|
+
onclick="toggleCode('M000025-source');return false;">[Source]</a></p>
|
136
|
+
<div class="method-source-code" id="M000025-source">
|
137
|
+
<pre>
|
138
|
+
<span class="ruby-comment cmt"># File lib/capcode.rb, line 352</span>
|
139
|
+
352: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">app</span>)
|
140
|
+
353: <span class="ruby-ivar">@app</span> = <span class="ruby-identifier">app</span>
|
141
|
+
354: <span class="ruby-keyword kw">end</span>
|
142
|
+
</pre>
|
143
|
+
</div>
|
144
|
+
</div>
|
145
|
+
</div>
|
146
|
+
|
147
|
+
<h3 class="section-bar">Public Instance methods</h3>
|
148
|
+
|
149
|
+
<div id="method-M000026" class="method-detail">
|
150
|
+
<a name="M000026"></a>
|
151
|
+
|
152
|
+
<div class="method-heading">
|
153
|
+
<a href="#M000026" class="method-signature">
|
154
|
+
<span class="method-name">call</span><span class="method-args">(env)</span>
|
155
|
+
</a>
|
156
|
+
</div>
|
157
|
+
|
158
|
+
<div class="method-description">
|
159
|
+
<p><a class="source-toggle" href="#"
|
160
|
+
onclick="toggleCode('M000026-source');return false;">[Source]</a></p>
|
161
|
+
<div class="method-source-code" id="M000026-source">
|
162
|
+
<pre>
|
163
|
+
<span class="ruby-comment cmt"># File lib/capcode.rb, line 356</span>
|
164
|
+
356: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">call</span>(<span class="ruby-identifier">env</span>)
|
165
|
+
357: <span class="ruby-identifier">static</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>( <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-constant">Capcode</span><span class="ruby-operator">::</span><span class="ruby-constant">Configuration</span>.<span class="ruby-identifier">get</span>(<span class="ruby-identifier">:root</span>), <span class="ruby-constant">Capcode</span><span class="ruby-operator">::</span><span class="ruby-constant">Configuration</span>.<span class="ruby-identifier">get</span>(<span class="ruby-identifier">:static</span>) ) )
|
166
|
+
358: <span class="ruby-identifier">file</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-identifier">static</span>, <span class="ruby-identifier">env</span>[<span class="ruby-value str">'REQUEST_PATH'</span>].<span class="ruby-identifier">split</span>(<span class="ruby-value str">"/"</span>) )
|
167
|
+
359: <span class="ruby-identifier">file</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-identifier">file</span>, <span class="ruby-value str">"index.html"</span> ) <span class="ruby-keyword kw">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span>(<span class="ruby-identifier">file</span>)
|
168
|
+
360: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span>(<span class="ruby-identifier">file</span>)
|
169
|
+
361: <span class="ruby-identifier">body</span> = [<span class="ruby-operator">::</span><span class="ruby-constant">File</span>.<span class="ruby-identifier">read</span>(<span class="ruby-identifier">file</span>)]
|
170
|
+
362: <span class="ruby-identifier">header</span> = {
|
171
|
+
363: <span class="ruby-value str">"Last-Modified"</span> =<span class="ruby-operator">></span> <span class="ruby-operator">::</span><span class="ruby-constant">File</span>.<span class="ruby-identifier">mtime</span>(<span class="ruby-identifier">file</span>).<span class="ruby-identifier">httpdate</span>,
|
172
|
+
364: <span class="ruby-value str">"Content-Type"</span> =<span class="ruby-operator">></span> <span class="ruby-operator">::</span><span class="ruby-constant">Rack</span><span class="ruby-operator">::</span><span class="ruby-constant">Mime</span>.<span class="ruby-identifier">mime_type</span>(<span class="ruby-operator">::</span><span class="ruby-constant">File</span>.<span class="ruby-identifier">extname</span>(<span class="ruby-identifier">file</span>), <span class="ruby-value str">'text/plain'</span>),
|
173
|
+
365: <span class="ruby-value str">"Content-Length"</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">body</span>.<span class="ruby-identifier">first</span>.<span class="ruby-identifier">size</span>.<span class="ruby-identifier">to_s</span>
|
174
|
+
366: }
|
175
|
+
367: <span class="ruby-keyword kw">return</span> [<span class="ruby-value">200</span>, <span class="ruby-identifier">header</span>, <span class="ruby-identifier">body</span>]
|
176
|
+
368: <span class="ruby-keyword kw">else</span>
|
177
|
+
369: <span class="ruby-keyword kw">return</span> <span class="ruby-ivar">@app</span>.<span class="ruby-identifier">call</span>(<span class="ruby-identifier">env</span>)
|
178
|
+
370: <span class="ruby-keyword kw">end</span>
|
179
|
+
371:
|
180
|
+
372: <span class="ruby-keyword kw">return</span> <span class="ruby-ivar">@app</span>.<span class="ruby-identifier">call</span>(<span class="ruby-identifier">env</span>)
|
181
|
+
373: <span class="ruby-keyword kw">end</span>
|
182
|
+
</pre>
|
183
|
+
</div>
|
184
|
+
</div>
|
185
|
+
</div>
|
186
|
+
|
187
|
+
|
188
|
+
</div>
|
189
|
+
|
190
|
+
|
191
|
+
</div>
|
192
|
+
|
193
|
+
|
194
|
+
<div id="validator-badges">
|
195
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
196
|
+
</div>
|
197
|
+
|
198
|
+
</body>
|
199
|
+
</html>
|
data/doc/rdoc/created.rid
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
Mon, 17 Jan 2011 12:12:30 +0100
|
@@ -56,7 +56,7 @@
|
|
56
56
|
</tr>
|
57
57
|
<tr class="top-aligned-row">
|
58
58
|
<td><strong>Last Update:</strong></td>
|
59
|
-
<td>
|
59
|
+
<td>Mon Jan 10 21:26:22 +0100 2011</td>
|
60
60
|
</tr>
|
61
61
|
</table>
|
62
62
|
</div>
|
@@ -91,6 +91,17 @@ href="http://www.algorithmique.net/capcode">www.algorithmique.net/capcode</a>/
|
|
91
91
|
<a href="../classes/Capcode.html">Capcode</a> is a web microframework
|
92
92
|
</p>
|
93
93
|
<h2>FEATURES/PROBLEMS:</h2>
|
94
|
+
<h3>0.9.9</h3>
|
95
|
+
<ul>
|
96
|
+
<li>Better static files support <a
|
97
|
+
href="http://github.com/glejeune/Capcode/tree/master/examples/static.rb">See
|
98
|
+
example static.rb</a>
|
99
|
+
|
100
|
+
</li>
|
101
|
+
<li>Rewrite routes loader
|
102
|
+
|
103
|
+
</li>
|
104
|
+
</ul>
|
94
105
|
<h3>0.9.8</h3>
|
95
106
|
<ul>
|
96
107
|
<li>Add "any" to easly replace an <tt>alias_method :post, :get</tt>
|
@@ -56,7 +56,7 @@
|
|
56
56
|
</tr>
|
57
57
|
<tr class="top-aligned-row">
|
58
58
|
<td><strong>Last Update:</strong></td>
|
59
|
-
<td>
|
59
|
+
<td>Mon Jan 10 21:24:39 +0100 2011</td>
|
60
60
|
</tr>
|
61
61
|
</table>
|
62
62
|
</div>
|
@@ -81,10 +81,10 @@ Please read the README.rdoc file !
|
|
81
81
|
<div class="name-list">
|
82
82
|
rubygems
|
83
83
|
rack
|
84
|
+
rack/mime
|
84
85
|
logger
|
85
86
|
optparse
|
86
87
|
irb
|
87
|
-
active_support
|
88
88
|
capcode/version
|
89
89
|
capcode/core_ext
|
90
90
|
capcode/helpers/auth
|
@@ -96,6 +96,7 @@ Please read the README.rdoc file !
|
|
96
96
|
unicorn/launcher
|
97
97
|
unicorn/launcher
|
98
98
|
rainbows
|
99
|
+
control_tower
|
99
100
|
</div>
|
100
101
|
</div>
|
101
102
|
|
@@ -27,6 +27,7 @@
|
|
27
27
|
<a href="classes/Capcode/Helpers.html">Capcode::Helpers</a><br />
|
28
28
|
<a href="classes/Capcode/Helpers/Authorization.html">Capcode::Helpers::Authorization</a><br />
|
29
29
|
<a href="classes/Capcode/Resource.html">Capcode::Resource</a><br />
|
30
|
+
<a href="classes/Capcode/StaticFiles.html">Capcode::StaticFiles</a><br />
|
30
31
|
<a href="classes/Capcode/Views.html">Capcode::Views</a><br />
|
31
32
|
</div>
|
32
33
|
</div>
|
@@ -26,25 +26,27 @@
|
|
26
26
|
<a href="classes/Capcode/Helpers.html#M000015">args (Capcode::Helpers)</a><br />
|
27
27
|
<a href="classes/Capcode/Helpers.html#M000016">args= (Capcode::Helpers)</a><br />
|
28
28
|
<a href="classes/Capcode.html#M000014">before_filter (Capcode)</a><br />
|
29
|
+
<a href="classes/Capcode/StaticFiles.html#M000026">call (Capcode::StaticFiles)</a><br />
|
29
30
|
<a href="classes/Capcode/Helpers.html#M000021">content_for (Capcode::Helpers)</a><br />
|
30
31
|
<a href="classes/Capcode.html#M000003">env (Capcode)</a><br />
|
31
|
-
<a href="classes/Capcode/Configuration.html#
|
32
|
+
<a href="classes/Capcode/Configuration.html#M000029">get (Capcode::Configuration)</a><br />
|
32
33
|
<a href="classes/Capcode.html#M000009">http_authentication (Capcode)</a><br />
|
33
34
|
<a href="classes/Capcode/Helpers/Authorization.html#M000024">http_authentication (Capcode::Helpers::Authorization)</a><br />
|
34
35
|
<a href="classes/Capcode/Helpers.html#M000018">json (Capcode::Helpers)</a><br />
|
35
36
|
<a href="classes/Capcode/Helpers.html#M000023">log (Capcode::Helpers)</a><br />
|
36
37
|
<a href="classes/Capcode.html#M000012">logger (Capcode)</a><br />
|
37
38
|
<a href="classes/Capcode.html#M000007">map (Capcode)</a><br />
|
38
|
-
<a href="classes/Capcode/
|
39
|
+
<a href="classes/Capcode/StaticFiles.html#M000025">new (Capcode::StaticFiles)</a><br />
|
40
|
+
<a href="classes/Capcode/Configuration.html#M000030">options (Capcode::Configuration)</a><br />
|
39
41
|
<a href="classes/Capcode.html#M000002">params (Capcode)</a><br />
|
40
|
-
<a href="classes/Capcode/Configuration.html#
|
42
|
+
<a href="classes/Capcode/Configuration.html#M000027">print_debug (Capcode::Configuration)</a><br />
|
41
43
|
<a href="classes/Capcode/Helpers.html#M000019">redirect (Capcode::Helpers)</a><br />
|
42
44
|
<a href="classes/Capcode/Helpers.html#M000017">render (Capcode::Helpers)</a><br />
|
43
45
|
<a href="classes/Capcode.html#M000005">request (Capcode)</a><br />
|
44
46
|
<a href="classes/Capcode.html#M000006">response (Capcode)</a><br />
|
45
47
|
<a href="classes/Capcode.html#M000011">run (Capcode)</a><br />
|
46
48
|
<a href="classes/Capcode.html#M000004">session (Capcode)</a><br />
|
47
|
-
<a href="classes/Capcode/Configuration.html#
|
49
|
+
<a href="classes/Capcode/Configuration.html#M000028">set (Capcode::Configuration)</a><br />
|
48
50
|
<a href="classes/Capcode.html#M000013">set (Capcode)</a><br />
|
49
51
|
<a href="classes/Capcode/Helpers.html#M000022">static (Capcode::Helpers)</a><br />
|
50
52
|
<a href="classes/Capcode.html#M000008">use (Capcode)</a><br />
|
data/examples/static.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
$:.unshift( "../lib" )
|
2
|
+
require 'capcode'
|
3
|
+
require 'rubygems'
|
4
|
+
|
5
|
+
module Capcode
|
6
|
+
set :static, "static"
|
7
|
+
|
8
|
+
class Index < Route '/'
|
9
|
+
def get
|
10
|
+
render :markaby => :index
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module Capcode::Views
|
16
|
+
def index
|
17
|
+
html do
|
18
|
+
body do
|
19
|
+
h1 "Hello World!"
|
20
|
+
a "Show me static", :href => "/static-index.html"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
Capcode.run( )
|
data/lib/capcode.rb
CHANGED
@@ -2,18 +2,17 @@
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'rack'
|
5
|
+
require 'rack/mime'
|
5
6
|
require 'logger'
|
6
7
|
Logger.class_eval { alias :write :<< } unless Logger.instance_methods.include? "write"
|
7
8
|
require 'optparse'
|
8
9
|
require 'irb'
|
9
|
-
require 'active_support'
|
10
10
|
require 'capcode/version'
|
11
11
|
require 'capcode/core_ext'
|
12
12
|
require 'capcode/helpers/auth'
|
13
13
|
require 'capcode/render/text'
|
14
14
|
require 'capcode/configuration'
|
15
15
|
require 'capcode/filters'
|
16
|
-
|
17
16
|
require 'capcode/ext/rack/urlmap'
|
18
17
|
|
19
18
|
module Capcode
|
@@ -126,7 +125,7 @@ module Capcode
|
|
126
125
|
begin
|
127
126
|
self.send( "render_#{render_type.to_s}", render_name, hash )
|
128
127
|
rescue => e
|
129
|
-
raise Capcode::RenderError, "Error rendering `#{render_type.to_s}' : #{e.message}"
|
128
|
+
raise Capcode::RenderError, "Error rendering `#{render_type.to_s}' : #{e.message}"#, caller
|
130
129
|
end
|
131
130
|
end
|
132
131
|
else
|
@@ -208,22 +207,22 @@ module Capcode
|
|
208
207
|
a = a.delete_if{ |x| x.nil? }
|
209
208
|
|
210
209
|
if klass.class == Class
|
211
|
-
klass.__urls__[0].each do |cpath,
|
212
|
-
|
210
|
+
klass.__urls__[0].each do |cpath, data|
|
211
|
+
args = a.clone
|
213
212
|
|
214
|
-
n = Regexp.new( regexp ).number_of_captures
|
213
|
+
n = Regexp.new( data[:regexp] ).number_of_captures
|
215
214
|
equart = (a.size - n).abs
|
216
215
|
|
217
|
-
rtable = regexp.dup.gsub( /\\\(/, "" ).gsub( /\\\)/, "" ).split( /\([^\)]*\)/ )
|
216
|
+
rtable = data[:regexp].dup.gsub( /\\\(/, "" ).gsub( /\\\)/, "" ).split( /\([^\)]*\)/ )
|
218
217
|
rtable.each do |r|
|
219
218
|
if r == ""
|
220
|
-
cpath = cpath + "/#{
|
219
|
+
cpath = cpath + "/#{args.shift}"
|
221
220
|
else
|
222
221
|
cpath = cpath + "/#{r}"
|
223
222
|
end
|
224
223
|
end
|
225
224
|
|
226
|
-
cpath = (cpath + "/" +
|
225
|
+
cpath = (cpath + "/" + args.join( "/" )) if args.size > 0
|
227
226
|
cpath = cpath.gsub( /(\/){2,}/, "/" )
|
228
227
|
result[equart] = cpath
|
229
228
|
end
|
@@ -344,6 +343,35 @@ module Capcode
|
|
344
343
|
[status, headers, body]
|
345
344
|
end
|
346
345
|
end
|
346
|
+
|
347
|
+
# Static file loader
|
348
|
+
#
|
349
|
+
# Use :
|
350
|
+
# set :static, "path/to/static"
|
351
|
+
class StaticFiles
|
352
|
+
def initialize(app)
|
353
|
+
@app = app
|
354
|
+
end
|
355
|
+
|
356
|
+
def call(env)
|
357
|
+
static = File.expand_path( File.join(Capcode::Configuration.get(:root), Capcode::Configuration.get(:static) ) )
|
358
|
+
file = File.join(static, env['REQUEST_PATH'].split("/") )
|
359
|
+
file = File.join(file, "index.html" ) if File.directory?(file)
|
360
|
+
if File.exist?(file)
|
361
|
+
body = [::File.read(file)]
|
362
|
+
header = {
|
363
|
+
"Last-Modified" => ::File.mtime(file).httpdate,
|
364
|
+
"Content-Type" => ::Rack::Mime.mime_type(::File.extname(file), 'text/plain'),
|
365
|
+
"Content-Length" => body.first.size.to_s
|
366
|
+
}
|
367
|
+
return [200, header, body]
|
368
|
+
else
|
369
|
+
return @app.call(env)
|
370
|
+
end
|
371
|
+
|
372
|
+
return @app.call(env)
|
373
|
+
end
|
374
|
+
end
|
347
375
|
|
348
376
|
class << self
|
349
377
|
attr :__auth__, true #:nodoc:
|
@@ -371,7 +399,18 @@ module Capcode
|
|
371
399
|
meta_def(:__urls__) {
|
372
400
|
routes_paths = ['/'+self.to_s.gsub( /^Capcode::/, "" ).underscore] if create_path == true
|
373
401
|
# < Route '/hello/world/([^\/]*)/id(\d*)', '/hello/(.*)', :agent => /Songbird (\d\.\d)[\d\/]*?/
|
374
|
-
# # => [ {
|
402
|
+
# # => [ {
|
403
|
+
# '/hello/world' => {
|
404
|
+
# :regexp => '([^\/]*)/id(\d*)',
|
405
|
+
# :route => '/hello/world/([^\/]*)/id(\d*)',
|
406
|
+
# :nargs => 2
|
407
|
+
# },
|
408
|
+
# '/hello/world' => {
|
409
|
+
# :regexp => '(.*)',
|
410
|
+
# :route => '/hello/(.*)',
|
411
|
+
# :nargs => 1
|
412
|
+
# }
|
413
|
+
# },
|
375
414
|
# 2,
|
376
415
|
# <Capcode::Klass>,
|
377
416
|
# {:agent => /Songbird (\d\.\d)[\d\/]*?/} ]
|
@@ -382,13 +421,23 @@ module Capcode
|
|
382
421
|
m = /\/([^\/]*\(.*)/.match( current_route_path )
|
383
422
|
if m.nil?
|
384
423
|
raise Capcode::RouteError, "Route `#{current_route_path}' already defined with regexp `#{hash_of_routes[current_route_path]}' !", caller if hash_of_routes.keys.include?(current_route_path)
|
385
|
-
hash_of_routes[current_route_path] =
|
424
|
+
hash_of_routes[current_route_path] = {
|
425
|
+
:regexp => '',
|
426
|
+
:route => current_route_path,
|
427
|
+
:nargs => 0
|
428
|
+
}
|
386
429
|
else
|
387
430
|
_pre = m.pre_match
|
388
431
|
_pre = "/" if _pre.size == 0
|
389
432
|
raise Capcode::RouteError, "Route `#{_pre}' already defined with regexp `#{hash_of_routes[_pre]}' !", caller if hash_of_routes.keys.include?(_pre)
|
390
|
-
|
391
|
-
|
433
|
+
captures_for_routes = Regexp.new(m.captures[0]).number_of_captures
|
434
|
+
|
435
|
+
hash_of_routes[_pre] = {
|
436
|
+
:regexp => m.captures[0],
|
437
|
+
:route => current_route_path,
|
438
|
+
:nargs => captures_for_routes
|
439
|
+
}
|
440
|
+
max_captures_for_routes = captures_for_routes if max_captures_for_routes < captures_for_routes
|
392
441
|
end
|
393
442
|
else
|
394
443
|
raise Capcode::ParameterError, "Bad route declaration !", caller
|
@@ -453,40 +502,40 @@ module Capcode
|
|
453
502
|
}
|
454
503
|
end
|
455
504
|
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
505
|
+
max_match_size = self.class.__urls__[1]
|
506
|
+
match_distance = self.class.__urls__[1]
|
507
|
+
|
508
|
+
result_route = nil
|
509
|
+
result_nargs = nil
|
510
|
+
result_args = []
|
511
|
+
|
512
|
+
self.class.__urls__[0].each do |route, data|
|
513
|
+
regexp = Regexp.new("^"+data[:route]+"$")
|
514
|
+
|
515
|
+
matching = regexp.match(@request.path)
|
516
|
+
next if matching.nil?
|
517
|
+
|
518
|
+
result_args = matching.to_a
|
519
|
+
result_args.shift
|
520
|
+
match_size = matching.size - 1
|
521
|
+
|
522
|
+
if match_size == max_match_size
|
523
|
+
# OK Terminé
|
524
|
+
result_route = data[:route]
|
525
|
+
result_nargs = data[:nargs]
|
526
|
+
|
527
|
+
break
|
528
|
+
elsif max_match_size > match_size and match_distance > max_match_size - match_size
|
529
|
+
match_distance = max_match_size - match_size
|
530
|
+
|
531
|
+
result_route = data[:route]
|
532
|
+
result_nargs = data[:nargs]
|
471
533
|
end
|
472
534
|
end
|
473
535
|
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
nargs = self.class.__urls__[1]
|
479
|
-
regexp = Regexp.new( self.class.__urls__[0][finalPath] )
|
480
|
-
args = regexp.match( Rack::Utils.unescape(@request.path).gsub( Regexp.new( "^#{finalPath}" ), "" ).gsub( /^\//, "" ) )
|
481
|
-
if args.nil?
|
482
|
-
raise Capcode::ParameterError, "Path info `#{@request.path_info}' does not match route regexp `#{regexp.source}'"
|
483
|
-
else
|
484
|
-
args = args.captures.map { |x| (x.size == 0)?nil:x }
|
485
|
-
end
|
486
|
-
|
487
|
-
while args.size < nargs
|
488
|
-
args << nil
|
489
|
-
end
|
536
|
+
return [404, {'Content-Type' => 'text/plain'}, "Not Found: #{@request.path}"] if result_route.nil?
|
537
|
+
|
538
|
+
result_args = result_args + Array.new(max_match_size - result_nargs)
|
490
539
|
|
491
540
|
filter_output = Capcode::Filter.execute( self )
|
492
541
|
|
@@ -504,9 +553,11 @@ module Capcode
|
|
504
553
|
begin
|
505
554
|
_method = params.delete( "_method" ) { |_| @env["REQUEST_METHOD"] }
|
506
555
|
if self.class.method_defined?( _method.downcase.to_sym )
|
507
|
-
send( _method.downcase.to_sym, *args )
|
556
|
+
# send( _method.downcase.to_sym, *args )
|
557
|
+
send( _method.downcase.to_sym, *result_args )
|
508
558
|
else
|
509
|
-
any( *args )
|
559
|
+
# any( *args )
|
560
|
+
any( *result_args )
|
510
561
|
end
|
511
562
|
rescue => e
|
512
563
|
raise e.class, e.to_s
|
@@ -614,6 +665,7 @@ module Capcode
|
|
614
665
|
"Views",
|
615
666
|
"ParameterError",
|
616
667
|
"HTTPError",
|
668
|
+
"StaticFiles",
|
617
669
|
"Configuration",
|
618
670
|
"MissingLibrary",
|
619
671
|
"Route",
|
@@ -624,9 +676,7 @@ module Capcode
|
|
624
676
|
if eval "Capcode::#{k}.public_methods(true).include?( '__urls__' )"
|
625
677
|
hash_of_routes, max_captures_for_routes, klass = eval "Capcode::#{k}.__urls__"
|
626
678
|
hash_of_routes.keys.each do |current_route_path|
|
627
|
-
#raise Capcode::RouteError, "Route `#{current_route_path}' already define !", caller if @@__ROUTES.keys.include?(current_route_path)
|
628
679
|
raise Capcode::RouteError, "Route `#{current_route_path}' already define !", caller if Capcode.routes.keys.include?(current_route_path)
|
629
|
-
# Capcode.routes[current_route_path] = klass.new
|
630
680
|
Capcode.routes[current_route_path] = klass
|
631
681
|
end
|
632
682
|
end
|
@@ -651,6 +701,7 @@ module Capcode
|
|
651
701
|
) unless Capcode::Configuration.get(:static).nil?
|
652
702
|
puts "** Initialize session" if Capcode::Configuration.get(:verbose)
|
653
703
|
app = Rack::Session::Cookie.new( app, Capcode::Configuration.get(:session) )
|
704
|
+
app = Capcode::StaticFiles.new(app)
|
654
705
|
app = Capcode::HTTPError.new(app)
|
655
706
|
app = Rack::ContentLength.new(app)
|
656
707
|
app = Rack::Lint.new(app)
|
@@ -818,6 +869,10 @@ module Capcode
|
|
818
869
|
require 'rainbows'
|
819
870
|
puts "** Starting Rainbow on #{Capcode::Configuration.get(:host)}:#{Capcode::Configuration.get(:port)}"
|
820
871
|
Rainbows.run( app, {:listeners => ["#{Capcode::Configuration.get(:host)}:#{Capcode::Configuration.get(:port)}"]} )
|
872
|
+
when "control_tower"
|
873
|
+
require 'control_tower'
|
874
|
+
puts "** Starting ControlTower on #{Capcode::Configuration.get(:host)}:#{Capcode::Configuration.get(:port)}"
|
875
|
+
ControlTower::Server.new( app, {:host => Capcode::Configuration.get(:host), :port => Capcode::Configuration.get(:port)} ).start
|
821
876
|
end
|
822
877
|
end
|
823
878
|
end
|