mongrel_esi 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +8 -8
- data/Rakefile +4 -12
- data/doc/rdoc/classes/ESI.html +169 -0
- data/doc/rdoc/classes/ESI/Cache.html +178 -0
- data/doc/rdoc/classes/ESI/Cache.src/M000060.html +17 -0
- data/doc/rdoc/classes/ESI/Cache.src/M000061.html +20 -0
- data/doc/rdoc/classes/ESI/Config.html +291 -0
- data/doc/rdoc/classes/ESI/Config.src/M000043.html +18 -0
- data/doc/rdoc/classes/ESI/Config.src/M000044.html +18 -0
- data/doc/rdoc/classes/ESI/Config.src/M000045.html +35 -0
- data/doc/rdoc/classes/ESI/Config.src/M000046.html +38 -0
- data/doc/rdoc/classes/ESI/Config.src/M000047.html +23 -0
- data/doc/rdoc/classes/ESI/Config.src/M000048.html +18 -0
- data/doc/rdoc/classes/ESI/Config.src/M000049.html +20 -0
- data/doc/rdoc/classes/ESI/Config.src/M000050.html +18 -0
- data/doc/rdoc/classes/ESI/Config.src/M000051.html +24 -0
- data/doc/rdoc/classes/ESI/Config/CacheConfig.html +212 -0
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000055.html +19 -0
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000056.html +19 -0
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000057.html +18 -0
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000058.html +18 -0
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000059.html +18 -0
- data/doc/rdoc/classes/ESI/Config/ConfigRouter.html +187 -0
- data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000052.html +19 -0
- data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000053.html +21 -0
- data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000054.html +21 -0
- data/doc/rdoc/classes/ESI/Dispatcher.html +172 -0
- data/doc/rdoc/classes/ESI/Dispatcher.src/M000062.html +23 -0
- data/doc/rdoc/classes/ESI/Dispatcher.src/M000063.html +20 -0
- data/doc/rdoc/classes/ESI/Fragment.html +218 -0
- data/doc/rdoc/classes/ESI/Fragment.src/M000076.html +21 -0
- data/doc/rdoc/classes/ESI/Fragment.src/M000077.html +18 -0
- data/doc/rdoc/classes/ESI/Fragment.src/M000078.html +18 -0
- data/doc/rdoc/classes/ESI/Handler.html +236 -0
- data/doc/rdoc/classes/ESI/Handler.src/M000079.html +19 -0
- data/doc/rdoc/classes/ESI/Handler.src/M000080.html +161 -0
- data/doc/rdoc/classes/ESI/Handler.src/M000081.html +24 -0
- data/doc/rdoc/classes/ESI/Handler.src/M000082.html +18 -0
- data/doc/rdoc/classes/ESI/Handler.src/M000083.html +26 -0
- data/doc/rdoc/classes/ESI/Handler.src/M000084.html +30 -0
- data/doc/rdoc/classes/ESI/Invalidator.html +131 -0
- data/doc/rdoc/classes/ESI/Invalidator.src/M000004.html +41 -0
- data/doc/rdoc/classes/ESI/Log.html +251 -0
- data/doc/rdoc/classes/ESI/Log.src/M000005.html +18 -0
- data/doc/rdoc/classes/ESI/Log.src/M000006.html +18 -0
- data/doc/rdoc/classes/ESI/Log.src/M000007.html +18 -0
- data/doc/rdoc/classes/ESI/Log.src/M000008.html +18 -0
- data/doc/rdoc/classes/ESI/Log.src/M000009.html +18 -0
- data/doc/rdoc/classes/ESI/Log.src/M000010.html +18 -0
- data/doc/rdoc/classes/ESI/Log.src/M000011.html +18 -0
- data/doc/rdoc/classes/ESI/Log.src/M000012.html +18 -0
- data/doc/rdoc/classes/ESI/Log.src/M000013.html +18 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.html +314 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000034.html +24 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000035.html +22 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000036.html +19 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000037.html +23 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000038.html +18 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000039.html +19 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000040.html +18 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000041.html +18 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000042.html +17 -0
- data/doc/rdoc/classes/ESI/Router.html +229 -0
- data/doc/rdoc/classes/ESI/Router.src/M000073.html +36 -0
- data/doc/rdoc/classes/ESI/Router.src/M000074.html +25 -0
- data/doc/rdoc/classes/ESI/Router.src/M000075.html +24 -0
- data/doc/rdoc/classes/ESI/RubyCache.html +278 -0
- data/doc/rdoc/classes/ESI/RubyCache.src/M000064.html +20 -0
- data/doc/rdoc/classes/ESI/RubyCache.src/M000065.html +22 -0
- data/doc/rdoc/classes/ESI/RubyCache.src/M000066.html +21 -0
- data/doc/rdoc/classes/ESI/RubyCache.src/M000067.html +22 -0
- data/doc/rdoc/classes/ESI/RubyCache.src/M000068.html +18 -0
- data/doc/rdoc/classes/ESI/RubyCache.src/M000069.html +22 -0
- data/doc/rdoc/classes/ESI/RubyCache.src/M000070.html +18 -0
- data/doc/rdoc/classes/ESI/RubyCache.src/M000071.html +18 -0
- data/doc/rdoc/classes/ESI/RubyCache.src/M000072.html +18 -0
- data/doc/rdoc/classes/ESI/Tag.html +137 -0
- data/doc/rdoc/classes/ESI/Tag/Attempt.html +113 -0
- data/doc/rdoc/classes/ESI/Tag/Base.html +267 -0
- data/doc/rdoc/classes/ESI/Tag/Base.src/M000028.html +26 -0
- data/doc/rdoc/classes/ESI/Tag/Base.src/M000029.html +23 -0
- data/doc/rdoc/classes/ESI/Tag/Base.src/M000030.html +22 -0
- data/doc/rdoc/classes/ESI/Tag/Base.src/M000031.html +18 -0
- data/doc/rdoc/classes/ESI/Tag/Base.src/M000032.html +22 -0
- data/doc/rdoc/classes/ESI/Tag/Base.src/M000033.html +23 -0
- data/doc/rdoc/classes/ESI/Tag/Except.html +184 -0
- data/doc/rdoc/classes/ESI/Tag/Except.src/M000020.html +21 -0
- data/doc/rdoc/classes/ESI/Tag/Except.src/M000021.html +20 -0
- data/doc/rdoc/classes/ESI/Tag/Except.src/M000022.html +18 -0
- data/doc/rdoc/classes/ESI/Tag/Include.html +189 -0
- data/doc/rdoc/classes/ESI/Tag/Include.src/M000017.html +20 -0
- data/doc/rdoc/classes/ESI/Tag/Include.src/M000018.html +18 -0
- data/doc/rdoc/classes/ESI/Tag/Include.src/M000019.html +125 -0
- data/doc/rdoc/classes/ESI/Tag/IncludeRequest.html +199 -0
- data/doc/rdoc/classes/ESI/Tag/IncludeRequest.src/M000014.html +18 -0
- data/doc/rdoc/classes/ESI/Tag/IncludeRequest.src/M000015.html +42 -0
- data/doc/rdoc/classes/ESI/Tag/IncludeRequest/Error.html +155 -0
- data/doc/rdoc/classes/ESI/Tag/IncludeRequest/Error.src/M000016.html +19 -0
- data/doc/rdoc/classes/ESI/Tag/Invalidate.html +171 -0
- data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000025.html +19 -0
- data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000026.html +51 -0
- data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000027.html +19 -0
- data/doc/rdoc/classes/ESI/Tag/Try.html +161 -0
- data/doc/rdoc/classes/ESI/Tag/Try.src/M000023.html +40 -0
- data/doc/rdoc/classes/ESI/Tag/Try.src/M000024.html +18 -0
- data/doc/rdoc/classes/MultiDirHandler.html +198 -0
- data/doc/rdoc/classes/MultiDirHandler.src/M000001.html +20 -0
- data/doc/rdoc/classes/MultiDirHandler.src/M000002.html +28 -0
- data/doc/rdoc/classes/MultiDirHandler.src/M000003.html +22 -0
- data/doc/rdoc/classes/Net.html +119 -0
- data/doc/rdoc/classes/Net/An.html +114 -0
- data/doc/rdoc/classes/Net/An/HTTP.html +137 -0
- data/doc/rdoc/classes/Net/An/HTTP.src/M000087.html +17 -0
- data/doc/rdoc/classes/Net/An/IORequest.html +139 -0
- data/doc/rdoc/classes/Net/An/IORequest.src/M000088.html +17 -0
- data/doc/rdoc/classes/Net/An/IOResponse.html +139 -0
- data/doc/rdoc/classes/Net/An/IOResponse.src/M000085.html +17 -0
- data/doc/rdoc/classes/Net/An/IOSocket.html +137 -0
- data/doc/rdoc/classes/Net/An/IOSocket.src/M000086.html +17 -0
- data/doc/rdoc/created.rid +1 -0
- data/doc/rdoc/files/COPYING.html +168 -0
- data/doc/rdoc/files/LICENSE.html +605 -0
- data/doc/rdoc/files/README.html +361 -0
- data/doc/rdoc/files/lib/esi/cache_rb.html +113 -0
- data/doc/rdoc/files/lib/esi/config_rb.html +108 -0
- data/doc/rdoc/files/lib/esi/dispatcher_rb.html +109 -0
- data/doc/rdoc/files/lib/esi/handler_rb.html +121 -0
- data/doc/rdoc/files/lib/esi/invalidator_rb.html +117 -0
- data/doc/rdoc/files/lib/esi/logger_rb.html +108 -0
- data/doc/rdoc/files/lib/esi/router_rb.html +101 -0
- data/doc/rdoc/files/lib/esi/tag/attempt_rb.html +101 -0
- data/doc/rdoc/files/lib/esi/tag/base_rb.html +108 -0
- data/doc/rdoc/files/lib/esi/tag/except_rb.html +101 -0
- data/doc/rdoc/files/lib/esi/tag/include_rb.html +109 -0
- data/doc/rdoc/files/lib/esi/tag/invalidate_rb.html +109 -0
- data/doc/rdoc/files/lib/esi/tag/try_rb.html +108 -0
- data/doc/rdoc/files/lib/multi_dirhandler_rb.html +109 -0
- data/doc/rdoc/files/lib/net/ahttp_rb.html +109 -0
- data/doc/rdoc/fr_class_index.html +55 -0
- data/doc/rdoc/fr_file_index.html +44 -0
- data/doc/rdoc/fr_method_index.html +114 -0
- data/doc/rdoc/index.html +24 -0
- data/doc/rdoc/rdoc-style.css +208 -0
- data/ext/esi/esi_parser.c +36 -156
- data/ext/esi/test/parser.c +42 -43
- data/ext/esi/test1.rb +2 -2
- data/lib/esi/cache.rb +83 -72
- data/lib/esi/handler.rb +5 -20
- data/lib/multi_dirhandler.rb +13 -0
- data/lib/net/ahttp.rb +36 -0
- data/test/integration/handler_test.rb +1 -1
- metadata +222 -45
- data/test/unit/sample.html +0 -21
data/ext/esi/test1.rb
CHANGED
data/lib/esi/cache.rb
CHANGED
@@ -1,56 +1,11 @@
|
|
1
1
|
require 'digest/sha1'
|
2
2
|
require 'thread'
|
3
|
-
|
3
|
+
require 'ostruct'
|
4
4
|
require 'esi/logger'
|
5
5
|
|
6
|
-
##
|
7
|
-
# Provide classes with an efficient method for dynamically changing from
|
8
|
-
# multiple threaded to single threaded when the class is created.
|
9
|
-
# rather then requiring multiple object types just change the object behavior
|
10
|
-
|
11
|
-
module Synchronizable
|
12
|
-
def synchronize_methods( *methods_names )
|
13
|
-
methods_names.flatten.each do|name|
|
14
|
-
base_name = name
|
15
|
-
if name.to_s.match(/!$/)
|
16
|
-
suffix = "!"
|
17
|
-
base_name = name.to_s.gsub(/!$/,'')
|
18
|
-
end
|
19
|
-
unlocked_name = "#{base_name}_unlocked#{suffix}".to_sym
|
20
|
-
locked_name = "#{base_name}_locked#{suffix}".to_sym
|
21
|
-
|
22
|
-
self.class.send :alias_method, unlocked_name, name
|
23
|
-
|
24
|
-
next unless @semaphore
|
25
|
-
|
26
|
-
self.class.send(:define_method, locked_name) do
|
27
|
-
@semaphore.synchronize do
|
28
|
-
send unlocked_name, args
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
6
|
module ESI
|
36
7
|
|
37
|
-
#
|
38
|
-
#
|
39
|
-
# all caches store Fragments
|
40
|
-
#
|
41
|
-
# get - uri,params => Fragment
|
42
|
-
#
|
43
|
-
# cached? - uri,params => boolean
|
44
|
-
#
|
45
|
-
# put - uri,params, max_age, body => nil
|
46
|
-
#
|
47
|
-
# sweep! - tells the cache to expire anything that needs expiring
|
48
|
-
#
|
49
|
-
# keys - is an optional method for iterating over all keys, may not be exposed by all cache backends
|
50
|
-
#
|
51
|
-
# delete - key remove the key from the cache
|
52
|
-
|
53
|
-
# Each object in the cache has a ttl
|
8
|
+
# Represents part of the cached page, typically an <esi:include
|
54
9
|
class Fragment
|
55
10
|
attr_accessor :body, :max_age, :uri
|
56
11
|
alias read_body body
|
@@ -62,6 +17,12 @@ module ESI
|
|
62
17
|
@body = body
|
63
18
|
end
|
64
19
|
|
20
|
+
# make a copy of the object, necessary for thread safety
|
21
|
+
def dup
|
22
|
+
Fragment.new( @uri, @max_age, @body )
|
23
|
+
end
|
24
|
+
|
25
|
+
# determine if the fragment is still valid, given the max age associated when the object was created
|
65
26
|
def valid?
|
66
27
|
(Time.now.to_i < @max_age)
|
67
28
|
end
|
@@ -69,17 +30,26 @@ module ESI
|
|
69
30
|
end
|
70
31
|
|
71
32
|
|
33
|
+
# cache interface
|
34
|
+
#
|
35
|
+
# all caches store Fragments
|
36
|
+
#
|
37
|
+
# get - uri,params => Fragment
|
38
|
+
#
|
39
|
+
# cached? - uri,params => boolean
|
40
|
+
#
|
41
|
+
# put - uri,params, max_age, body => nil
|
42
|
+
#
|
43
|
+
# sweep! - tells the cache to expire anything that needs expiring
|
44
|
+
#
|
45
|
+
# keys - is an optional method for iterating over all keys, may not be exposed by all cache backends
|
46
|
+
#
|
47
|
+
# delete - key remove the key from the cache
|
48
|
+
#
|
72
49
|
# Base Cache object
|
73
50
|
class Cache
|
74
|
-
include Synchronizable
|
75
51
|
|
76
|
-
def initialize
|
77
|
-
options = OpenStruct.new(options) if options.is_a?(Hash)
|
78
|
-
if( options.locked )
|
79
|
-
@semaphore = Mutex.new
|
80
|
-
end
|
81
|
-
synchronize_methods :get, :put, :put, :sweep!, :keys, :delete
|
82
|
-
# TODO: load the cache_headers config
|
52
|
+
def initialize
|
83
53
|
end
|
84
54
|
|
85
55
|
protected
|
@@ -106,6 +76,19 @@ module ESI
|
|
106
76
|
# - We could also store the keys in the ruby process or alternatively look in INVALIDATION-WITH-MEMCACHED
|
107
77
|
#
|
108
78
|
# We can't support advanced selector with memcached backend
|
79
|
+
#
|
80
|
+
# Configuring:
|
81
|
+
#
|
82
|
+
# config.cache do|c|
|
83
|
+
# c.memcached do|mc|
|
84
|
+
# mc.servers = ['localhost:11211']
|
85
|
+
# mc.debug = false
|
86
|
+
# mc.namespace = 'mesi'
|
87
|
+
# mc.readonly = false
|
88
|
+
# end
|
89
|
+
# c.ttl = 600
|
90
|
+
# end
|
91
|
+
#
|
109
92
|
class MemcachedCache < Cache
|
110
93
|
require 'rubygems'
|
111
94
|
gem 'memcache-client' if respond_to? :gem
|
@@ -113,15 +96,12 @@ module ESI
|
|
113
96
|
include ESI::Log
|
114
97
|
|
115
98
|
def initialize( options )
|
116
|
-
super
|
117
|
-
|
118
|
-
options
|
119
|
-
:debug => options.debug,
|
120
|
-
:namespace => options.namespace,
|
121
|
-
:readonly => options.readonly }
|
99
|
+
super()
|
100
|
+
options = options.marshal_dump
|
101
|
+
options.merge!( :multithread => true )
|
122
102
|
puts "Using memcache with options => #{options.inspect}"
|
123
103
|
@cache = MemCache.new options
|
124
|
-
puts "Using memcache servers at #{options[
|
104
|
+
puts "Using memcache servers at #{options[:servers].inspect}"
|
125
105
|
@cache.servers = options[:servers]
|
126
106
|
end
|
127
107
|
|
@@ -129,11 +109,13 @@ module ESI
|
|
129
109
|
fragment = get(uri,params)
|
130
110
|
fragment and fragment.valid?
|
131
111
|
rescue Object => e # never raise an exception from this method
|
112
|
+
STDERR.puts "error in #{__FILE__}:#{__LINE__}"
|
132
113
|
false
|
133
114
|
end
|
134
115
|
|
135
116
|
def get( uri, params )
|
136
|
-
@cache.get(cache_key(uri,params))
|
117
|
+
fragment = @cache.get(cache_key(uri,params))
|
118
|
+
fragment.dup if fragment and fragment.respond_to?(:dup)
|
137
119
|
end
|
138
120
|
|
139
121
|
def put( uri, params, max_age, body )
|
@@ -141,6 +123,7 @@ module ESI
|
|
141
123
|
key = cache_key(uri,params)
|
142
124
|
@cache.add( key, fragment, fragment.max_age )
|
143
125
|
rescue Object => e
|
126
|
+
STDERR.puts "error in #{__FILE__}:#{__LINE__}"
|
144
127
|
log_error e.message
|
145
128
|
end
|
146
129
|
|
@@ -155,8 +138,16 @@ module ESI
|
|
155
138
|
end
|
156
139
|
|
157
140
|
def delete( key )
|
141
|
+
delete_unlocked
|
142
|
+
end
|
143
|
+
|
144
|
+
def delete_unlocked( key )
|
158
145
|
@cache.delete(key)
|
159
146
|
end
|
147
|
+
|
148
|
+
def sweep_unlocked!
|
149
|
+
end
|
150
|
+
|
160
151
|
end
|
161
152
|
|
162
153
|
#
|
@@ -164,43 +155,63 @@ module ESI
|
|
164
155
|
#
|
165
156
|
# A hash table indexed by cache_key of Fragments.
|
166
157
|
# the cache is made thread safe if the external invalidator is active otherwise the Mutex is a no op
|
158
|
+
#
|
159
|
+
# Default cache.
|
167
160
|
class RubyCache < Cache
|
168
161
|
|
169
162
|
def initialize( options = {} )
|
170
|
-
super
|
163
|
+
super()
|
164
|
+
@semaphore = Mutex.new
|
171
165
|
@cache = {}
|
172
166
|
end
|
173
167
|
|
174
168
|
def cached?( uri, params )
|
175
169
|
key = cache_key(uri,params)
|
176
|
-
|
177
|
-
|
170
|
+
@semaphore.synchronize do
|
171
|
+
fragment = @cache[key]
|
172
|
+
fragment and fragment.valid?
|
173
|
+
end
|
178
174
|
end
|
179
175
|
|
180
176
|
def get( uri, params )
|
181
|
-
@
|
177
|
+
@semaphore.synchronize do
|
178
|
+
fragment = @cache[cache_key(uri,params)]
|
179
|
+
fragment.dup if fragment and fragment.respond_to?(:dup)
|
180
|
+
end
|
182
181
|
end
|
183
182
|
|
184
183
|
def put( uri, params, max_age, body )
|
185
184
|
key = cache_key(uri,params)
|
186
|
-
@
|
187
|
-
|
185
|
+
@semaphore.synchronize do
|
186
|
+
@cache[key] = Fragment.new(uri,max_age,body)
|
187
|
+
sweep_unlocked!
|
188
|
+
end
|
188
189
|
end
|
189
190
|
|
190
191
|
# run through the cache and dump anything that has expired
|
191
192
|
def sweep!
|
192
|
-
@
|
193
|
+
@semaphore.synchronize { sweep_unlocked! }
|
193
194
|
end
|
194
195
|
|
195
196
|
def keys(&block)
|
196
|
-
@
|
197
|
-
|
197
|
+
@semaphore.synchronize do
|
198
|
+
@cache.each do|key,data|
|
199
|
+
yield key, data
|
200
|
+
end
|
198
201
|
end
|
199
202
|
end
|
200
203
|
|
201
204
|
def delete( key )
|
205
|
+
@semaphore.synchronize { @cache.delete(key) }
|
206
|
+
end
|
207
|
+
|
208
|
+
def delete_unlocked( key )
|
202
209
|
@cache.delete(key)
|
203
210
|
end
|
211
|
+
|
212
|
+
def sweep_unlocked!
|
213
|
+
@cache.reject! {|k,v| !v.valid? }
|
214
|
+
end
|
204
215
|
|
205
216
|
end
|
206
217
|
|
data/lib/esi/handler.rb
CHANGED
@@ -141,15 +141,9 @@ module ESI
|
|
141
141
|
|
142
142
|
#t = Time.now
|
143
143
|
proxy_response.read_body do|data|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
#puts "Time in process: #{Time.now - pt}"
|
148
|
-
rescue => e
|
149
|
-
puts e.message
|
150
|
-
puts e.backtrace.join("\n")
|
151
|
-
raise e
|
152
|
-
end
|
144
|
+
#pt = Time.now
|
145
|
+
parser.process data
|
146
|
+
#puts "Time in process: #{Time.now - pt}"
|
153
147
|
end
|
154
148
|
#puts "Response Time: #{Time.now - t}"
|
155
149
|
|
@@ -163,8 +157,7 @@ module ESI
|
|
163
157
|
end
|
164
158
|
|
165
159
|
rescue => e
|
166
|
-
|
167
|
-
response.write( error )
|
160
|
+
STDERR.puts "\n#{e.class}: error in #{__FILE__}:#{__LINE__}\n"
|
168
161
|
end
|
169
162
|
response.write( "0\r\n\r\n" )
|
170
163
|
response.done = true
|
@@ -172,7 +165,7 @@ module ESI
|
|
172
165
|
end # end request
|
173
166
|
|
174
167
|
rescue => e
|
175
|
-
|
168
|
+
STDERR.puts "\n#{e.class}: error in #{__FILE__}:#{__LINE__}\n"
|
176
169
|
ensure
|
177
170
|
|
178
171
|
log_request "\nCompleted => #{url}, #{Time.now - start} seconds with status #{status} and #{chunk_count} chunks\n"
|
@@ -191,14 +184,6 @@ protected
|
|
191
184
|
response.write( buffer + Mongrel::Const::LINE_END ) # write the chunk
|
192
185
|
end
|
193
186
|
|
194
|
-
def error_response(e,url)
|
195
|
-
status = 500
|
196
|
-
error = "<h1>Internal Server Errror</h1><h4>Failed while requesting => '#{url}'</h4>\n<pre>#{e.message}#{e.backtrace.join("\n")}</pre>"
|
197
|
-
log_error e.backtrace.join("\n")
|
198
|
-
log_error error
|
199
|
-
[status, "<html><body>#{error}</body></html>"]
|
200
|
-
end
|
201
|
-
|
202
187
|
def read_status(response)
|
203
188
|
Net::HTTPResponse::CODE_TO_OBJ.select { |k,v| v == response.class }.first[0].to_i rescue 500
|
204
189
|
end
|
data/lib/multi_dirhandler.rb
CHANGED
@@ -1,6 +1,19 @@
|
|
1
1
|
require 'mongrel/handlers.rb'
|
2
2
|
require 'digest/md5'
|
3
3
|
|
4
|
+
#
|
5
|
+
# Allow files to be servered from multiple directories within a single URL space
|
6
|
+
#
|
7
|
+
# This is sometimes very useful when working with multiple application servers, each with
|
8
|
+
# their own set of static files.
|
9
|
+
#
|
10
|
+
# Usage:
|
11
|
+
#
|
12
|
+
# uri "/request_path/", :handler => MultiDirHandler.new(['/file/path1','/file/path2'])
|
13
|
+
#
|
14
|
+
# options:
|
15
|
+
# :cwd, override the server root directory, make sure there is a tmp directory in server root
|
16
|
+
#
|
4
17
|
class MultiDirHandler < Mongrel::DirHandler
|
5
18
|
# check in each folder for the file
|
6
19
|
def initialize( path, options = {})
|
data/lib/net/ahttp.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# Non-blocking HTTP Client/Server Library
|
2
|
+
# The idea is to use Ruby 1.8.5's non blocking IO methods to provide an interface
|
3
|
+
# to HTTP client and server that can be more efficient then the standard Net::HTTP
|
4
|
+
|
5
|
+
module Net
|
6
|
+
module An
|
7
|
+
class HTTP
|
8
|
+
def self.select
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class IOSocket < Socket
|
13
|
+
def process
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class IORequest < IOSocket
|
18
|
+
def process
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class IOResponse < IOSocket
|
23
|
+
def process
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
#
|
32
|
+
# emits io handles, these objects have a
|
33
|
+
# process method
|
34
|
+
Net::An::HTTP.select do|io|
|
35
|
+
io.process
|
36
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongrel_esi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Todd A. Fisher
|
@@ -80,77 +80,254 @@ files:
|
|
80
80
|
- README
|
81
81
|
- Rakefile
|
82
82
|
- bin/mongrel_esi
|
83
|
+
- doc/rdoc/index.html
|
84
|
+
- doc/rdoc/created.rid
|
85
|
+
- doc/rdoc/classes
|
86
|
+
- doc/rdoc/classes/ESI.html
|
87
|
+
- doc/rdoc/classes/Net.html
|
88
|
+
- doc/rdoc/classes/MultiDirHandler.src
|
89
|
+
- doc/rdoc/classes/MultiDirHandler.src/M000003.html
|
90
|
+
- doc/rdoc/classes/MultiDirHandler.src/M000001.html
|
91
|
+
- doc/rdoc/classes/MultiDirHandler.src/M000002.html
|
92
|
+
- doc/rdoc/classes/MultiDirHandler.html
|
93
|
+
- doc/rdoc/classes/Net
|
94
|
+
- doc/rdoc/classes/Net/An
|
95
|
+
- doc/rdoc/classes/Net/An/IOResponse.html
|
96
|
+
- doc/rdoc/classes/Net/An/HTTP.src
|
97
|
+
- doc/rdoc/classes/Net/An/HTTP.src/M000087.html
|
98
|
+
- doc/rdoc/classes/Net/An/IOSocket.html
|
99
|
+
- doc/rdoc/classes/Net/An/IORequest.src
|
100
|
+
- doc/rdoc/classes/Net/An/IORequest.src/M000088.html
|
101
|
+
- doc/rdoc/classes/Net/An/HTTP.html
|
102
|
+
- doc/rdoc/classes/Net/An/IOSocket.src
|
103
|
+
- doc/rdoc/classes/Net/An/IOSocket.src/M000086.html
|
104
|
+
- doc/rdoc/classes/Net/An/IOResponse.src
|
105
|
+
- doc/rdoc/classes/Net/An/IOResponse.src/M000085.html
|
106
|
+
- doc/rdoc/classes/Net/An/IORequest.html
|
107
|
+
- doc/rdoc/classes/Net/An.html
|
108
|
+
- doc/rdoc/classes/ESI
|
109
|
+
- doc/rdoc/classes/ESI/RubyCache.src
|
110
|
+
- doc/rdoc/classes/ESI/RubyCache.src/M000070.html
|
111
|
+
- doc/rdoc/classes/ESI/RubyCache.src/M000069.html
|
112
|
+
- doc/rdoc/classes/ESI/RubyCache.src/M000064.html
|
113
|
+
- doc/rdoc/classes/ESI/RubyCache.src/M000065.html
|
114
|
+
- doc/rdoc/classes/ESI/RubyCache.src/M000066.html
|
115
|
+
- doc/rdoc/classes/ESI/RubyCache.src/M000068.html
|
116
|
+
- doc/rdoc/classes/ESI/RubyCache.src/M000071.html
|
117
|
+
- doc/rdoc/classes/ESI/RubyCache.src/M000072.html
|
118
|
+
- doc/rdoc/classes/ESI/RubyCache.src/M000067.html
|
119
|
+
- doc/rdoc/classes/ESI/Log.html
|
120
|
+
- doc/rdoc/classes/ESI/Config.src
|
121
|
+
- doc/rdoc/classes/ESI/Config.src/M000047.html
|
122
|
+
- doc/rdoc/classes/ESI/Config.src/M000051.html
|
123
|
+
- doc/rdoc/classes/ESI/Config.src/M000045.html
|
124
|
+
- doc/rdoc/classes/ESI/Config.src/M000048.html
|
125
|
+
- doc/rdoc/classes/ESI/Config.src/M000049.html
|
126
|
+
- doc/rdoc/classes/ESI/Config.src/M000044.html
|
127
|
+
- doc/rdoc/classes/ESI/Config.src/M000050.html
|
128
|
+
- doc/rdoc/classes/ESI/Config.src/M000043.html
|
129
|
+
- doc/rdoc/classes/ESI/Config.src/M000046.html
|
130
|
+
- doc/rdoc/classes/ESI/Fragment.src
|
131
|
+
- doc/rdoc/classes/ESI/Fragment.src/M000077.html
|
132
|
+
- doc/rdoc/classes/ESI/Fragment.src/M000078.html
|
133
|
+
- doc/rdoc/classes/ESI/Fragment.src/M000076.html
|
134
|
+
- doc/rdoc/classes/ESI/Dispatcher.src
|
135
|
+
- doc/rdoc/classes/ESI/Dispatcher.src/M000063.html
|
136
|
+
- doc/rdoc/classes/ESI/Dispatcher.src/M000062.html
|
137
|
+
- doc/rdoc/classes/ESI/Router.html
|
138
|
+
- doc/rdoc/classes/ESI/Cache.src
|
139
|
+
- doc/rdoc/classes/ESI/Cache.src/M000061.html
|
140
|
+
- doc/rdoc/classes/ESI/Cache.src/M000060.html
|
141
|
+
- doc/rdoc/classes/ESI/Invalidator.html
|
142
|
+
- doc/rdoc/classes/ESI/Invalidator.src
|
143
|
+
- doc/rdoc/classes/ESI/Invalidator.src/M000004.html
|
144
|
+
- doc/rdoc/classes/ESI/MemcachedCache.html
|
145
|
+
- doc/rdoc/classes/ESI/Tag.html
|
146
|
+
- doc/rdoc/classes/ESI/Config
|
147
|
+
- doc/rdoc/classes/ESI/Config/CacheConfig.src
|
148
|
+
- doc/rdoc/classes/ESI/Config/CacheConfig.src/M000057.html
|
149
|
+
- doc/rdoc/classes/ESI/Config/CacheConfig.src/M000055.html
|
150
|
+
- doc/rdoc/classes/ESI/Config/CacheConfig.src/M000058.html
|
151
|
+
- doc/rdoc/classes/ESI/Config/CacheConfig.src/M000056.html
|
152
|
+
- doc/rdoc/classes/ESI/Config/CacheConfig.src/M000059.html
|
153
|
+
- doc/rdoc/classes/ESI/Config/ConfigRouter.src
|
154
|
+
- doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000052.html
|
155
|
+
- doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000054.html
|
156
|
+
- doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000053.html
|
157
|
+
- doc/rdoc/classes/ESI/Config/CacheConfig.html
|
158
|
+
- doc/rdoc/classes/ESI/Config/ConfigRouter.html
|
159
|
+
- doc/rdoc/classes/ESI/Fragment.html
|
160
|
+
- doc/rdoc/classes/ESI/Router.src
|
161
|
+
- doc/rdoc/classes/ESI/Router.src/M000075.html
|
162
|
+
- doc/rdoc/classes/ESI/Router.src/M000074.html
|
163
|
+
- doc/rdoc/classes/ESI/Router.src/M000073.html
|
164
|
+
- doc/rdoc/classes/ESI/MemcachedCache.src
|
165
|
+
- doc/rdoc/classes/ESI/MemcachedCache.src/M000036.html
|
166
|
+
- doc/rdoc/classes/ESI/MemcachedCache.src/M000034.html
|
167
|
+
- doc/rdoc/classes/ESI/MemcachedCache.src/M000040.html
|
168
|
+
- doc/rdoc/classes/ESI/MemcachedCache.src/M000038.html
|
169
|
+
- doc/rdoc/classes/ESI/MemcachedCache.src/M000039.html
|
170
|
+
- doc/rdoc/classes/ESI/MemcachedCache.src/M000037.html
|
171
|
+
- doc/rdoc/classes/ESI/MemcachedCache.src/M000042.html
|
172
|
+
- doc/rdoc/classes/ESI/MemcachedCache.src/M000035.html
|
173
|
+
- doc/rdoc/classes/ESI/MemcachedCache.src/M000041.html
|
174
|
+
- doc/rdoc/classes/ESI/Dispatcher.html
|
175
|
+
- doc/rdoc/classes/ESI/RubyCache.html
|
176
|
+
- doc/rdoc/classes/ESI/Log.src
|
177
|
+
- doc/rdoc/classes/ESI/Log.src/M000007.html
|
178
|
+
- doc/rdoc/classes/ESI/Log.src/M000005.html
|
179
|
+
- doc/rdoc/classes/ESI/Log.src/M000012.html
|
180
|
+
- doc/rdoc/classes/ESI/Log.src/M000009.html
|
181
|
+
- doc/rdoc/classes/ESI/Log.src/M000010.html
|
182
|
+
- doc/rdoc/classes/ESI/Log.src/M000013.html
|
183
|
+
- doc/rdoc/classes/ESI/Log.src/M000006.html
|
184
|
+
- doc/rdoc/classes/ESI/Log.src/M000011.html
|
185
|
+
- doc/rdoc/classes/ESI/Log.src/M000008.html
|
186
|
+
- doc/rdoc/classes/ESI/Handler.src
|
187
|
+
- doc/rdoc/classes/ESI/Handler.src/M000083.html
|
188
|
+
- doc/rdoc/classes/ESI/Handler.src/M000082.html
|
189
|
+
- doc/rdoc/classes/ESI/Handler.src/M000079.html
|
190
|
+
- doc/rdoc/classes/ESI/Handler.src/M000080.html
|
191
|
+
- doc/rdoc/classes/ESI/Handler.src/M000084.html
|
192
|
+
- doc/rdoc/classes/ESI/Handler.src/M000081.html
|
193
|
+
- doc/rdoc/classes/ESI/Tag
|
194
|
+
- doc/rdoc/classes/ESI/Tag/Try.html
|
195
|
+
- doc/rdoc/classes/ESI/Tag/Except.src
|
196
|
+
- doc/rdoc/classes/ESI/Tag/Except.src/M000022.html
|
197
|
+
- doc/rdoc/classes/ESI/Tag/Except.src/M000021.html
|
198
|
+
- doc/rdoc/classes/ESI/Tag/Except.src/M000020.html
|
199
|
+
- doc/rdoc/classes/ESI/Tag/Include.html
|
200
|
+
- doc/rdoc/classes/ESI/Tag/Try.src
|
201
|
+
- doc/rdoc/classes/ESI/Tag/Try.src/M000024.html
|
202
|
+
- doc/rdoc/classes/ESI/Tag/Try.src/M000023.html
|
203
|
+
- doc/rdoc/classes/ESI/Tag/IncludeRequest
|
204
|
+
- doc/rdoc/classes/ESI/Tag/IncludeRequest/Error.html
|
205
|
+
- doc/rdoc/classes/ESI/Tag/IncludeRequest/Error.src
|
206
|
+
- doc/rdoc/classes/ESI/Tag/IncludeRequest/Error.src/M000016.html
|
207
|
+
- doc/rdoc/classes/ESI/Tag/Invalidate.html
|
208
|
+
- doc/rdoc/classes/ESI/Tag/Base.html
|
209
|
+
- doc/rdoc/classes/ESI/Tag/Include.src
|
210
|
+
- doc/rdoc/classes/ESI/Tag/Include.src/M000018.html
|
211
|
+
- doc/rdoc/classes/ESI/Tag/Include.src/M000019.html
|
212
|
+
- doc/rdoc/classes/ESI/Tag/Include.src/M000017.html
|
213
|
+
- doc/rdoc/classes/ESI/Tag/IncludeRequest.src
|
214
|
+
- doc/rdoc/classes/ESI/Tag/IncludeRequest.src/M000015.html
|
215
|
+
- doc/rdoc/classes/ESI/Tag/IncludeRequest.src/M000014.html
|
216
|
+
- doc/rdoc/classes/ESI/Tag/Invalidate.src
|
217
|
+
- doc/rdoc/classes/ESI/Tag/Invalidate.src/M000027.html
|
218
|
+
- doc/rdoc/classes/ESI/Tag/Invalidate.src/M000026.html
|
219
|
+
- doc/rdoc/classes/ESI/Tag/Invalidate.src/M000025.html
|
220
|
+
- doc/rdoc/classes/ESI/Tag/Attempt.html
|
221
|
+
- doc/rdoc/classes/ESI/Tag/Except.html
|
222
|
+
- doc/rdoc/classes/ESI/Tag/Base.src
|
223
|
+
- doc/rdoc/classes/ESI/Tag/Base.src/M000031.html
|
224
|
+
- doc/rdoc/classes/ESI/Tag/Base.src/M000032.html
|
225
|
+
- doc/rdoc/classes/ESI/Tag/Base.src/M000029.html
|
226
|
+
- doc/rdoc/classes/ESI/Tag/Base.src/M000030.html
|
227
|
+
- doc/rdoc/classes/ESI/Tag/Base.src/M000028.html
|
228
|
+
- doc/rdoc/classes/ESI/Tag/Base.src/M000033.html
|
229
|
+
- doc/rdoc/classes/ESI/Tag/IncludeRequest.html
|
230
|
+
- doc/rdoc/classes/ESI/Cache.html
|
231
|
+
- doc/rdoc/classes/ESI/Handler.html
|
232
|
+
- doc/rdoc/classes/ESI/Config.html
|
233
|
+
- doc/rdoc/rdoc-style.css
|
234
|
+
- doc/rdoc/fr_file_index.html
|
235
|
+
- doc/rdoc/fr_class_index.html
|
236
|
+
- doc/rdoc/files
|
237
|
+
- doc/rdoc/files/LICENSE.html
|
238
|
+
- doc/rdoc/files/COPYING.html
|
239
|
+
- doc/rdoc/files/README.html
|
240
|
+
- doc/rdoc/files/lib
|
241
|
+
- doc/rdoc/files/lib/multi_dirhandler_rb.html
|
242
|
+
- doc/rdoc/files/lib/esi
|
243
|
+
- doc/rdoc/files/lib/esi/router_rb.html
|
244
|
+
- doc/rdoc/files/lib/esi/dispatcher_rb.html
|
245
|
+
- doc/rdoc/files/lib/esi/cache_rb.html
|
246
|
+
- doc/rdoc/files/lib/esi/tag
|
247
|
+
- doc/rdoc/files/lib/esi/tag/invalidate_rb.html
|
248
|
+
- doc/rdoc/files/lib/esi/tag/except_rb.html
|
249
|
+
- doc/rdoc/files/lib/esi/tag/attempt_rb.html
|
250
|
+
- doc/rdoc/files/lib/esi/tag/try_rb.html
|
251
|
+
- doc/rdoc/files/lib/esi/tag/base_rb.html
|
252
|
+
- doc/rdoc/files/lib/esi/tag/include_rb.html
|
253
|
+
- doc/rdoc/files/lib/esi/config_rb.html
|
254
|
+
- doc/rdoc/files/lib/esi/handler_rb.html
|
255
|
+
- doc/rdoc/files/lib/esi/invalidator_rb.html
|
256
|
+
- doc/rdoc/files/lib/esi/logger_rb.html
|
257
|
+
- doc/rdoc/files/lib/net
|
258
|
+
- doc/rdoc/files/lib/net/ahttp_rb.html
|
259
|
+
- doc/rdoc/fr_method_index.html
|
260
|
+
- test/unit
|
261
|
+
- test/unit/esi-sample.html
|
262
|
+
- test/unit/router_test.rb
|
263
|
+
- test/unit/include_request_test.rb
|
264
|
+
- test/unit/help.rb
|
265
|
+
- test/unit/parser_test.rb
|
266
|
+
- test/unit/include_tag_test.rb
|
267
|
+
- test/unit/base_tag_test.rb
|
83
268
|
- test/integration
|
84
|
-
- test/integration/
|
269
|
+
- test/integration/help.rb
|
270
|
+
- test/integration/handler_test.rb
|
85
271
|
- test/integration/cache_test.rb
|
86
272
|
- test/integration/docs
|
273
|
+
- test/integration/docs/test_failover.html
|
274
|
+
- test/integration/docs/esi_invalidate.html
|
275
|
+
- test/integration/docs/index.html
|
276
|
+
- test/integration/docs/test1.html
|
277
|
+
- test/integration/docs/test3.html
|
87
278
|
- test/integration/docs/content
|
88
|
-
- test/integration/docs/content/500.html
|
89
|
-
- test/integration/docs/content/500_with_failover.html
|
90
279
|
- test/integration/docs/content/500_with_failover_to_alt.html
|
91
|
-
- test/integration/docs/content/ajax_test_page.html
|
92
280
|
- test/integration/docs/content/cookie_variable.html
|
93
|
-
- test/integration/docs/content/foo.html
|
94
281
|
- test/integration/docs/content/include_in_include.html
|
95
|
-
- test/integration/docs/content/
|
96
|
-
- test/integration/docs/content/malformed_transforms.html-correct
|
97
|
-
- test/integration/docs/content/static-failover.html
|
282
|
+
- test/integration/docs/content/500.html
|
98
283
|
- test/integration/docs/content/test2.html
|
99
284
|
- test/integration/docs/content/test3.html
|
100
|
-
- test/integration/docs/
|
101
|
-
- test/integration/docs/
|
285
|
+
- test/integration/docs/content/500_with_failover.html
|
286
|
+
- test/integration/docs/content/foo.html
|
287
|
+
- test/integration/docs/content/malformed_transforms.html-correct
|
288
|
+
- test/integration/docs/content/malformed_transforms.html
|
289
|
+
- test/integration/docs/content/ajax_test_page.html
|
290
|
+
- test/integration/docs/content/static-failover.html
|
102
291
|
- test/integration/docs/esi_test_content.html
|
103
|
-
- test/integration/docs/
|
104
|
-
- test/integration/
|
105
|
-
- test/integration/docs/test3.html
|
106
|
-
- test/integration/docs/test_failover.html
|
107
|
-
- test/integration/handler_test.rb
|
108
|
-
- test/integration/help.rb
|
292
|
+
- test/integration/docs/esi_mixed_content.html
|
293
|
+
- test/integration/basic_test.rb
|
109
294
|
- test/net
|
110
|
-
- test/net/get_test.rb
|
111
|
-
- test/net/net_helper.rb
|
112
295
|
- test/net/server_test.rb
|
113
|
-
- test/
|
114
|
-
- test/
|
115
|
-
- test/unit/esi-sample.html
|
116
|
-
- test/unit/help.rb
|
117
|
-
- test/unit/include_request_test.rb
|
118
|
-
- test/unit/include_tag_test.rb
|
119
|
-
- test/unit/parser_test.rb
|
120
|
-
- test/unit/router_test.rb
|
121
|
-
- test/unit/sample.html
|
296
|
+
- test/net/net_helper.rb
|
297
|
+
- test/net/get_test.rb
|
122
298
|
- ext/esi/parser.h
|
123
299
|
- ext/esi/test/parser.h
|
300
|
+
- ext/esi/test/test.c
|
301
|
+
- ext/esi/test/parser.c
|
124
302
|
- ext/esi/esi_parser.c
|
125
303
|
- ext/esi/parser.c
|
126
|
-
- ext/esi/test
|
127
|
-
- ext/esi/
|
304
|
+
- ext/esi/run-test.rb
|
305
|
+
- ext/esi/test2.rb
|
128
306
|
- ext/esi/extconf.rb
|
129
307
|
- ext/esi/machine.rb
|
130
|
-
- ext/esi/parser.rb
|
131
|
-
- ext/esi/run-test.rb
|
132
308
|
- ext/esi/test1.rb
|
133
|
-
- ext/esi/
|
309
|
+
- ext/esi/parser.rb
|
134
310
|
- ext/esi/common.rl
|
135
|
-
- ext/esi/parser.rl
|
136
|
-
- ext/esi/ruby_esi.rl
|
137
311
|
- ext/esi/test/common.rl
|
138
312
|
- ext/esi/test/parser.rl
|
313
|
+
- ext/esi/parser.rl
|
314
|
+
- ext/esi/ruby_esi.rl
|
139
315
|
- tools/rakehelp.rb
|
140
|
-
- lib/
|
141
|
-
- lib/esi/config.rb
|
316
|
+
- lib/multi_dirhandler.rb
|
142
317
|
- lib/esi/dispatcher.rb
|
143
318
|
- lib/esi/handler.rb
|
144
|
-
- lib/esi/
|
145
|
-
- lib/esi/logger.rb
|
146
|
-
- lib/esi/router.rb
|
147
|
-
- lib/esi/tag/attempt.rb
|
148
|
-
- lib/esi/tag/base.rb
|
149
|
-
- lib/esi/tag/except.rb
|
319
|
+
- lib/esi/config.rb
|
150
320
|
- lib/esi/tag/include.rb
|
321
|
+
- lib/esi/tag/attempt.rb
|
151
322
|
- lib/esi/tag/invalidate.rb
|
152
323
|
- lib/esi/tag/try.rb
|
153
|
-
- lib/
|
324
|
+
- lib/esi/tag/base.rb
|
325
|
+
- lib/esi/tag/except.rb
|
326
|
+
- lib/esi/cache.rb
|
327
|
+
- lib/esi/router.rb
|
328
|
+
- lib/esi/logger.rb
|
329
|
+
- lib/esi/invalidator.rb
|
330
|
+
- lib/net/ahttp.rb
|
154
331
|
- setup.rb
|
155
332
|
has_rdoc: true
|
156
333
|
homepage:
|
@@ -174,7 +351,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
174
351
|
requirements: []
|
175
352
|
|
176
353
|
rubyforge_project:
|
177
|
-
rubygems_version:
|
354
|
+
rubygems_version: 0.9.5
|
178
355
|
signing_key:
|
179
356
|
specification_version: 2
|
180
357
|
summary: A small fast ESI HTTP Server built on top of Mongrel
|