mongrel_esi 0.5.0 → 0.5.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 (202) hide show
  1. data/Rakefile +14 -6
  2. data/doc/rdoc/classes/ESI/CParser.html +122 -0
  3. data/doc/rdoc/classes/ESI/Cache.html +178 -0
  4. data/doc/rdoc/classes/ESI/Cache.src/M000085.html +17 -0
  5. data/doc/rdoc/classes/ESI/Cache.src/M000086.html +20 -0
  6. data/doc/rdoc/classes/ESI/Config.html +333 -0
  7. data/doc/rdoc/classes/ESI/Config.src/M000052.html +18 -0
  8. data/doc/rdoc/classes/ESI/Config.src/M000053.html +18 -0
  9. data/doc/rdoc/classes/ESI/Config.src/M000054.html +35 -0
  10. data/doc/rdoc/classes/ESI/Config.src/M000055.html +38 -0
  11. data/doc/rdoc/classes/ESI/Config.src/M000056.html +23 -0
  12. data/doc/rdoc/classes/ESI/Config.src/M000057.html +18 -0
  13. data/doc/rdoc/classes/ESI/Config.src/M000058.html +20 -0
  14. data/doc/rdoc/classes/ESI/Config.src/M000059.html +18 -0
  15. data/doc/rdoc/classes/ESI/Config.src/M000060.html +24 -0
  16. data/doc/rdoc/classes/ESI/Config/CacheConfig.html +212 -0
  17. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000064.html +19 -0
  18. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000065.html +19 -0
  19. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000066.html +18 -0
  20. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000067.html +18 -0
  21. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000068.html +18 -0
  22. data/doc/rdoc/classes/ESI/Config/ConfigRouter.html +187 -0
  23. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000061.html +19 -0
  24. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000062.html +21 -0
  25. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000063.html +21 -0
  26. data/doc/rdoc/classes/ESI/Dispatcher.html +172 -0
  27. data/doc/rdoc/classes/ESI/Dispatcher.src/M000087.html +22 -0
  28. data/doc/rdoc/classes/ESI/Dispatcher.src/M000088.html +18 -0
  29. data/doc/rdoc/classes/ESI/Fragment.html +218 -0
  30. data/doc/rdoc/classes/ESI/Fragment.src/M000100.html +20 -0
  31. data/doc/rdoc/classes/ESI/Fragment.src/M000101.html +18 -0
  32. data/doc/rdoc/classes/ESI/Fragment.src/M000102.html +18 -0
  33. data/doc/rdoc/classes/ESI/Invalidator.html +131 -0
  34. data/doc/rdoc/classes/ESI/Invalidator.src/M000004.html +41 -0
  35. data/doc/rdoc/classes/ESI/Log.html +221 -0
  36. data/doc/rdoc/classes/ESI/Log.src/M000030.html +18 -0
  37. data/doc/rdoc/classes/ESI/Log.src/M000031.html +18 -0
  38. data/doc/rdoc/classes/ESI/Log.src/M000032.html +18 -0
  39. data/doc/rdoc/classes/ESI/Log.src/M000033.html +18 -0
  40. data/doc/rdoc/classes/ESI/Log.src/M000034.html +18 -0
  41. data/doc/rdoc/classes/ESI/Log.src/M000035.html +18 -0
  42. data/doc/rdoc/classes/ESI/Log.src/M000036.html +18 -0
  43. data/doc/rdoc/classes/ESI/MemcachedCache.html +314 -0
  44. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000040.html +24 -0
  45. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000041.html +22 -0
  46. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000042.html +19 -0
  47. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000043.html +23 -0
  48. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000044.html +18 -0
  49. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000045.html +19 -0
  50. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000046.html +18 -0
  51. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000047.html +18 -0
  52. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000048.html +17 -0
  53. data/doc/rdoc/classes/ESI/Parser.html +184 -0
  54. data/doc/rdoc/classes/ESI/Parser.src/M000049.html +51 -0
  55. data/doc/rdoc/classes/ESI/Parser.src/M000050.html +39 -0
  56. data/doc/rdoc/classes/ESI/Parser.src/M000051.html +19 -0
  57. data/doc/rdoc/classes/ESI/Processor.html +194 -0
  58. data/doc/rdoc/classes/ESI/Processor.src/M000037.html +26 -0
  59. data/doc/rdoc/classes/ESI/Processor.src/M000038.html +44 -0
  60. data/doc/rdoc/classes/ESI/Processor.src/M000039.html +26 -0
  61. data/doc/rdoc/classes/ESI/Proxy.html +304 -0
  62. data/doc/rdoc/classes/ESI/Proxy.src/M000069.html +20 -0
  63. data/doc/rdoc/classes/ESI/Proxy.src/M000070.html +55 -0
  64. data/doc/rdoc/classes/ESI/Proxy.src/M000071.html +53 -0
  65. data/doc/rdoc/classes/ESI/Proxy.src/M000072.html +25 -0
  66. data/doc/rdoc/classes/ESI/Proxy.src/M000073.html +19 -0
  67. data/doc/rdoc/classes/ESI/Proxy.src/M000074.html +27 -0
  68. data/doc/rdoc/classes/ESI/Proxy.src/M000075.html +18 -0
  69. data/doc/rdoc/classes/ESI/Proxy.src/M000076.html +28 -0
  70. data/doc/rdoc/classes/ESI/Proxy.src/M000077.html +29 -0
  71. data/doc/rdoc/classes/ESI/Response.html +250 -0
  72. data/doc/rdoc/classes/ESI/Response.src/M000078.html +23 -0
  73. data/doc/rdoc/classes/ESI/Response.src/M000079.html +18 -0
  74. data/doc/rdoc/classes/ESI/Response.src/M000080.html +21 -0
  75. data/doc/rdoc/classes/ESI/Response.src/M000081.html +20 -0
  76. data/doc/rdoc/classes/ESI/Response.src/M000082.html +25 -0
  77. data/doc/rdoc/classes/ESI/Response.src/M000083.html +18 -0
  78. data/doc/rdoc/classes/ESI/Response.src/M000084.html +33 -0
  79. data/doc/rdoc/classes/ESI/Router.html +212 -0
  80. data/doc/rdoc/classes/ESI/Router.src/M000098.html +36 -0
  81. data/doc/rdoc/classes/ESI/Router.src/M000099.html +25 -0
  82. data/doc/rdoc/classes/ESI/RubyCache.html +278 -0
  83. data/doc/rdoc/classes/ESI/RubyCache.src/M000089.html +20 -0
  84. data/doc/rdoc/classes/ESI/RubyCache.src/M000090.html +20 -0
  85. data/doc/rdoc/classes/ESI/RubyCache.src/M000091.html +20 -0
  86. data/doc/rdoc/classes/ESI/RubyCache.src/M000092.html +22 -0
  87. data/doc/rdoc/classes/ESI/RubyCache.src/M000093.html +18 -0
  88. data/doc/rdoc/classes/ESI/RubyCache.src/M000094.html +22 -0
  89. data/doc/rdoc/classes/ESI/RubyCache.src/M000095.html +18 -0
  90. data/doc/rdoc/classes/ESI/RubyCache.src/M000096.html +18 -0
  91. data/doc/rdoc/classes/ESI/RubyCache.src/M000097.html +18 -0
  92. data/doc/rdoc/classes/ESI/Tag.html +141 -0
  93. data/doc/rdoc/classes/ESI/Tag/Attempt.html +113 -0
  94. data/doc/rdoc/classes/ESI/Tag/Base.html +237 -0
  95. data/doc/rdoc/classes/ESI/Tag/Base.src/M000026.html +23 -0
  96. data/doc/rdoc/classes/ESI/Tag/Base.src/M000027.html +22 -0
  97. data/doc/rdoc/classes/ESI/Tag/Base.src/M000028.html +22 -0
  98. data/doc/rdoc/classes/ESI/Tag/Base.src/M000029.html +17 -0
  99. data/doc/rdoc/classes/ESI/Tag/Container.html +206 -0
  100. data/doc/rdoc/classes/ESI/Tag/Container.src/M000015.html +20 -0
  101. data/doc/rdoc/classes/ESI/Tag/Container.src/M000016.html +22 -0
  102. data/doc/rdoc/classes/ESI/Tag/Container.src/M000017.html +25 -0
  103. data/doc/rdoc/classes/ESI/Tag/Except.html +184 -0
  104. data/doc/rdoc/classes/ESI/Tag/Except.src/M000018.html +21 -0
  105. data/doc/rdoc/classes/ESI/Tag/Except.src/M000019.html +20 -0
  106. data/doc/rdoc/classes/ESI/Tag/Except.src/M000020.html +18 -0
  107. data/doc/rdoc/classes/ESI/Tag/Include.html +257 -0
  108. data/doc/rdoc/classes/ESI/Tag/Include.src/M000005.html +20 -0
  109. data/doc/rdoc/classes/ESI/Tag/Include.src/M000006.html +18 -0
  110. data/doc/rdoc/classes/ESI/Tag/Include.src/M000007.html +34 -0
  111. data/doc/rdoc/classes/ESI/Tag/Include.src/M000008.html +22 -0
  112. data/doc/rdoc/classes/ESI/Tag/Include.src/M000009.html +27 -0
  113. data/doc/rdoc/classes/ESI/Tag/Include.src/M000010.html +30 -0
  114. data/doc/rdoc/classes/ESI/Tag/Include.src/M000011.html +51 -0
  115. data/doc/rdoc/classes/ESI/Tag/Include/Request.html +199 -0
  116. data/doc/rdoc/classes/ESI/Tag/Include/Request.src/M000012.html +18 -0
  117. data/doc/rdoc/classes/ESI/Tag/Include/Request.src/M000013.html +44 -0
  118. data/doc/rdoc/classes/ESI/Tag/Include/Request/Error.html +155 -0
  119. data/doc/rdoc/classes/ESI/Tag/Include/Request/Error.src/M000014.html +19 -0
  120. data/doc/rdoc/classes/ESI/Tag/Invalidate.html +171 -0
  121. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000023.html +19 -0
  122. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000024.html +51 -0
  123. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000025.html +19 -0
  124. data/doc/rdoc/classes/ESI/Tag/Try.html +154 -0
  125. data/doc/rdoc/classes/ESI/Tag/Try.src/M000021.html +38 -0
  126. data/doc/rdoc/classes/ESI/Tag/Try.src/M000022.html +18 -0
  127. data/doc/rdoc/classes/MultiDirHandler.html +198 -0
  128. data/doc/rdoc/classes/MultiDirHandler.src/M000001.html +20 -0
  129. data/doc/rdoc/classes/MultiDirHandler.src/M000002.html +28 -0
  130. data/doc/rdoc/classes/MultiDirHandler.src/M000003.html +22 -0
  131. data/doc/rdoc/created.rid +1 -0
  132. data/doc/rdoc/files/COPYING.html +167 -0
  133. data/doc/rdoc/files/LICENSE.html +605 -0
  134. data/doc/rdoc/files/README.html +359 -0
  135. data/doc/rdoc/files/ext/esi/common_rl.html +160 -0
  136. data/doc/rdoc/files/ext/esi/esi_parser_c.html +101 -0
  137. data/doc/rdoc/files/ext/esi/parser_c.html +101 -0
  138. data/doc/rdoc/files/ext/esi/parser_h.html +101 -0
  139. data/doc/rdoc/files/ext/esi/parser_rl.html +827 -0
  140. data/doc/rdoc/files/ext/esi/test/common_rl.html +160 -0
  141. data/doc/rdoc/files/ext/esi/test/parser_c.html +101 -0
  142. data/doc/rdoc/files/ext/esi/test/parser_h.html +101 -0
  143. data/doc/rdoc/files/ext/esi/test/parser_rl.html +827 -0
  144. data/doc/rdoc/files/ext/esi/test/sp_c.html +101 -0
  145. data/doc/rdoc/files/ext/esi/test/test_c.html +101 -0
  146. data/doc/rdoc/files/lib/esi/cache_rb.html +119 -0
  147. data/doc/rdoc/files/lib/esi/config_rb.html +114 -0
  148. data/doc/rdoc/files/lib/esi/dispatcher_rb.html +108 -0
  149. data/doc/rdoc/files/lib/esi/invalidator_rb.html +114 -0
  150. data/doc/rdoc/files/lib/esi/logger_rb.html +108 -0
  151. data/doc/rdoc/files/lib/esi/parser_rb.html +120 -0
  152. data/doc/rdoc/files/lib/esi/processor_rb.html +115 -0
  153. data/doc/rdoc/files/lib/esi/proxy_rb.html +123 -0
  154. data/doc/rdoc/files/lib/esi/response_rb.html +116 -0
  155. data/doc/rdoc/files/lib/esi/router_rb.html +107 -0
  156. data/doc/rdoc/files/lib/esi/tag/attempt_rb.html +114 -0
  157. data/doc/rdoc/files/lib/esi/tag/base_rb.html +114 -0
  158. data/doc/rdoc/files/lib/esi/tag/container_rb.html +115 -0
  159. data/doc/rdoc/files/lib/esi/tag/except_rb.html +114 -0
  160. data/doc/rdoc/files/lib/esi/tag/include_rb.html +116 -0
  161. data/doc/rdoc/files/lib/esi/tag/invalidate_rb.html +115 -0
  162. data/doc/rdoc/files/lib/esi/tag/try_rb.html +115 -0
  163. data/doc/rdoc/files/lib/esi/version_rb.html +101 -0
  164. data/doc/rdoc/files/lib/multi_dirhandler_rb.html +109 -0
  165. data/doc/rdoc/fr_class_index.html +53 -0
  166. data/doc/rdoc/fr_file_index.html +59 -0
  167. data/doc/rdoc/fr_method_index.html +128 -0
  168. data/doc/rdoc/index.html +24 -0
  169. data/doc/rdoc/rdoc-style.css +208 -0
  170. data/ext/esi/esi_parser.c +12 -1
  171. data/ext/esi/parser.c +492 -3927
  172. data/ext/esi/parser.rl +83 -14
  173. data/ext/esi/test/parser.c +1587 -367
  174. data/ext/esi/test/parser.rl +83 -14
  175. data/ext/esi/test/sp.c +125 -0
  176. data/ext/esi/test/test.c +198 -6
  177. data/lib/esi/cache.rb +5 -8
  178. data/lib/esi/config.rb +3 -3
  179. data/lib/esi/dispatcher.rb +2 -4
  180. data/lib/esi/parser.rb +26 -13
  181. data/lib/esi/processor.rb +13 -35
  182. data/lib/esi/proxy.rb +113 -44
  183. data/lib/esi/response.rb +23 -55
  184. data/lib/esi/router.rb +0 -11
  185. data/lib/esi/tag/attempt.rb +2 -1
  186. data/lib/esi/tag/base.rb +1 -24
  187. data/lib/esi/tag/container.rb +40 -0
  188. data/lib/esi/tag/except.rb +3 -1
  189. data/lib/esi/tag/include.rb +53 -62
  190. data/lib/esi/tag/try.rb +16 -18
  191. data/lib/esi/version.rb +9 -0
  192. data/test/integration/handler_test.rb +49 -12
  193. data/test/integration/help.rb +12 -0
  194. data/test/load_test.rb +8 -4
  195. data/test/load_test_ab.rb +8 -0
  196. data/test/sample.html +31 -0
  197. data/test/unit/help.rb +12 -8
  198. data/test/unit/include_request_test.rb +14 -21
  199. data/test/unit/parser_test.rb +2 -1
  200. data/test/unit/response_test.rb +4 -8
  201. data/tools/rakehelp.rb +1 -1
  202. metadata +216 -5
data/lib/esi/router.rb CHANGED
@@ -23,7 +23,6 @@ module ESI
23
23
  # default:
24
24
  # host: 127.0.01
25
25
  # port: 3001
26
- # cache_ttl: 300
27
26
  #
28
27
  # This example will cache all requests for 300 seconds, by default.
29
28
  #
@@ -72,16 +71,6 @@ module ESI
72
71
  "http://" + (config[:host] + ":" + (config[:port] || "").to_s + "/" + request_uri).squeeze("/")
73
72
  end
74
73
 
75
- def cache_ttl( request_uri )
76
- return 600 if request_uri.match(/http:\/\//) # default cache for absolute URLs
77
- # locate the first entry to match the given uri
78
- config = @hosts.find do |cfg|
79
- Regexp.new(cfg[:match_url]).match(request_uri)
80
- end
81
- config = @default unless config
82
- (config[:cache_ttl] || 600).to_i
83
- end
84
-
85
74
  end
86
75
 
87
76
  end
@@ -1,9 +1,10 @@
1
1
  # Copyright (c) 2008 Todd A. Fisher
2
2
  # see LICENSE
3
+ require 'esi/tag/container'
3
4
 
4
5
  module ESI
5
6
  module Tag
6
- class Attempt < Base
7
+ class Attempt < Container
7
8
  end
8
9
  end
9
10
  end
data/lib/esi/tag/base.rb CHANGED
@@ -9,7 +9,6 @@ module ESI
9
9
  attr_reader :attributes, :children, :name, :closed, :cache
10
10
 
11
11
  include ESI::Log
12
- extend ESI::Log
13
12
 
14
13
  def initialize(router,headers,http_params,name,attrs,cache)
15
14
  @router = router
@@ -17,16 +16,12 @@ module ESI
17
16
  @http_params = http_params
18
17
  @attributes = attrs
19
18
  @cache = cache
20
- @children = []
21
19
  @name = name
22
- @unclosed = nil
23
- @closed = false
24
20
  end
25
21
 
26
22
  def self.create(router,headers,http_params,tag_name,attrs,cache)
27
- tag_name.gsub!(/esi:/,'')
28
23
  raise "Unsupport ESI tag: #{tag_name}" unless Validate.include?(tag_name)
29
- eval(tag_name.capitalize).new(router,headers,http_params,tag_name,attrs,cache)
24
+ eval(tag_name.sub(/esi:/,'').capitalize).new(router,headers,http_params,tag_name,attrs,cache)
30
25
  rescue => e
31
26
  log_debug "Failed while creating tag: #{tag_name}, with error: #{e.message}"
32
27
  raise e
@@ -41,24 +36,6 @@ module ESI
41
36
  end
42
37
 
43
38
  def close( output, options = {} )
44
- @closed = true
45
- end
46
-
47
- def close_child( output, name )
48
- name = name.gsub(/esi:/,'')
49
- if @unclosed and @unclosed.name == name
50
- @unclosed.close( output )
51
- @unclosed = nil
52
- end
53
- end
54
-
55
- def add_child(tag)
56
- if @unclosed
57
- @unclosed.add_child(tag)
58
- else
59
- @unclosed = tag
60
- @children << tag
61
- end
62
39
  end
63
40
 
64
41
  # :startdoc:
@@ -0,0 +1,40 @@
1
+ # Copyright (c) 2008 Todd A. Fisher
2
+ # see LICENSE
3
+ require 'esi/logger'
4
+ require 'esi/tag/base'
5
+
6
+ module ESI
7
+ module Tag
8
+ class Container < ESI::Tag::Base
9
+ include ESI::Log
10
+ extend ESI::Log
11
+ attr_reader :children, :name, :closed, :cache
12
+
13
+ def initialize(router,headers,http_params,name,attrs,cache)
14
+ super
15
+ @children = []
16
+ @unclosed = nil
17
+ end
18
+
19
+ def close_child( output, name )
20
+ name = name.sub(/esi:/,'')
21
+ if @unclosed and @unclosed.name == name
22
+ @unclosed.close( output )
23
+ @unclosed = nil
24
+ end
25
+ end
26
+
27
+ def add_child(tag)
28
+ if @unclosed
29
+ #puts "add as child of(#{self.name}): #{tag.name} #{tag.attributes.inspect} to #{@unclosed.name}"
30
+ @unclosed.add_child(tag)
31
+ else
32
+ #puts "add: #{tag.name} #{tag.attributes.inspect} to #{self.name}"
33
+ @unclosed = tag if tag.respond_to?(:add_child)
34
+ @children << tag
35
+ end
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -1,8 +1,10 @@
1
1
  # Copyright (c) 2008 Todd A. Fisher
2
2
  # see LICENSE
3
+ require 'esi/tag/container'
4
+
3
5
  module ESI
4
6
  module Tag
5
- class Except < Base
7
+ class Except < Container
6
8
  attr_reader :buffers
7
9
 
8
10
  def initialize(uri,headers,http_params,name,attrs,cache)
@@ -34,34 +34,34 @@ module ESI
34
34
  @headers = forward_headers
35
35
  end
36
36
 
37
- def request(uri, timeout = 1, alt_failover=nil, follow_limit=3)
38
- uri = URI.parse(uri) if uri.is_a?(String)
37
+ def request(url, timeout = 1, alt_failover=nil, follow_limit=3)
38
+ uri = URI.parse(url)
39
39
  Net::HTTP.start(uri.host, uri.port) do|http|
40
40
  http.read_timeout = timeout if timeout and timeout > 0
41
41
  rp = uri.query ? "#{uri.path}?#{uri.query}" : uri.path
42
42
  http.request_get( rp, @headers ) do|response|
43
43
  case response
44
44
  when Net::HTTPSuccess
45
- yield true, response, uri
45
+ yield true, response, url
46
46
  when Net::HTTPRedirection
47
47
  ir = Request.new(@headers)
48
- ir.request(URI.parse(response['location']), timeout, alt_failover, follow_limit - 1) do|s,r|
49
- yield s, r, URI.parse(response['location'])
48
+ ir.request(response['location'], timeout, alt_failover, follow_limit - 1) do|s,r|
49
+ yield s, r, response['location']
50
50
  end
51
51
  else
52
52
  if alt_failover
53
53
  ir = Request.new(@headers)
54
54
  ir.request(alt_failover, timeout, nil, follow_limit) do|s,r|
55
- yield s, r, URI.parse(alt_failover)
55
+ yield s, r, alt_failover
56
56
  end
57
57
  else
58
- yield false, Error.new("Failed to request fragment: #{uri.scheme}://#{uri.host}:#{uri.port}#{uri.path}", response), uri
58
+ yield false, Error.new("Failed to request fragment: #{uri.scheme}://#{uri.host}:#{uri.port}#{uri.path}", response), url
59
59
  end
60
60
  end
61
61
  end
62
62
  end
63
63
  rescue Timeout::Error => e
64
- yield false, Error.new("Failed to request fragment: #{uri.scheme}://#{uri.host}:#{uri.port}#{uri.path}, timeout error: #{e.message}", nil), uri
64
+ yield false, Error.new("Failed to request fragment: #{uri.scheme}://#{uri.host}:#{uri.port}#{uri.path}, timeout error: #{e.message}", nil), url
65
65
  end
66
66
 
67
67
  end
@@ -93,7 +93,7 @@ module ESI
93
93
  if @cache.cached?( src, @http_params )
94
94
  send_from_cache( src )
95
95
  else
96
- send_from_surrogate( src, alt, raise_on_error )
96
+ send_from_origin( src, alt, raise_on_error )
97
97
  end
98
98
 
99
99
  end
@@ -102,75 +102,29 @@ module ESI
102
102
  def prepare_parser
103
103
  if parse_fragment?
104
104
  @parser = ESI::Parser.new( @output, @router, @cache, @max_depth )
105
- @parser.prepare( @headers, @http_params ) do|chars|
106
- if @parser.response.active_buffer.closed_write?
107
- @parser.response.open_active_buffer
108
- @parser.response.send
109
- end
110
- @parser.response.active_buffer << chars
111
- end
105
+ @parser.prepare( @headers, @http_params )
112
106
  @parser.depth = (@depth+1) # increment the depth
113
107
  end
114
108
  end
115
109
 
116
110
  def send_from_cache( src )
117
111
  cached_fragment = @cache.get( src, @headers ).body
118
- log_request "C"
119
- if parse_fragment?
112
+ #log_request "C"
120
113
 
114
+ if parse_fragment? and cached_fragment.match(/<esi:/)
121
115
  @parser.process cached_fragment
122
116
  @parser.finish
123
-
124
117
  else
125
118
  @output << cached_fragment
126
119
  end
127
120
 
128
121
  end
129
122
 
130
- def send_from_surrogate( src, alt, raise_on_error )
131
- ir = Request.new(@http_params)
132
- #timer = Time.now
133
- ir.request(src, @attributes['timeout'].to_i, alt ) do|status,response,uri|
123
+ def send_from_origin( src, alt, raise_on_error )
124
+ #log_request "R"
125
+ Request.new(@http_params).request(src, @attributes['timeout'].to_i, alt ) do|status,response,url|
134
126
  if status
135
- # NOTE: it's important that we cache the unprocessed markup, because we need to
136
- # reprocess the esi:include vars even for cached content, this way we can have cached content
137
- # with HTTP_COOKIE vars and avoid re-requesting content
138
- cache_buffer = ""
139
- response.read_body do|s|
140
- cache_buffer << s
141
- if parse_fragment?
142
- @parser.process s
143
- else
144
- @output << s
145
- end
146
- end
147
-
148
- if parse_fragment?
149
- @parser.finish
150
- end
151
-
152
- if src != uri # these won't be equal if the fragment followed a redirect or used the alt condition
153
- if uri.query
154
- request_uri = "#{uri.scheme}://#{uri.host}:#{uri.port}#{uri.path}?#{uri.query}"
155
- else
156
- request_uri = "#{uri.scheme}://#{uri.host}:#{uri.port}#{uri.path}"
157
- end
158
- else
159
- request_uri = src
160
- end
161
-
162
- cache_ttl = (@attributes['max-age']||600) # defaults to 600... maybe should have this be configurable?
163
- if cache_ttl.respond_to?(:match) and cache_ttl.match(/\+/)
164
- total=0
165
- cache_ttl.split('+').each {|comp| total+=comp.to_i}
166
- cache_ttl = total
167
- else
168
- cache_ttl = cache_ttl.to_i
169
- end
170
-
171
- @cache.put(request_uri, @http_params, cache_ttl, cache_buffer )
172
- #log_request "R #{src} #{Time.now - timer}\n"
173
-
127
+ process_successful_response( url, status, response )
174
128
  else
175
129
  # error/ check if the include has an onerror specifier
176
130
  return if @attributes['onerror'] == 'continue'
@@ -182,6 +136,43 @@ module ESI
182
136
  end
183
137
  end
184
138
 
139
+ def process_successful_response( url, status, response )
140
+ # NOTE: it's important that we cache the unprocessed markup, because we need to
141
+ # reprocess the esi:include vars even for cached content, this way we can have cached content
142
+ # with HTTP_COOKIE vars and avoid re-requesting content
143
+ cache_buffer = ""
144
+ if parse_fragment?
145
+ response.read_body do|s|
146
+ cache_buffer << s
147
+ end
148
+ if cache_buffer.match(/<esi:/)
149
+ @parser.process cache_buffer
150
+ @parser.finish
151
+ else
152
+ @output << cache_buffer
153
+ end
154
+ else
155
+ response.read_body do|s|
156
+ cache_buffer << s
157
+ end
158
+ @output << cache_buffer
159
+ end
160
+
161
+ request_uri = url
162
+
163
+ cache_ttl = (@attributes['max-age']||600) # defaults to 600... maybe should have this be configurable?
164
+ if cache_ttl.respond_to?(:match) and cache_ttl.match(/\+/)
165
+ total=0
166
+ cache_ttl.split('+').each {|comp| total+=comp.to_i}
167
+ cache_ttl = total
168
+ else
169
+ cache_ttl = cache_ttl.to_i
170
+ end
171
+
172
+ @cache.put(request_uri, @http_params, cache_ttl, cache_buffer )
173
+ #log_request "R #{src} #{Time.now - timer}\n"
174
+ end
175
+
185
176
 
186
177
  end
187
178
 
data/lib/esi/tag/try.rb CHANGED
@@ -2,34 +2,32 @@
2
2
  # see LICENSE
3
3
 
4
4
  require 'esi/logger'
5
+ require 'esi/tag/container'
5
6
 
6
7
  module ESI
7
8
  module Tag
8
- class Try < Base
9
- include ESI::Log
10
-
9
+ class Try < Container
10
+
11
11
  def close( output )
12
12
  super(output)
13
13
  begin
14
- attempt = @children.detect{|tag| tag.name == "attempt" }
15
- attempt.children.each do|tag|
16
- tag.close( output, :raise => true )
14
+ @children.each do |tag|
15
+ if tag.name == "attempt"
16
+ tag.children.each do|ctag|
17
+ ctag.close( output, :raise => true )
18
+ end
19
+ end
17
20
  end
18
21
  rescue => e
19
22
  log_error e.message
20
- except = @children.detect{|tag| tag.name == "except" }
21
- except.children.each_with_index do|tag,index|
22
- if( output.respond_to?('<<') )
23
- output << except.buffers[index]
24
- else
25
- output.call except.buffers[index]
23
+ @children.each do |tag|
24
+ if tag.name == "except"
25
+ tag.children.each_with_index do|ctag,index|
26
+ output << tag.buffers[index]
27
+ ctag.close( output )
28
+ end
29
+ output << tag.buffers[tag.children.size]
26
30
  end
27
- tag.close( output )
28
- end
29
- if( output.respond_to?('<<') )
30
- output << except.buffers[except.children.size]
31
- else
32
- output.call except.buffers[except.children.size]
33
31
  end
34
32
  end
35
33
  end
@@ -0,0 +1,9 @@
1
+ module ESI #:nodoc:
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 5
5
+ TINY = 1
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
@@ -15,16 +15,48 @@ class HandlerTest < Test::Unit::TestCase
15
15
  end
16
16
  check_status results, String
17
17
  end
18
-
18
+
19
+ def simple_response_assertions(res)
20
+ assert_not_nil res
21
+ assert_not_nil res.header
22
+ assert_not_nil res.body
23
+ assert_equal Net::HTTPOK, res.header.class
24
+ assert_match '<html>', res.body, "Missing document head"
25
+ assert_match $fragment_test1, res.body, "Fragment not found"
26
+ assert_match $fragment_test2, res.body, "Fragment not found"
27
+ assert_match '</html>', res.body, "Missing document footer"
28
+ assert_equal %{<html>\n<head>\n</head>\n<body>\n <h1>This is a test document</h1>\n \n valid\n \n <div>test1</div>\n\n \n \n <div>test2</div>\n\n</body>\n</html>\n}, res.body
29
+ assert_no_match /<esi:/, res.body # assert there are no esi tags in the result
30
+ end
31
+
19
32
  def test_simple_esi
20
33
  Net::HTTP.start("localhost", 9997) do |h|
21
- req = h.get("/esi_test_content.html")
22
- assert_not_nil req
23
- assert_not_nil req.header
24
- assert_not_nil req.body
25
- assert_equal Net::HTTPOK, req.header.class
26
- assert_match $fragment_test1, req.body, "Fragment not found"
27
- assert_match $fragment_test2, req.body, "Fragment not found"
34
+ res = h.get("/esi_test_content.html")
35
+ simple_response_assertions(res)
36
+ end
37
+ end
38
+
39
+ def test_simple_esi_http10
40
+ Net::HTTP.start("localhost", 9997) do |h|
41
+ res = h.get("/esi_test_content.html",{"VERSION" => "HTTP/1.0"})
42
+ simple_response_assertions(res)
43
+ end
44
+ end
45
+
46
+ def test_page_surrogate_control_max_age
47
+ Net::HTTP.start("localhost", 9997) do |h|
48
+ res = h.get("/surrogate-test",{"Surrogate-Control" => %{max-age=10, content="ESI/1.0"}})
49
+ simple_response_assertions(res)
50
+ assert res.header.to_hash.key?("transfer-encoding")
51
+ assert !res.header.to_hash.key?("content-length")
52
+ assert_equal "chunked", res.header["transfer-encoding"]
53
+ end
54
+ Net::HTTP.start("localhost", 9997) do |h|
55
+ res = h.get("/surrogate-test",{"Surrogate-Control" => %{max-age=10, content="ESI/1.0"}})
56
+ simple_response_assertions(res)
57
+ assert !res.header.to_hash.key?("transfer-encoding")
58
+ assert res.header.to_hash.key?("content-length")
59
+ assert_equal "156", res.header["content-length"]
28
60
  end
29
61
  end
30
62
 
@@ -36,6 +68,9 @@ class HandlerTest < Test::Unit::TestCase
36
68
  assert_not_nil req.body
37
69
  assert_equal Net::HTTPOK, req.header.class
38
70
  assert_match $fragment_test1, req.body, "Fragment not found"
71
+ assert_match "</html>", req.body, "End tag not found"
72
+ assert_no_match /<p>sorry<\/p>/, req.body, "Should not see any fragment failures"
73
+ assert_no_match /<esi:/, req.body # assert there are no esi tags in the result
39
74
  # should have 37 fragments
40
75
  count = 0
41
76
  req.body.scan $fragment_test1 do|m|
@@ -87,7 +122,7 @@ class HandlerTest < Test::Unit::TestCase
87
122
  assert_equal "/esi_test_content.html", res["Location"]
88
123
  end
89
124
  end
90
-
125
+
91
126
  # test that we're including http headers as part of the request fragment cache
92
127
  def test_ajax_caching
93
128
  # start by making the request using the X-Requested-With Header
@@ -196,9 +231,11 @@ class HandlerTest < Test::Unit::TestCase
196
231
  assert_not_nil res.body
197
232
  #puts res.body
198
233
  assert_equal Net::HTTPOK, res.header.class, res.body
199
- assert_match /<div>test1<\/div>/, res.body, "Normal esi include tags failed"
200
- assert_match /<div>test1<\/div>/, res.body, "Normal esi include tags failed"
201
- assert_match /<a href="www.akamai.com">www.example.com <\/a>/, res.body, "Static Failover failed"
234
+ assert_match "<html>", res.body
235
+ assert_match "<div>test1</div>", res.body, "Normal esi include tags failed"
236
+ assert_match "<div>test1</div>", res.body, "Normal esi include tags failed"
237
+ assert_match %{<a href="www.akamai.com">www.example.com </a>}, res.body, "Static Failover failed"
238
+ assert_match "</html>", res.body
202
239
  end
203
240
  end
204
241