mongrel_esi 0.4.0 → 0.4.1

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.
Files changed (153) hide show
  1. data/README +8 -8
  2. data/Rakefile +4 -12
  3. data/doc/rdoc/classes/ESI.html +169 -0
  4. data/doc/rdoc/classes/ESI/Cache.html +178 -0
  5. data/doc/rdoc/classes/ESI/Cache.src/M000060.html +17 -0
  6. data/doc/rdoc/classes/ESI/Cache.src/M000061.html +20 -0
  7. data/doc/rdoc/classes/ESI/Config.html +291 -0
  8. data/doc/rdoc/classes/ESI/Config.src/M000043.html +18 -0
  9. data/doc/rdoc/classes/ESI/Config.src/M000044.html +18 -0
  10. data/doc/rdoc/classes/ESI/Config.src/M000045.html +35 -0
  11. data/doc/rdoc/classes/ESI/Config.src/M000046.html +38 -0
  12. data/doc/rdoc/classes/ESI/Config.src/M000047.html +23 -0
  13. data/doc/rdoc/classes/ESI/Config.src/M000048.html +18 -0
  14. data/doc/rdoc/classes/ESI/Config.src/M000049.html +20 -0
  15. data/doc/rdoc/classes/ESI/Config.src/M000050.html +18 -0
  16. data/doc/rdoc/classes/ESI/Config.src/M000051.html +24 -0
  17. data/doc/rdoc/classes/ESI/Config/CacheConfig.html +212 -0
  18. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000055.html +19 -0
  19. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000056.html +19 -0
  20. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000057.html +18 -0
  21. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000058.html +18 -0
  22. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000059.html +18 -0
  23. data/doc/rdoc/classes/ESI/Config/ConfigRouter.html +187 -0
  24. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000052.html +19 -0
  25. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000053.html +21 -0
  26. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000054.html +21 -0
  27. data/doc/rdoc/classes/ESI/Dispatcher.html +172 -0
  28. data/doc/rdoc/classes/ESI/Dispatcher.src/M000062.html +23 -0
  29. data/doc/rdoc/classes/ESI/Dispatcher.src/M000063.html +20 -0
  30. data/doc/rdoc/classes/ESI/Fragment.html +218 -0
  31. data/doc/rdoc/classes/ESI/Fragment.src/M000076.html +21 -0
  32. data/doc/rdoc/classes/ESI/Fragment.src/M000077.html +18 -0
  33. data/doc/rdoc/classes/ESI/Fragment.src/M000078.html +18 -0
  34. data/doc/rdoc/classes/ESI/Handler.html +236 -0
  35. data/doc/rdoc/classes/ESI/Handler.src/M000079.html +19 -0
  36. data/doc/rdoc/classes/ESI/Handler.src/M000080.html +161 -0
  37. data/doc/rdoc/classes/ESI/Handler.src/M000081.html +24 -0
  38. data/doc/rdoc/classes/ESI/Handler.src/M000082.html +18 -0
  39. data/doc/rdoc/classes/ESI/Handler.src/M000083.html +26 -0
  40. data/doc/rdoc/classes/ESI/Handler.src/M000084.html +30 -0
  41. data/doc/rdoc/classes/ESI/Invalidator.html +131 -0
  42. data/doc/rdoc/classes/ESI/Invalidator.src/M000004.html +41 -0
  43. data/doc/rdoc/classes/ESI/Log.html +251 -0
  44. data/doc/rdoc/classes/ESI/Log.src/M000005.html +18 -0
  45. data/doc/rdoc/classes/ESI/Log.src/M000006.html +18 -0
  46. data/doc/rdoc/classes/ESI/Log.src/M000007.html +18 -0
  47. data/doc/rdoc/classes/ESI/Log.src/M000008.html +18 -0
  48. data/doc/rdoc/classes/ESI/Log.src/M000009.html +18 -0
  49. data/doc/rdoc/classes/ESI/Log.src/M000010.html +18 -0
  50. data/doc/rdoc/classes/ESI/Log.src/M000011.html +18 -0
  51. data/doc/rdoc/classes/ESI/Log.src/M000012.html +18 -0
  52. data/doc/rdoc/classes/ESI/Log.src/M000013.html +18 -0
  53. data/doc/rdoc/classes/ESI/MemcachedCache.html +314 -0
  54. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000034.html +24 -0
  55. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000035.html +22 -0
  56. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000036.html +19 -0
  57. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000037.html +23 -0
  58. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000038.html +18 -0
  59. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000039.html +19 -0
  60. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000040.html +18 -0
  61. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000041.html +18 -0
  62. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000042.html +17 -0
  63. data/doc/rdoc/classes/ESI/Router.html +229 -0
  64. data/doc/rdoc/classes/ESI/Router.src/M000073.html +36 -0
  65. data/doc/rdoc/classes/ESI/Router.src/M000074.html +25 -0
  66. data/doc/rdoc/classes/ESI/Router.src/M000075.html +24 -0
  67. data/doc/rdoc/classes/ESI/RubyCache.html +278 -0
  68. data/doc/rdoc/classes/ESI/RubyCache.src/M000064.html +20 -0
  69. data/doc/rdoc/classes/ESI/RubyCache.src/M000065.html +22 -0
  70. data/doc/rdoc/classes/ESI/RubyCache.src/M000066.html +21 -0
  71. data/doc/rdoc/classes/ESI/RubyCache.src/M000067.html +22 -0
  72. data/doc/rdoc/classes/ESI/RubyCache.src/M000068.html +18 -0
  73. data/doc/rdoc/classes/ESI/RubyCache.src/M000069.html +22 -0
  74. data/doc/rdoc/classes/ESI/RubyCache.src/M000070.html +18 -0
  75. data/doc/rdoc/classes/ESI/RubyCache.src/M000071.html +18 -0
  76. data/doc/rdoc/classes/ESI/RubyCache.src/M000072.html +18 -0
  77. data/doc/rdoc/classes/ESI/Tag.html +137 -0
  78. data/doc/rdoc/classes/ESI/Tag/Attempt.html +113 -0
  79. data/doc/rdoc/classes/ESI/Tag/Base.html +267 -0
  80. data/doc/rdoc/classes/ESI/Tag/Base.src/M000028.html +26 -0
  81. data/doc/rdoc/classes/ESI/Tag/Base.src/M000029.html +23 -0
  82. data/doc/rdoc/classes/ESI/Tag/Base.src/M000030.html +22 -0
  83. data/doc/rdoc/classes/ESI/Tag/Base.src/M000031.html +18 -0
  84. data/doc/rdoc/classes/ESI/Tag/Base.src/M000032.html +22 -0
  85. data/doc/rdoc/classes/ESI/Tag/Base.src/M000033.html +23 -0
  86. data/doc/rdoc/classes/ESI/Tag/Except.html +184 -0
  87. data/doc/rdoc/classes/ESI/Tag/Except.src/M000020.html +21 -0
  88. data/doc/rdoc/classes/ESI/Tag/Except.src/M000021.html +20 -0
  89. data/doc/rdoc/classes/ESI/Tag/Except.src/M000022.html +18 -0
  90. data/doc/rdoc/classes/ESI/Tag/Include.html +189 -0
  91. data/doc/rdoc/classes/ESI/Tag/Include.src/M000017.html +20 -0
  92. data/doc/rdoc/classes/ESI/Tag/Include.src/M000018.html +18 -0
  93. data/doc/rdoc/classes/ESI/Tag/Include.src/M000019.html +125 -0
  94. data/doc/rdoc/classes/ESI/Tag/IncludeRequest.html +199 -0
  95. data/doc/rdoc/classes/ESI/Tag/IncludeRequest.src/M000014.html +18 -0
  96. data/doc/rdoc/classes/ESI/Tag/IncludeRequest.src/M000015.html +42 -0
  97. data/doc/rdoc/classes/ESI/Tag/IncludeRequest/Error.html +155 -0
  98. data/doc/rdoc/classes/ESI/Tag/IncludeRequest/Error.src/M000016.html +19 -0
  99. data/doc/rdoc/classes/ESI/Tag/Invalidate.html +171 -0
  100. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000025.html +19 -0
  101. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000026.html +51 -0
  102. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000027.html +19 -0
  103. data/doc/rdoc/classes/ESI/Tag/Try.html +161 -0
  104. data/doc/rdoc/classes/ESI/Tag/Try.src/M000023.html +40 -0
  105. data/doc/rdoc/classes/ESI/Tag/Try.src/M000024.html +18 -0
  106. data/doc/rdoc/classes/MultiDirHandler.html +198 -0
  107. data/doc/rdoc/classes/MultiDirHandler.src/M000001.html +20 -0
  108. data/doc/rdoc/classes/MultiDirHandler.src/M000002.html +28 -0
  109. data/doc/rdoc/classes/MultiDirHandler.src/M000003.html +22 -0
  110. data/doc/rdoc/classes/Net.html +119 -0
  111. data/doc/rdoc/classes/Net/An.html +114 -0
  112. data/doc/rdoc/classes/Net/An/HTTP.html +137 -0
  113. data/doc/rdoc/classes/Net/An/HTTP.src/M000087.html +17 -0
  114. data/doc/rdoc/classes/Net/An/IORequest.html +139 -0
  115. data/doc/rdoc/classes/Net/An/IORequest.src/M000088.html +17 -0
  116. data/doc/rdoc/classes/Net/An/IOResponse.html +139 -0
  117. data/doc/rdoc/classes/Net/An/IOResponse.src/M000085.html +17 -0
  118. data/doc/rdoc/classes/Net/An/IOSocket.html +137 -0
  119. data/doc/rdoc/classes/Net/An/IOSocket.src/M000086.html +17 -0
  120. data/doc/rdoc/created.rid +1 -0
  121. data/doc/rdoc/files/COPYING.html +168 -0
  122. data/doc/rdoc/files/LICENSE.html +605 -0
  123. data/doc/rdoc/files/README.html +361 -0
  124. data/doc/rdoc/files/lib/esi/cache_rb.html +113 -0
  125. data/doc/rdoc/files/lib/esi/config_rb.html +108 -0
  126. data/doc/rdoc/files/lib/esi/dispatcher_rb.html +109 -0
  127. data/doc/rdoc/files/lib/esi/handler_rb.html +121 -0
  128. data/doc/rdoc/files/lib/esi/invalidator_rb.html +117 -0
  129. data/doc/rdoc/files/lib/esi/logger_rb.html +108 -0
  130. data/doc/rdoc/files/lib/esi/router_rb.html +101 -0
  131. data/doc/rdoc/files/lib/esi/tag/attempt_rb.html +101 -0
  132. data/doc/rdoc/files/lib/esi/tag/base_rb.html +108 -0
  133. data/doc/rdoc/files/lib/esi/tag/except_rb.html +101 -0
  134. data/doc/rdoc/files/lib/esi/tag/include_rb.html +109 -0
  135. data/doc/rdoc/files/lib/esi/tag/invalidate_rb.html +109 -0
  136. data/doc/rdoc/files/lib/esi/tag/try_rb.html +108 -0
  137. data/doc/rdoc/files/lib/multi_dirhandler_rb.html +109 -0
  138. data/doc/rdoc/files/lib/net/ahttp_rb.html +109 -0
  139. data/doc/rdoc/fr_class_index.html +55 -0
  140. data/doc/rdoc/fr_file_index.html +44 -0
  141. data/doc/rdoc/fr_method_index.html +114 -0
  142. data/doc/rdoc/index.html +24 -0
  143. data/doc/rdoc/rdoc-style.css +208 -0
  144. data/ext/esi/esi_parser.c +36 -156
  145. data/ext/esi/test/parser.c +42 -43
  146. data/ext/esi/test1.rb +2 -2
  147. data/lib/esi/cache.rb +83 -72
  148. data/lib/esi/handler.rb +5 -20
  149. data/lib/multi_dirhandler.rb +13 -0
  150. data/lib/net/ahttp.rb +36 -0
  151. data/test/integration/handler_test.rb +1 -1
  152. metadata +222 -45
  153. data/test/unit/sample.html +0 -21
@@ -1,10 +1,10 @@
1
1
  require 'esi'
2
2
 
3
3
  output = ""
4
- # TODO: support passing output stream to new
4
+
5
5
  p = ESI::CParser.new
6
6
 
7
- # TODO: support attributes
7
+
8
8
  p.start_tag_handler do|tag_name, attrs|
9
9
  puts "Start: #{tag_name} #{attrs.inspect}"
10
10
  end
@@ -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
- # cache interface
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( options = OpenStruct.new({}) )
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
- # TODO: OpenStruct.marshal_dump !!!
118
- options = { :servers => options.servers,
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['servers'].inspect}"
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
- fragment = @cache[key]
177
- fragment and fragment.valid?
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
- @cache[cache_key(uri,params)]
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
- @cache[key] = Fragment.new(uri,max_age,body)
187
- sweep_unlocked!
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
- @cache.reject! {|k,v| !v.valid? }
193
+ @semaphore.synchronize { sweep_unlocked! }
193
194
  end
194
195
 
195
196
  def keys(&block)
196
- @cache.each do|key,data|
197
- yield key, data
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
 
@@ -141,15 +141,9 @@ module ESI
141
141
 
142
142
  #t = Time.now
143
143
  proxy_response.read_body do|data|
144
- begin
145
- #pt = Time.now
146
- parser.process data
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
- status, error = error_response(e,url)
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
- status = error_response(e,url).first
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
@@ -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 = {})
@@ -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
@@ -215,7 +215,7 @@ class HandlerTest < Test::Unit::TestCase
215
215
  assert_match /<p>Some markup that should not be lost<\/p>/, res.body
216
216
  end
217
217
  end
218
-
218
+
219
219
  def test_markup_in_except_passed_through
220
220
  # TODO
221
221
  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.0
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/basic_test.rb
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/malformed_transforms.html
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/esi_invalidate.html
101
- - test/integration/docs/esi_mixed_content.html
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/index.html
104
- - test/integration/docs/test1.html
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/unit
114
- - test/unit/base_tag_test.rb
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/parser.c
127
- - ext/esi/test/test.c
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/test2.rb
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/esi/cache.rb
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/invalidator.rb
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/multi_dirhandler.rb
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: 1.0.1
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