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.
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