mongrel_esi 0.5.1 → 0.5.2
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 +10 -9
- data/doc/rdoc/classes/ESI/Cache.html +10 -10
- data/doc/rdoc/classes/ESI/Cache.src/{M000085.html → M000087.html} +0 -0
- data/doc/rdoc/classes/ESI/Cache.src/{M000086.html → M000088.html} +0 -0
- data/doc/rdoc/classes/ESI/Config.html +43 -62
- data/doc/rdoc/classes/ESI/Config.src/M000049.html +18 -0
- data/doc/rdoc/classes/ESI/Config.src/{M000059.html → M000050.html} +5 -5
- data/doc/rdoc/classes/ESI/Config.src/M000051.html +35 -0
- data/doc/rdoc/classes/ESI/Config.src/M000052.html +27 -5
- data/doc/rdoc/classes/ESI/Config.src/M000053.html +10 -5
- data/doc/rdoc/classes/ESI/Config.src/M000054.html +5 -22
- data/doc/rdoc/classes/ESI/Config.src/M000055.html +7 -25
- data/doc/rdoc/classes/ESI/Config.src/M000056.html +11 -10
- data/doc/rdoc/classes/ESI/Config/CacheConfig.html +25 -25
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/{M000068.html → M000060.html} +6 -5
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/{M000065.html → M000061.html} +5 -5
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/{M000066.html → M000062.html} +4 -4
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/{M000067.html → M000063.html} +4 -4
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000064.html +5 -6
- data/doc/rdoc/classes/ESI/Config/ConfigRouter.html +15 -15
- data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/{M000061.html → M000057.html} +5 -5
- data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/{M000062.html → M000058.html} +7 -7
- data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/{M000063.html → M000059.html} +7 -7
- data/doc/rdoc/classes/ESI/Dispatcher.html +17 -15
- data/doc/rdoc/classes/ESI/Dispatcher.src/{M000087.html → M000092.html} +4 -7
- data/doc/rdoc/classes/ESI/Dispatcher.src/M000093.html +27 -0
- data/doc/rdoc/classes/ESI/Fragment.html +15 -15
- data/doc/rdoc/classes/ESI/Fragment.src/{M000100.html → M000111.html} +0 -0
- data/doc/rdoc/classes/ESI/Fragment.src/{M000101.html → M000112.html} +0 -0
- data/doc/rdoc/classes/ESI/Fragment.src/{M000102.html → M000113.html} +0 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.html +46 -46
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000037.html +24 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000038.html +22 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000039.html +19 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000040.html +10 -11
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000041.html +5 -9
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000042.html +6 -6
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000043.html +5 -10
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000044.html +5 -5
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000045.html +4 -6
- data/doc/rdoc/classes/ESI/OutputAdapter.html +204 -0
- data/doc/rdoc/classes/ESI/OutputAdapter.src/M000094.html +37 -0
- data/doc/rdoc/classes/ESI/OutputAdapter.src/M000095.html +18 -0
- data/doc/rdoc/classes/ESI/OutputAdapter.src/M000096.html +18 -0
- data/doc/rdoc/classes/ESI/OutputAdapter.src/M000097.html +18 -0
- data/doc/rdoc/classes/ESI/Parser.html +15 -15
- data/doc/rdoc/classes/ESI/Parser.src/{M000049.html → M000065.html} +0 -0
- data/doc/rdoc/classes/ESI/Parser.src/{M000050.html → M000066.html} +0 -0
- data/doc/rdoc/classes/ESI/Parser.src/{M000051.html → M000067.html} +0 -0
- data/doc/rdoc/classes/ESI/Processor.html +15 -15
- data/doc/rdoc/classes/ESI/Processor.src/{M000037.html → M000046.html} +0 -0
- data/doc/rdoc/classes/ESI/Processor.src/{M000038.html → M000047.html} +1 -1
- data/doc/rdoc/classes/ESI/Processor.src/{M000039.html → M000048.html} +0 -0
- data/doc/rdoc/classes/ESI/Proxy.html +48 -48
- data/doc/rdoc/classes/ESI/Proxy.src/M000071.html +7 -40
- data/doc/rdoc/classes/ESI/Proxy.src/M000072.html +50 -12
- data/doc/rdoc/classes/ESI/Proxy.src/M000073.html +49 -6
- data/doc/rdoc/classes/ESI/Proxy.src/M000074.html +11 -14
- data/doc/rdoc/classes/ESI/Proxy.src/M000075.html +6 -5
- data/doc/rdoc/classes/ESI/Proxy.src/M000076.html +9 -15
- data/doc/rdoc/classes/ESI/Proxy.src/M000077.html +5 -16
- data/doc/rdoc/classes/ESI/Proxy.src/M000078.html +28 -0
- data/doc/rdoc/classes/ESI/Proxy.src/M000079.html +29 -0
- data/doc/rdoc/classes/ESI/RackAdapter.html +214 -0
- data/doc/rdoc/classes/ESI/RackAdapter.src/M000068.html +18 -0
- data/doc/rdoc/classes/ESI/RackAdapter.src/M000069.html +34 -0
- data/doc/rdoc/classes/ESI/{MemcachedCache.src/M000048.html → RackAdapter.src/M000070.html} +4 -4
- data/doc/rdoc/classes/ESI/RackConfig.html +173 -0
- data/doc/rdoc/classes/ESI/RackConfig.src/M000089.html +28 -0
- data/doc/rdoc/classes/ESI/RackConfig.src/M000090.html +18 -0
- data/doc/rdoc/classes/ESI/RackConfig.src/M000091.html +20 -0
- data/doc/rdoc/classes/ESI/Request.html +158 -0
- data/doc/rdoc/classes/ESI/{MemcachedCache.src/M000046.html → Request.src/M000098.html} +5 -5
- data/doc/rdoc/classes/ESI/Request.src/M000099.html +18 -0
- data/doc/rdoc/classes/ESI/Response.html +36 -36
- data/doc/rdoc/classes/ESI/Response.src/M000080.html +10 -8
- data/doc/rdoc/classes/ESI/Response.src/M000081.html +5 -7
- data/doc/rdoc/classes/ESI/Response.src/M000082.html +8 -12
- data/doc/rdoc/classes/ESI/Response.src/M000083.html +7 -5
- data/doc/rdoc/classes/ESI/Response.src/M000084.html +12 -20
- data/doc/rdoc/classes/ESI/Response.src/{M000079.html → M000085.html} +5 -5
- data/doc/rdoc/classes/ESI/Response.src/M000086.html +33 -0
- data/doc/rdoc/classes/ESI/Router.html +10 -10
- data/doc/rdoc/classes/ESI/Router.src/{M000098.html → M000109.html} +0 -0
- data/doc/rdoc/classes/ESI/Router.src/{M000099.html → M000110.html} +0 -0
- data/doc/rdoc/classes/ESI/RubyCache.html +45 -45
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000089.html → M000100.html} +6 -6
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000090.html → M000101.html} +6 -6
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000091.html → M000102.html} +6 -6
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000092.html → M000103.html} +8 -8
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000093.html → M000104.html} +4 -4
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000094.html → M000105.html} +8 -8
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000095.html → M000106.html} +4 -4
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000096.html → M000107.html} +4 -4
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000097.html → M000108.html} +4 -4
- data/doc/rdoc/classes/ESI/Tag.html +8 -8
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/COPYING.html +1 -1
- data/doc/rdoc/files/LICENSE.html +1 -1
- data/doc/rdoc/files/README.html +12 -10
- data/doc/rdoc/files/ext/esi/common_rl.html +1 -1
- data/doc/rdoc/files/ext/esi/esi_parser_c.html +1 -1
- data/doc/rdoc/files/ext/esi/parser_c.html +1 -1
- data/doc/rdoc/files/ext/esi/parser_h.html +1 -1
- data/doc/rdoc/files/ext/esi/parser_rl.html +122 -82
- data/doc/rdoc/files/ext/esi/test/test_c.html +1 -1
- data/doc/rdoc/files/lib/esi/cache_rb.html +2 -1
- data/doc/rdoc/files/lib/esi/config_rb.html +2 -1
- data/doc/rdoc/files/lib/esi/dispatcher_rb.html +3 -1
- data/doc/rdoc/files/lib/esi/invalidator_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/logger_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/parser_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/processor_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/proxy_rb.html +2 -2
- data/doc/rdoc/files/{ext/esi/test/parser_c.html → lib/esi/rack_adapter_rb.html} +21 -5
- data/doc/rdoc/files/lib/esi/response_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/router_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/tag/attempt_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/tag/base_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/tag/container_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/tag/except_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/tag/include_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/tag/invalidate_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/tag/try_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/version_rb.html +1 -1
- data/doc/rdoc/files/lib/multi_dirhandler_rb.html +1 -1
- data/doc/rdoc/fr_class_index.html +4 -0
- data/doc/rdoc/fr_file_index.html +1 -5
- data/doc/rdoc/fr_method_index.html +87 -76
- data/ext/esi/esi_parser.c +2 -2
- data/ext/esi/parser.c +133 -107
- data/ext/esi/parser.h +9 -4
- data/ext/esi/parser.rl +99 -73
- data/ext/esi/test/test.c +11 -6
- data/lib/esi/cache.rb +7 -3
- data/lib/esi/config.rb +4 -8
- data/lib/esi/dispatcher.rb +14 -5
- data/lib/esi/processor.rb +1 -1
- data/lib/esi/proxy.rb +58 -48
- data/lib/esi/rack_adapter.rb +97 -0
- data/lib/esi/response.rb +30 -1
- data/lib/esi/version.rb +1 -1
- data/test/bench-plot.rb +31 -0
- data/test/benchmarks/csv-perf-serial0.4 +101 -0
- data/test/benchmarks/csv-perf-trunk +101 -0
- data/test/benchmarks/perf-serial0.4-n1000-c1.csv +101 -0
- data/test/benchmarks/perf-serial0.4-n1000-c2.csv +101 -0
- data/test/benchmarks/perf-serial0.4-n1000-c3.csv +101 -0
- data/test/benchmarks/perf-serial0.4-n1000-c4.csv +101 -0
- data/test/benchmarks/perf-serial0.4-n1000-c5.csv +101 -0
- data/test/benchmarks/perf-serial0.4-n1000-c6.csv +101 -0
- data/test/benchmarks/perf-serial0.4-n1000-c7.csv +101 -0
- data/test/benchmarks/perf-trunk-n1000-c1.csv +101 -0
- data/test/benchmarks/perf-trunk-n1000-c2.csv +101 -0
- data/test/benchmarks/perf-trunk-n1000-c3.csv +101 -0
- data/test/benchmarks/perf-trunk-n1000-c4.csv +101 -0
- data/test/benchmarks/perf-trunk-n1000-c5.csv +101 -0
- data/test/benchmarks/perf-trunk-n1000-c6.csv +101 -0
- data/test/benchmarks/perf-trunk-n1000-c7.csv +101 -0
- data/test/load_test.rb +5 -2
- data/test/load_test_ab.rb +9 -4
- metadata +261 -227
- data/doc/rdoc/classes/ESI/Config.src/M000057.html +0 -18
- data/doc/rdoc/classes/ESI/Config.src/M000058.html +0 -20
- data/doc/rdoc/classes/ESI/Config.src/M000060.html +0 -24
- data/doc/rdoc/classes/ESI/Dispatcher.src/M000088.html +0 -18
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000047.html +0 -18
- data/doc/rdoc/classes/ESI/Proxy.src/M000069.html +0 -20
- data/doc/rdoc/classes/ESI/Proxy.src/M000070.html +0 -55
- data/doc/rdoc/classes/ESI/Response.src/M000078.html +0 -23
- data/doc/rdoc/files/ext/esi/test/common_rl.html +0 -160
- data/doc/rdoc/files/ext/esi/test/parser_h.html +0 -101
- data/doc/rdoc/files/ext/esi/test/parser_rl.html +0 -827
- data/doc/rdoc/files/ext/esi/test/sp_c.html +0 -101
- data/ext/esi/test/common.rl +0 -46
- data/ext/esi/test/parser.c +0 -1875
- data/ext/esi/test/parser.h +0 -120
- data/ext/esi/test/parser.rl +0 -585
- data/ext/esi/test/sp.c +0 -125
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
11
|
</head>
|
|
12
12
|
<body class="standalone-code">
|
|
13
|
-
<pre> <span class="ruby-comment cmt"># File lib/esi/cache.rb, line
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
<pre> <span class="ruby-comment cmt"># File lib/esi/cache.rb, line 194</span>
|
|
14
|
+
194: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sweep!</span>
|
|
15
|
+
195: <span class="ruby-ivar">@semaphore</span>.<span class="ruby-identifier">synchronize</span> { <span class="ruby-identifier">sweep_unlocked!</span> }
|
|
16
|
+
196: <span class="ruby-keyword kw">end</span></pre>
|
|
17
17
|
</body>
|
|
18
18
|
</html>
|
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
11
|
</head>
|
|
12
12
|
<body class="standalone-code">
|
|
13
|
-
<pre> <span class="ruby-comment cmt"># File lib/esi/cache.rb, line
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
<pre> <span class="ruby-comment cmt"># File lib/esi/cache.rb, line 198</span>
|
|
14
|
+
198: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">keys</span>(<span class="ruby-operator">&</span><span class="ruby-identifier">block</span>)
|
|
15
|
+
199: <span class="ruby-ivar">@semaphore</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
|
|
16
|
+
200: <span class="ruby-ivar">@cache</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span><span class="ruby-operator">|</span><span class="ruby-identifier">key</span>,<span class="ruby-identifier">data</span><span class="ruby-operator">|</span>
|
|
17
|
+
201: <span class="ruby-keyword kw">yield</span> <span class="ruby-identifier">key</span>, <span class="ruby-identifier">data</span>
|
|
18
|
+
202: <span class="ruby-keyword kw">end</span>
|
|
19
|
+
203: <span class="ruby-keyword kw">end</span>
|
|
20
|
+
204: <span class="ruby-keyword kw">end</span></pre>
|
|
21
21
|
</body>
|
|
22
22
|
</html>
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
11
|
</head>
|
|
12
12
|
<body class="standalone-code">
|
|
13
|
-
<pre> <span class="ruby-comment cmt"># File lib/esi/cache.rb, line
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
<pre> <span class="ruby-comment cmt"># File lib/esi/cache.rb, line 206</span>
|
|
14
|
+
206: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">delete</span>( <span class="ruby-identifier">key</span> )
|
|
15
|
+
207: <span class="ruby-ivar">@semaphore</span>.<span class="ruby-identifier">synchronize</span> { <span class="ruby-ivar">@cache</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">key</span>) }
|
|
16
|
+
208: <span class="ruby-keyword kw">end</span></pre>
|
|
17
17
|
</body>
|
|
18
18
|
</html>
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
11
|
</head>
|
|
12
12
|
<body class="standalone-code">
|
|
13
|
-
<pre> <span class="ruby-comment cmt"># File lib/esi/cache.rb, line
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
<pre> <span class="ruby-comment cmt"># File lib/esi/cache.rb, line 210</span>
|
|
14
|
+
210: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">delete_unlocked</span>( <span class="ruby-identifier">key</span> )
|
|
15
|
+
211: <span class="ruby-ivar">@cache</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">key</span>)
|
|
16
|
+
212: <span class="ruby-keyword kw">end</span></pre>
|
|
17
17
|
</body>
|
|
18
18
|
</html>
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
11
|
</head>
|
|
12
12
|
<body class="standalone-code">
|
|
13
|
-
<pre> <span class="ruby-comment cmt"># File lib/esi/cache.rb, line
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
<pre> <span class="ruby-comment cmt"># File lib/esi/cache.rb, line 214</span>
|
|
14
|
+
214: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sweep_unlocked!</span>
|
|
15
|
+
215: <span class="ruby-ivar">@cache</span>.<span class="ruby-identifier">reject!</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-operator">!</span><span class="ruby-identifier">v</span>.<span class="ruby-identifier">valid?</span> }
|
|
16
|
+
216: <span class="ruby-keyword kw">end</span></pre>
|
|
17
17
|
</body>
|
|
18
18
|
</html>
|
|
@@ -59,29 +59,29 @@
|
|
|
59
59
|
lib/esi/tag/attempt.rb
|
|
60
60
|
</a>
|
|
61
61
|
<br />
|
|
62
|
-
<a href="../../files/lib/esi/tag/
|
|
63
|
-
lib/esi/tag/
|
|
62
|
+
<a href="../../files/lib/esi/tag/invalidate_rb.html">
|
|
63
|
+
lib/esi/tag/invalidate.rb
|
|
64
64
|
</a>
|
|
65
65
|
<br />
|
|
66
66
|
<a href="../../files/lib/esi/tag/container_rb.html">
|
|
67
67
|
lib/esi/tag/container.rb
|
|
68
68
|
</a>
|
|
69
|
-
<br />
|
|
70
|
-
<a href="../../files/lib/esi/tag/except_rb.html">
|
|
71
|
-
lib/esi/tag/except.rb
|
|
72
|
-
</a>
|
|
73
69
|
<br />
|
|
74
70
|
<a href="../../files/lib/esi/tag/include_rb.html">
|
|
75
71
|
lib/esi/tag/include.rb
|
|
76
72
|
</a>
|
|
77
73
|
<br />
|
|
78
|
-
<a href="../../files/lib/esi/tag/
|
|
79
|
-
lib/esi/tag/
|
|
74
|
+
<a href="../../files/lib/esi/tag/base_rb.html">
|
|
75
|
+
lib/esi/tag/base.rb
|
|
80
76
|
</a>
|
|
81
77
|
<br />
|
|
82
78
|
<a href="../../files/lib/esi/tag/try_rb.html">
|
|
83
79
|
lib/esi/tag/try.rb
|
|
84
80
|
</a>
|
|
81
|
+
<br />
|
|
82
|
+
<a href="../../files/lib/esi/tag/except_rb.html">
|
|
83
|
+
lib/esi/tag/except.rb
|
|
84
|
+
</a>
|
|
85
85
|
<br />
|
|
86
86
|
</td>
|
|
87
87
|
</tr>
|
data/doc/rdoc/created.rid
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Mon,
|
|
1
|
+
Mon, 23 Jun 2008 16:57:11 -0400
|
data/doc/rdoc/files/COPYING.html
CHANGED
data/doc/rdoc/files/LICENSE.html
CHANGED
data/doc/rdoc/files/README.html
CHANGED
|
@@ -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 Jun 23 15:57:40 -0400 2008</td>
|
|
60
60
|
</tr>
|
|
61
61
|
</table>
|
|
62
62
|
</div>
|
|
@@ -71,7 +71,8 @@
|
|
|
71
71
|
<div id="description">
|
|
72
72
|
<h1>About</h1>
|
|
73
73
|
<p>
|
|
74
|
-
|
|
74
|
+
mongrel-esi is meant to make caching easier by distributing the cache
|
|
75
|
+
logic.
|
|
75
76
|
</p>
|
|
76
77
|
<p>
|
|
77
78
|
The idea is to represent each part of the page as a unique URL.
|
|
@@ -87,7 +88,8 @@ basic instructions
|
|
|
87
88
|
esi:include:
|
|
88
89
|
</p>
|
|
89
90
|
<pre>
|
|
90
|
-
src
|
|
91
|
+
src - request path, response replaces esi:include tag
|
|
92
|
+
alt - if src is unavailable, use alt
|
|
91
93
|
timeout - how long to wait on the response
|
|
92
94
|
max-age - how long to cache the entity
|
|
93
95
|
onerror - whether continue on errors or trigger an exception
|
|
@@ -123,8 +125,8 @@ esi:try/esi:attempt/esi:except
|
|
|
123
125
|
</pre>
|
|
124
126
|
<h1>Proxy Config</h1>
|
|
125
127
|
<p>
|
|
126
|
-
|
|
127
|
-
modify the config/routes.yml file.
|
|
128
|
+
mongrel-esi is a proxy server. To configure where requests should be
|
|
129
|
+
proxied modify the config/routes.yml file.
|
|
128
130
|
</p>
|
|
129
131
|
<p>
|
|
130
132
|
Here‘s an example:
|
|
@@ -191,7 +193,7 @@ which will respond with:
|
|
|
191
193
|
<div>hello User42</div>
|
|
192
194
|
</p>
|
|
193
195
|
<p>
|
|
194
|
-
And finally,
|
|
196
|
+
And finally, mongrel-esi will respond to the original client request with
|
|
195
197
|
the combined documents: <html> <head><title>Your
|
|
196
198
|
Page</title> </head> <body> <div
|
|
197
199
|
class="header"><div>hello User42</div></div>
|
|
@@ -200,7 +202,7 @@ content</div> </body> </html>
|
|
|
200
202
|
</p>
|
|
201
203
|
<h2>Integrating with your applications</h2>
|
|
202
204
|
<p>
|
|
203
|
-
|
|
205
|
+
mongrel-esi was built to support integrating lots of applications together.
|
|
204
206
|
</p>
|
|
205
207
|
<p>
|
|
206
208
|
Primarily, you‘ll want to integrate by having one base application
|
|
@@ -212,14 +214,14 @@ part of the page, while rails delivers a reliable listing of current forum
|
|
|
212
214
|
discussion, and maybe a python presense indicator for forum posts…
|
|
213
215
|
</p>
|
|
214
216
|
<p>
|
|
215
|
-
One thing to keep in mind is mongrel
|
|
217
|
+
One thing to keep in mind is mongrel-esi is a proxy server. This means for
|
|
216
218
|
each request it needs to know where to route the requests. To support this
|
|
217
219
|
config.rb can express any regex to match a url and determine where a
|
|
218
220
|
request should be forwarded as well as defining a default route.
|
|
219
221
|
</p>
|
|
220
222
|
<p>
|
|
221
223
|
It is also sometimes convenient to allow multiple applications to store or
|
|
222
|
-
house static content. For this to work mongrel
|
|
224
|
+
house static content. For this to work mongrel-esi needs to know in what
|
|
223
225
|
directories to search for static files. This can be done by using the <a
|
|
224
226
|
href="../classes/MultiDirHandler.html">MultiDirHandler</a> (see
|
|
225
227
|
rev-config.rb)
|
|
@@ -230,7 +232,7 @@ From [<a href="http://www.w3.org/TR/esi-lang">www.w3.org/TR/esi-lang</a>
|
|
|
230
232
|
esi-lang]
|
|
231
233
|
</p>
|
|
232
234
|
<p>
|
|
233
|
-
|
|
235
|
+
mongrel-esi supports basic include, exception handling and invalidation. It
|
|
234
236
|
does not include support for Variable or Conditional processing. It does
|
|
235
237
|
have suppport for COOKIE variables. (e.g. $(HTTP_COOKIE{name}) will be
|
|
236
238
|
replaced with the value of the cookie, name)
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
</tr>
|
|
57
57
|
<tr class="top-aligned-row">
|
|
58
58
|
<td><strong>Last Update:</strong></td>
|
|
59
|
-
<td>Mon Jun
|
|
59
|
+
<td>Mon Jun 23 15:57:37 -0400 2008</td>
|
|
60
60
|
</tr>
|
|
61
61
|
</table>
|
|
62
62
|
</div>
|
|
@@ -156,6 +156,24 @@ static void esi_parser_echo_char( ESIParser *parser, char ch ) {
|
|
|
156
156
|
}
|
|
157
157
|
</pre>
|
|
158
158
|
<p>
|
|
159
|
+
} static void esi_parser_send_buffer( ESIParser *parser, const char *seq,
|
|
160
|
+
size_t len ) {
|
|
161
|
+
</p>
|
|
162
|
+
<pre>
|
|
163
|
+
const char *nseq = seq + len;
|
|
164
|
+
size_t nlen = parser->output_buffer_size + len;
|
|
165
|
+
|
|
166
|
+
if( nlen < ESI_OUTPUT_BUFFER_SIZE ) {
|
|
167
|
+
memcpy( parser->output_buffer + parser->output_buffer_size, seq, len );
|
|
168
|
+
parser->output_buffer_size += len;
|
|
169
|
+
}
|
|
170
|
+
else if( nlen > ESI_OUTPUT_BUFFER_SIZE ) {
|
|
171
|
+
while( seq != nseq ) {
|
|
172
|
+
esi_parser_echo_char( parser, *seq++ );
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
</pre>
|
|
176
|
+
<p>
|
|
159
177
|
} /* send any buffered characters to the output handler.
|
|
160
178
|
</p>
|
|
161
179
|
<pre>
|
|
@@ -210,6 +228,7 @@ static void esi_parser_concat_to_echobuffer( ESIParser *parser, char ch ) {
|
|
|
210
228
|
/* double the echobuffer size
|
|
211
229
|
* we're getting some crazy input if this case ever happens
|
|
212
230
|
*/
|
|
231
|
+
printf( "increase echobuffer: %d, %s\n", parser->echobuffer_allocated, parser->echobuffer );
|
|
213
232
|
parser->echobuffer_allocated *= 2;
|
|
214
233
|
parser->echobuffer = (char*)realloc( parser->echobuffer, parser->echobuffer_allocated );
|
|
215
234
|
}
|
|
@@ -299,9 +318,8 @@ static void rtrim_pointer( const char **ptr, const char *bounds, size_t
|
|
|
299
318
|
/* send the start tag and end tag message */
|
|
300
319
|
esi_parser_flush_output( parser );
|
|
301
320
|
parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->attributes, parser->user_data );
|
|
302
|
-
esi_parser_flush_output( parser );
|
|
303
321
|
parser->end_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->user_data );
|
|
304
|
-
|
|
322
|
+
//printf("\t[see inline tag]\n");
|
|
305
323
|
|
|
306
324
|
/* mark the position */
|
|
307
325
|
parser->tag_text = NULL;
|
|
@@ -321,7 +339,7 @@ static void rtrim_pointer( const char **ptr, const char *bounds, size_t
|
|
|
321
339
|
/* send the start and end tag message */
|
|
322
340
|
esi_parser_flush_output( parser );
|
|
323
341
|
parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->attributes, parser->user_data );
|
|
324
|
-
|
|
342
|
+
//printf("\t[see start tag with attributes]\n");
|
|
325
343
|
|
|
326
344
|
parser->tag_text = NULL;
|
|
327
345
|
parser->tag_text_length = 0;
|
|
@@ -387,7 +405,7 @@ static void rtrim_pointer( const char **ptr, const char *bounds, size_t
|
|
|
387
405
|
|
|
388
406
|
esi_parser_flush_output( parser );
|
|
389
407
|
parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, NULL, parser->user_data );
|
|
390
|
-
|
|
408
|
+
//printf("\t[see start tag]\n");
|
|
391
409
|
|
|
392
410
|
esi_parser_echobuffer_clear( parser );
|
|
393
411
|
}
|
|
@@ -405,7 +423,7 @@ static void rtrim_pointer( const char **ptr, const char *bounds, size_t
|
|
|
405
423
|
|
|
406
424
|
esi_parser_flush_output( parser );
|
|
407
425
|
parser->end_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->user_data );
|
|
408
|
-
|
|
426
|
+
//printf("\t[see end tag]\n");
|
|
409
427
|
|
|
410
428
|
esi_parser_echobuffer_clear( parser );
|
|
411
429
|
}
|
|
@@ -463,8 +481,10 @@ const char *value, size_t value_length ) {
|
|
|
463
481
|
</p>
|
|
464
482
|
<pre>
|
|
465
483
|
ESIAttribute *attr = (ESIAttribute*)malloc(sizeof(ESIAttribute));
|
|
466
|
-
attr->name = esi_strndup(name, name_length);
|
|
467
|
-
attr->value = esi_strndup(value, value_length);
|
|
484
|
+
attr->name = name;//esi_strndup(name, name_length);
|
|
485
|
+
attr->value = value;//esi_strndup(value, value_length);
|
|
486
|
+
attr->name_length = name_length;
|
|
487
|
+
attr->value_length = value_length;
|
|
468
488
|
attr->next = NULL;
|
|
469
489
|
return attr;
|
|
470
490
|
</pre>
|
|
@@ -479,16 +499,16 @@ ESIAttribute *esi_attribute_copy( ESIAttribute *attribute ) {
|
|
|
479
499
|
if( !attribute ){ return NULL; }
|
|
480
500
|
|
|
481
501
|
// copy the first attribute
|
|
482
|
-
nattr = esi_attribute_new( attribute->name,
|
|
483
|
-
attribute->value,
|
|
502
|
+
nattr = esi_attribute_new( attribute->name, attribute->name_length,
|
|
503
|
+
attribute->value, attribute->value_length );
|
|
484
504
|
// save a pointer for return
|
|
485
505
|
head = nattr;
|
|
486
506
|
// copy next attributes
|
|
487
507
|
attribute = attribute->next;
|
|
488
508
|
while( attribute ) {
|
|
489
509
|
// set the next attribute
|
|
490
|
-
nattr->next = esi_attribute_new( attribute->name,
|
|
491
|
-
attribute->value,
|
|
510
|
+
nattr->next = esi_attribute_new( attribute->name, attribute->name_length,
|
|
511
|
+
attribute->value, attribute->value_length );
|
|
492
512
|
// next attribute
|
|
493
513
|
nattr = nattr->next;
|
|
494
514
|
attribute = attribute->next;
|
|
@@ -504,8 +524,11 @@ void esi_attribute_free( ESIAttribute *attribute ) {
|
|
|
504
524
|
<pre>
|
|
505
525
|
ESIAttribute *ptr;
|
|
506
526
|
while( attribute ){
|
|
507
|
-
|
|
508
|
-
|
|
527
|
+
</pre>
|
|
528
|
+
<p>
|
|
529
|
+
// free( attribute->name ); // free( attribute->value );
|
|
530
|
+
</p>
|
|
531
|
+
<pre>
|
|
509
532
|
ptr = attribute->next;
|
|
510
533
|
free( attribute );
|
|
511
534
|
attribute = ptr;
|
|
@@ -526,9 +549,11 @@ ESIParser *esi_parser_new() {
|
|
|
526
549
|
parser->attr_value = NULL;
|
|
527
550
|
parser->overflow_data_size = 0;
|
|
528
551
|
parser->overflow_data = NULL;
|
|
552
|
+
parser->overflow_data_allocated = 0;
|
|
553
|
+
parser->using_overflow = 0;
|
|
529
554
|
|
|
530
555
|
/* allocate ESI_OUTPUT_BUFFER_SIZE bytes for the echobuffer */
|
|
531
|
-
parser->echobuffer_allocated =
|
|
556
|
+
parser->echobuffer_allocated = ESI_ECHOBUFFER_SIZE;
|
|
532
557
|
parser->echobuffer_index = -1;
|
|
533
558
|
parser->echobuffer = (char*)malloc(sizeof(char)*parser->echobuffer_allocated);
|
|
534
559
|
|
|
@@ -551,6 +576,7 @@ ESIParser *esi_parser_new() {
|
|
|
551
576
|
if( parser->overflow_data ){ free( parser->overflow_data ); }
|
|
552
577
|
|
|
553
578
|
free( parser->echobuffer );
|
|
579
|
+
|
|
554
580
|
esi_attribute_free( parser->attributes );
|
|
555
581
|
|
|
556
582
|
free( parser );
|
|
@@ -647,6 +673,69 @@ size_t length ) {
|
|
|
647
673
|
}
|
|
648
674
|
</p>
|
|
649
675
|
<p>
|
|
676
|
+
static void esi_parser_append_data_to_overflow_data( ESIParser *parser,
|
|
677
|
+
const char *data, size_t length ) {
|
|
678
|
+
</p>
|
|
679
|
+
<pre>
|
|
680
|
+
int mark_offset = 0;
|
|
681
|
+
int tag_text_offset = 0;
|
|
682
|
+
int attr_key_offset = 0;
|
|
683
|
+
int attr_value_offset = 0;
|
|
684
|
+
|
|
685
|
+
if( parser->using_overflow ) {
|
|
686
|
+
// recompute mark, tag_text, attr_key, and attr_value as they all exist within overflow_data
|
|
687
|
+
mark_offset = compute_offset( parser->mark, parser->overflow_data );
|
|
688
|
+
tag_text_offset = compute_offset( parser->tag_text, parser->overflow_data );
|
|
689
|
+
attr_key_offset = compute_offset( parser->attr_key, parser->overflow_data );
|
|
690
|
+
attr_value_offset = compute_offset( parser->attr_value, parser->overflow_data );
|
|
691
|
+
}
|
|
692
|
+
else {
|
|
693
|
+
// recompute mark, tag_text, attr_key, and attr_value as they all exist within data
|
|
694
|
+
mark_offset = compute_offset( parser->mark, data );
|
|
695
|
+
tag_text_offset = compute_offset( parser->tag_text, data );
|
|
696
|
+
attr_key_offset = compute_offset( parser->attr_key, data );
|
|
697
|
+
attr_value_offset = compute_offset( parser->attr_value, data );
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
if( parser->overflow_data ) {
|
|
701
|
+
// check if we need to resize or grow the buffer
|
|
702
|
+
if( (parser->overflow_data_size + length) > parser->overflow_data_allocated ) {
|
|
703
|
+
parser->overflow_data_allocated += length;
|
|
704
|
+
</pre>
|
|
705
|
+
<p>
|
|
706
|
+
// printf( "realloc: %d bytes, using %d\n",
|
|
707
|
+
(int)parser->overflow_data_allocated,
|
|
708
|
+
(int)(parser->overflow_data_size+length) );
|
|
709
|
+
</p>
|
|
710
|
+
<pre>
|
|
711
|
+
parser->overflow_data = (char*)realloc( parser->overflow_data, sizeof(char)*(parser->overflow_data_allocated) );
|
|
712
|
+
}
|
|
713
|
+
memcpy( parser->overflow_data+parser->overflow_data_size, data, length );
|
|
714
|
+
parser->overflow_data_size += length;
|
|
715
|
+
}
|
|
716
|
+
else {
|
|
717
|
+
parser->overflow_data_allocated = ESI_OUTPUT_BUFFER_SIZE > length ? ESI_OUTPUT_BUFFER_SIZE : length;
|
|
718
|
+
parser->overflow_data = (char*)malloc( sizeof( char ) * parser->overflow_data_allocated );
|
|
719
|
+
memcpy( parser->overflow_data, data, length );
|
|
720
|
+
parser->overflow_data_size = length;
|
|
721
|
+
</pre>
|
|
722
|
+
<p>
|
|
723
|
+
// printf( "malloc: %d for %d bytes\n",
|
|
724
|
+
(int)parser->overflow_data_allocated, (int)length );
|
|
725
|
+
</p>
|
|
726
|
+
<pre>
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
// in our new memory space mark will now be
|
|
730
|
+
parser->mark = ( mark_offset >= 0 ) ? parser->overflow_data + mark_offset : NULL;
|
|
731
|
+
parser->tag_text = ( tag_text_offset >= 0 ) ? parser->overflow_data + tag_text_offset : NULL;
|
|
732
|
+
parser->attr_key = ( attr_key_offset >= 0 ) ? parser->overflow_data + attr_key_offset : NULL;
|
|
733
|
+
parser->attr_value = ( attr_value_offset >= 0 ) ? parser->overflow_data + attr_value_offset : NULL;
|
|
734
|
+
</pre>
|
|
735
|
+
<p>
|
|
736
|
+
}
|
|
737
|
+
</p>
|
|
738
|
+
<p>
|
|
650
739
|
/* accept an arbitrary length string buffer
|
|
651
740
|
</p>
|
|
652
741
|
<pre>
|
|
@@ -670,56 +759,31 @@ int esi_parser_execute( ESIParser *parser, const char *data, size_t length
|
|
|
670
759
|
if( length == 0 ){ return cs; }
|
|
671
760
|
|
|
672
761
|
/* scan data for any '<esi:' start sequences, /<$/, /<e$/, /<es$/, /<esi$/, /<esi:$/ */
|
|
673
|
-
if( cs == esi_start ) {
|
|
762
|
+
if( cs == esi_start || cs == 0 ) {
|
|
674
763
|
pindex = esi_parser_scan_for_start( parser, data, length );
|
|
675
|
-
if( pindex == -1 ) {
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
}
|
|
679
|
-
return cs;
|
|
764
|
+
if( pindex == -1 ) { /* this means there are no start sequences in the buffer we recieved */
|
|
765
|
+
esi_parser_send_buffer( parser, data, length );
|
|
766
|
+
return cs; /* no esi start sequences send it all out and break out early */
|
|
680
767
|
}
|
|
681
768
|
}
|
|
682
769
|
|
|
683
|
-
/* there's an existing overflow buffer
|
|
684
|
-
if( parser->overflow_data && parser->overflow_data_size > 0 ) {
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
int tag_text_offset = compute_offset( parser->tag_text, parser->overflow_data );
|
|
689
|
-
int attr_key_offset = compute_offset( parser->attr_key, parser->overflow_data );
|
|
690
|
-
int attr_value_offset = compute_offset( parser->attr_value, parser->overflow_data );
|
|
691
|
-
|
|
692
|
-
parser->overflow_data = (char*)realloc( parser->overflow_data, sizeof(char)*(parser->overflow_data_size+length) );
|
|
693
|
-
memcpy( parser->overflow_data+parser->overflow_data_size, data, length );
|
|
694
|
-
|
|
695
|
-
p = parser->overflow_data + parser->overflow_data_size;
|
|
696
|
-
|
|
697
|
-
// in our new memory space mark will now be
|
|
698
|
-
parser->mark = ( mark_offset >= 0 ) ? parser->overflow_data + mark_offset : NULL;
|
|
699
|
-
parser->tag_text = ( tag_text_offset >= 0 ) ? parser->overflow_data + tag_text_offset : NULL;
|
|
700
|
-
parser->attr_key = ( attr_key_offset >= 0 ) ? parser->overflow_data + attr_key_offset : NULL;
|
|
701
|
-
parser->attr_value = ( attr_value_offset >= 0 ) ? parser->overflow_data + attr_value_offset : NULL;
|
|
770
|
+
/* there's an existing overflow buffer and it's being used, append the new data */
|
|
771
|
+
//if( parser->overflow_data && parser->overflow_data_size > 0 ) {
|
|
772
|
+
if( parser->using_overflow ) {
|
|
773
|
+
int prev_overflow_size = parser->overflow_data_size; // save the current overflow size
|
|
774
|
+
esi_parser_append_data_to_overflow_data( parser, data, length );
|
|
702
775
|
|
|
776
|
+
/* set parser variables */
|
|
777
|
+
p = parser->overflow_data + prev_overflow_size;
|
|
703
778
|
data = parser->overflow_data;
|
|
704
|
-
|
|
705
|
-
</pre>
|
|
706
|
-
<p>
|
|
707
|
-
// printf( "grow overflow data: %ld\n",
|
|
708
|
-
parser->overflow_data_size );
|
|
709
|
-
</p>
|
|
710
|
-
<pre>
|
|
779
|
+
length = parser->overflow_data_size;
|
|
711
780
|
pe = data + length;
|
|
712
|
-
|
|
713
781
|
}
|
|
714
782
|
|
|
715
783
|
if( !parser->mark ) {
|
|
716
784
|
parser->mark = p;
|
|
717
785
|
}
|
|
718
|
-
|
|
719
|
-
<p>
|
|
720
|
-
// printf( "cs: %d, ", cs );
|
|
721
|
-
</p>
|
|
722
|
-
<pre>
|
|
786
|
+
|
|
723
787
|
%% write exec;
|
|
724
788
|
|
|
725
789
|
parser->cs = cs;
|
|
@@ -727,37 +791,13 @@ parser->overflow_data_size );
|
|
|
727
791
|
if( cs != esi_start && cs != 0 ) {
|
|
728
792
|
|
|
729
793
|
/* reached the end and we're not at a termination point save the buffer as overflow */
|
|
730
|
-
if( !parser->
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
int tag_text_offset = compute_offset( parser->tag_text, data );
|
|
734
|
-
int attr_key_offset = compute_offset( parser->attr_key, data );
|
|
735
|
-
int attr_value_offset = compute_offset( parser->attr_value, data );
|
|
736
|
-
//debug_string( "mark before move", parser->mark, 1 );
|
|
737
|
-
|
|
738
|
-
if( ESI_OUTPUT_BUFFER_SIZE > length ) {
|
|
739
|
-
parser->echobuffer_allocated = ESI_OUTPUT_BUFFER_SIZE;
|
|
740
|
-
}
|
|
741
|
-
else {
|
|
742
|
-
parser->echobuffer_allocated = length;
|
|
743
|
-
}
|
|
744
|
-
parser->overflow_data = (char*)malloc( sizeof( char ) * parser->echobuffer_allocated );
|
|
745
|
-
memcpy( parser->overflow_data, data, length );
|
|
746
|
-
parser->overflow_data_size = length;
|
|
747
|
-
//printf( "allocate overflow data: %ld\n", parser->echobuffer_allocated );
|
|
748
|
-
|
|
749
|
-
// in our new memory space mark will now be
|
|
750
|
-
parser->mark = ( mark_offset >= 0 ) ? parser->overflow_data + mark_offset : NULL;
|
|
751
|
-
parser->tag_text = ( tag_text_offset >= 0 ) ? parser->overflow_data + tag_text_offset : NULL;
|
|
752
|
-
parser->attr_key = ( attr_key_offset >= 0 ) ? parser->overflow_data + attr_key_offset : NULL;
|
|
753
|
-
parser->attr_value = ( attr_value_offset >= 0 ) ? parser->overflow_data + attr_value_offset : NULL;
|
|
754
|
-
//if( parser->mark ){ debug_string( "mark after move", parser->mark, 1 ); } else { printf( "mark is now empty\n" ); }
|
|
794
|
+
if( !parser->using_overflow ) {
|
|
795
|
+
esi_parser_append_data_to_overflow_data( parser, data, length );
|
|
796
|
+
parser->using_overflow = 1;
|
|
755
797
|
}
|
|
756
798
|
|
|
757
|
-
}else if( parser->
|
|
758
|
-
|
|
759
|
-
free( parser->overflow_data );
|
|
760
|
-
parser->overflow_data = NULL;
|
|
799
|
+
} else if ( parser->using_overflow ) {
|
|
800
|
+
parser->using_overflow = 0;
|
|
761
801
|
parser->overflow_data_size = 0;
|
|
762
802
|
}
|
|
763
803
|
|