mongrel_esi 0.4.1 → 0.5.0

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 (184) hide show
  1. data/Rakefile +15 -8
  2. data/bin/mongrel_esi +0 -0
  3. data/ext/esi/common.rl +32 -27
  4. data/ext/esi/esi_parser.c +11 -4
  5. data/ext/esi/parser.c +4536 -901
  6. data/ext/esi/parser.h +7 -0
  7. data/ext/esi/parser.rl +171 -53
  8. data/ext/esi/run-test.rb +0 -0
  9. data/ext/esi/test/common.rl +32 -27
  10. data/ext/esi/test/parser.c +322 -1342
  11. data/ext/esi/test/parser.h +7 -0
  12. data/ext/esi/test/parser.rl +171 -53
  13. data/ext/esi/test/test.c +13 -4
  14. data/ext/esi/test1.rb +35 -3
  15. data/lib/esi/cache.rb +2 -1
  16. data/lib/esi/config.rb +37 -0
  17. data/lib/esi/dispatcher.rb +3 -5
  18. data/lib/esi/invalidator.rb +3 -0
  19. data/lib/esi/logger.rb +0 -7
  20. data/lib/esi/parser.rb +70 -0
  21. data/lib/esi/processor.rb +88 -0
  22. data/lib/esi/proxy.rb +104 -0
  23. data/lib/esi/response.rb +106 -0
  24. data/lib/esi/router.rb +3 -0
  25. data/lib/esi/tag/attempt.rb +3 -0
  26. data/lib/esi/tag/base.rb +3 -1
  27. data/lib/esi/tag/except.rb +2 -0
  28. data/lib/esi/tag/include.rb +131 -132
  29. data/lib/esi/tag/invalidate.rb +2 -0
  30. data/lib/esi/tag/try.rb +3 -0
  31. data/test/integration/basic_test.rb +0 -1
  32. data/test/integration/docs/esi_max_age_varies.html +10 -0
  33. data/test/integration/handler_test.rb +31 -5
  34. data/test/integration/help.rb +13 -1
  35. data/test/load_test.rb +133 -0
  36. data/test/unit/include_request_test.rb +1 -1
  37. data/test/unit/parser_test.rb +41 -5
  38. data/test/unit/response_test.rb +184 -0
  39. metadata +50 -224
  40. data/doc/rdoc/classes/ESI/Cache.html +0 -178
  41. data/doc/rdoc/classes/ESI/Cache.src/M000060.html +0 -17
  42. data/doc/rdoc/classes/ESI/Cache.src/M000061.html +0 -20
  43. data/doc/rdoc/classes/ESI/Config/CacheConfig.html +0 -212
  44. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000055.html +0 -19
  45. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000056.html +0 -19
  46. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000057.html +0 -18
  47. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000058.html +0 -18
  48. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000059.html +0 -18
  49. data/doc/rdoc/classes/ESI/Config/ConfigRouter.html +0 -187
  50. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000052.html +0 -19
  51. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000053.html +0 -21
  52. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/M000054.html +0 -21
  53. data/doc/rdoc/classes/ESI/Config.html +0 -291
  54. data/doc/rdoc/classes/ESI/Config.src/M000043.html +0 -18
  55. data/doc/rdoc/classes/ESI/Config.src/M000044.html +0 -18
  56. data/doc/rdoc/classes/ESI/Config.src/M000045.html +0 -35
  57. data/doc/rdoc/classes/ESI/Config.src/M000046.html +0 -38
  58. data/doc/rdoc/classes/ESI/Config.src/M000047.html +0 -23
  59. data/doc/rdoc/classes/ESI/Config.src/M000048.html +0 -18
  60. data/doc/rdoc/classes/ESI/Config.src/M000049.html +0 -20
  61. data/doc/rdoc/classes/ESI/Config.src/M000050.html +0 -18
  62. data/doc/rdoc/classes/ESI/Config.src/M000051.html +0 -24
  63. data/doc/rdoc/classes/ESI/Dispatcher.html +0 -172
  64. data/doc/rdoc/classes/ESI/Dispatcher.src/M000062.html +0 -23
  65. data/doc/rdoc/classes/ESI/Dispatcher.src/M000063.html +0 -20
  66. data/doc/rdoc/classes/ESI/Fragment.html +0 -218
  67. data/doc/rdoc/classes/ESI/Fragment.src/M000076.html +0 -21
  68. data/doc/rdoc/classes/ESI/Fragment.src/M000077.html +0 -18
  69. data/doc/rdoc/classes/ESI/Fragment.src/M000078.html +0 -18
  70. data/doc/rdoc/classes/ESI/Handler.html +0 -236
  71. data/doc/rdoc/classes/ESI/Handler.src/M000079.html +0 -19
  72. data/doc/rdoc/classes/ESI/Handler.src/M000080.html +0 -161
  73. data/doc/rdoc/classes/ESI/Handler.src/M000081.html +0 -24
  74. data/doc/rdoc/classes/ESI/Handler.src/M000082.html +0 -18
  75. data/doc/rdoc/classes/ESI/Handler.src/M000083.html +0 -26
  76. data/doc/rdoc/classes/ESI/Handler.src/M000084.html +0 -30
  77. data/doc/rdoc/classes/ESI/Invalidator.html +0 -131
  78. data/doc/rdoc/classes/ESI/Invalidator.src/M000004.html +0 -41
  79. data/doc/rdoc/classes/ESI/Log.html +0 -251
  80. data/doc/rdoc/classes/ESI/Log.src/M000005.html +0 -18
  81. data/doc/rdoc/classes/ESI/Log.src/M000006.html +0 -18
  82. data/doc/rdoc/classes/ESI/Log.src/M000007.html +0 -18
  83. data/doc/rdoc/classes/ESI/Log.src/M000008.html +0 -18
  84. data/doc/rdoc/classes/ESI/Log.src/M000009.html +0 -18
  85. data/doc/rdoc/classes/ESI/Log.src/M000010.html +0 -18
  86. data/doc/rdoc/classes/ESI/Log.src/M000011.html +0 -18
  87. data/doc/rdoc/classes/ESI/Log.src/M000012.html +0 -18
  88. data/doc/rdoc/classes/ESI/Log.src/M000013.html +0 -18
  89. data/doc/rdoc/classes/ESI/MemcachedCache.html +0 -314
  90. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000034.html +0 -24
  91. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000035.html +0 -22
  92. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000036.html +0 -19
  93. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000037.html +0 -23
  94. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000038.html +0 -18
  95. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000039.html +0 -19
  96. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000040.html +0 -18
  97. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000041.html +0 -18
  98. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000042.html +0 -17
  99. data/doc/rdoc/classes/ESI/Router.html +0 -229
  100. data/doc/rdoc/classes/ESI/Router.src/M000073.html +0 -36
  101. data/doc/rdoc/classes/ESI/Router.src/M000074.html +0 -25
  102. data/doc/rdoc/classes/ESI/Router.src/M000075.html +0 -24
  103. data/doc/rdoc/classes/ESI/RubyCache.html +0 -278
  104. data/doc/rdoc/classes/ESI/RubyCache.src/M000064.html +0 -20
  105. data/doc/rdoc/classes/ESI/RubyCache.src/M000065.html +0 -22
  106. data/doc/rdoc/classes/ESI/RubyCache.src/M000066.html +0 -21
  107. data/doc/rdoc/classes/ESI/RubyCache.src/M000067.html +0 -22
  108. data/doc/rdoc/classes/ESI/RubyCache.src/M000068.html +0 -18
  109. data/doc/rdoc/classes/ESI/RubyCache.src/M000069.html +0 -22
  110. data/doc/rdoc/classes/ESI/RubyCache.src/M000070.html +0 -18
  111. data/doc/rdoc/classes/ESI/RubyCache.src/M000071.html +0 -18
  112. data/doc/rdoc/classes/ESI/RubyCache.src/M000072.html +0 -18
  113. data/doc/rdoc/classes/ESI/Tag/Attempt.html +0 -113
  114. data/doc/rdoc/classes/ESI/Tag/Base.html +0 -267
  115. data/doc/rdoc/classes/ESI/Tag/Base.src/M000028.html +0 -26
  116. data/doc/rdoc/classes/ESI/Tag/Base.src/M000029.html +0 -23
  117. data/doc/rdoc/classes/ESI/Tag/Base.src/M000030.html +0 -22
  118. data/doc/rdoc/classes/ESI/Tag/Base.src/M000031.html +0 -18
  119. data/doc/rdoc/classes/ESI/Tag/Base.src/M000032.html +0 -22
  120. data/doc/rdoc/classes/ESI/Tag/Base.src/M000033.html +0 -23
  121. data/doc/rdoc/classes/ESI/Tag/Except.html +0 -184
  122. data/doc/rdoc/classes/ESI/Tag/Except.src/M000020.html +0 -21
  123. data/doc/rdoc/classes/ESI/Tag/Except.src/M000021.html +0 -20
  124. data/doc/rdoc/classes/ESI/Tag/Except.src/M000022.html +0 -18
  125. data/doc/rdoc/classes/ESI/Tag/Include.html +0 -189
  126. data/doc/rdoc/classes/ESI/Tag/Include.src/M000017.html +0 -20
  127. data/doc/rdoc/classes/ESI/Tag/Include.src/M000018.html +0 -18
  128. data/doc/rdoc/classes/ESI/Tag/Include.src/M000019.html +0 -125
  129. data/doc/rdoc/classes/ESI/Tag/IncludeRequest/Error.html +0 -155
  130. data/doc/rdoc/classes/ESI/Tag/IncludeRequest/Error.src/M000016.html +0 -19
  131. data/doc/rdoc/classes/ESI/Tag/IncludeRequest.html +0 -199
  132. data/doc/rdoc/classes/ESI/Tag/IncludeRequest.src/M000014.html +0 -18
  133. data/doc/rdoc/classes/ESI/Tag/IncludeRequest.src/M000015.html +0 -42
  134. data/doc/rdoc/classes/ESI/Tag/Invalidate.html +0 -171
  135. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000025.html +0 -19
  136. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000026.html +0 -51
  137. data/doc/rdoc/classes/ESI/Tag/Invalidate.src/M000027.html +0 -19
  138. data/doc/rdoc/classes/ESI/Tag/Try.html +0 -161
  139. data/doc/rdoc/classes/ESI/Tag/Try.src/M000023.html +0 -40
  140. data/doc/rdoc/classes/ESI/Tag/Try.src/M000024.html +0 -18
  141. data/doc/rdoc/classes/ESI/Tag.html +0 -137
  142. data/doc/rdoc/classes/ESI.html +0 -169
  143. data/doc/rdoc/classes/MultiDirHandler.html +0 -198
  144. data/doc/rdoc/classes/MultiDirHandler.src/M000001.html +0 -20
  145. data/doc/rdoc/classes/MultiDirHandler.src/M000002.html +0 -28
  146. data/doc/rdoc/classes/MultiDirHandler.src/M000003.html +0 -22
  147. data/doc/rdoc/classes/Net/An/HTTP.html +0 -137
  148. data/doc/rdoc/classes/Net/An/HTTP.src/M000087.html +0 -17
  149. data/doc/rdoc/classes/Net/An/IORequest.html +0 -139
  150. data/doc/rdoc/classes/Net/An/IORequest.src/M000088.html +0 -17
  151. data/doc/rdoc/classes/Net/An/IOResponse.html +0 -139
  152. data/doc/rdoc/classes/Net/An/IOResponse.src/M000085.html +0 -17
  153. data/doc/rdoc/classes/Net/An/IOSocket.html +0 -137
  154. data/doc/rdoc/classes/Net/An/IOSocket.src/M000086.html +0 -17
  155. data/doc/rdoc/classes/Net/An.html +0 -114
  156. data/doc/rdoc/classes/Net.html +0 -119
  157. data/doc/rdoc/created.rid +0 -1
  158. data/doc/rdoc/files/COPYING.html +0 -168
  159. data/doc/rdoc/files/LICENSE.html +0 -605
  160. data/doc/rdoc/files/README.html +0 -361
  161. data/doc/rdoc/files/lib/esi/cache_rb.html +0 -113
  162. data/doc/rdoc/files/lib/esi/config_rb.html +0 -108
  163. data/doc/rdoc/files/lib/esi/dispatcher_rb.html +0 -109
  164. data/doc/rdoc/files/lib/esi/handler_rb.html +0 -121
  165. data/doc/rdoc/files/lib/esi/invalidator_rb.html +0 -117
  166. data/doc/rdoc/files/lib/esi/logger_rb.html +0 -108
  167. data/doc/rdoc/files/lib/esi/router_rb.html +0 -101
  168. data/doc/rdoc/files/lib/esi/tag/attempt_rb.html +0 -101
  169. data/doc/rdoc/files/lib/esi/tag/base_rb.html +0 -108
  170. data/doc/rdoc/files/lib/esi/tag/except_rb.html +0 -101
  171. data/doc/rdoc/files/lib/esi/tag/include_rb.html +0 -109
  172. data/doc/rdoc/files/lib/esi/tag/invalidate_rb.html +0 -109
  173. data/doc/rdoc/files/lib/esi/tag/try_rb.html +0 -108
  174. data/doc/rdoc/files/lib/multi_dirhandler_rb.html +0 -109
  175. data/doc/rdoc/files/lib/net/ahttp_rb.html +0 -109
  176. data/doc/rdoc/fr_class_index.html +0 -55
  177. data/doc/rdoc/fr_file_index.html +0 -44
  178. data/doc/rdoc/fr_method_index.html +0 -114
  179. data/doc/rdoc/index.html +0 -24
  180. data/doc/rdoc/rdoc-style.css +0 -208
  181. data/ext/esi/parser.rb +0 -49
  182. data/ext/esi/ruby_esi.rl +0 -135
  183. data/lib/esi/handler.rb +0 -221
  184. data/lib/net/ahttp.rb +0 -36
data/ext/esi/parser.rb DELETED
@@ -1,49 +0,0 @@
1
- require 'esi/machine'
2
-
3
- module ESI
4
- class Parser < ESI::ParserMachine
5
- # Provides a stream like interface to a single parameter block
6
- class StreamCallBack
7
- def initialize(callback)
8
- @callback = callback
9
- end
10
- def << (output)
11
- @callback.call( output )
12
- end
13
- end
14
- attr_accessor :esi_tag, :output, :depth
15
-
16
- def initialize( options = {} )
17
- super()
18
- @data = nil
19
- @prev_buffer = ""
20
- @start_tag = nil # call back for when we encounter a start tag
21
- @end_tag = nil # call back for when we encounter an end tag
22
- @esi_tag = nil # the current active esi tag
23
- @output = nil
24
- @depth = options[:depth] || 0 # used to track the depth of requests include tags should be initialized with this depth
25
- end
26
-
27
- def start_tag_handler(&block)
28
- @start_tag = block
29
- end
30
-
31
- def end_tag_handler(&block)
32
- @end_tag = block
33
- end
34
-
35
- def output_handler(&block)
36
- @output = StreamCallBack.new(block)
37
- end
38
-
39
- private
40
- def stream_buffer(string)
41
- if @esi_tag
42
- @esi_tag.buffer( @output, string )# unless string.strip.empty?
43
- else
44
- @output << string
45
- end
46
- end
47
-
48
- end
49
- end
data/ext/esi/ruby_esi.rl DELETED
@@ -1,135 +0,0 @@
1
- module ESI
2
- class ParserMachine
3
-
4
- %%{
5
- machine esi;
6
-
7
- action begin {
8
- @mark = p
9
- }
10
- action finish {
11
- }
12
-
13
- # record the position of the start tag
14
- action see_start_tag {
15
- @tag_text = data[@mark,p-@mark]
16
- @tag_info = {} # store the tag attributes
17
- @tag_info[:name] = @tag_text.sub('<','').strip
18
- @tag_info[:attributes] = {}
19
- # puts "have esi tag at #{p}=>#{@mark}:#{data[p,1].inspect} with data #{@tag_text.inspect}"
20
- @mark = p
21
- }
22
-
23
- action see_end_tag {
24
- # puts "parsed esi tag at #{p}=>#{@mark}:#{data[p,1].inspect} with data #{@tag_text.inspect}"
25
- @start_tag.call @tag_info[:name], @tag_info[:attributes] if @start_tag
26
- @end_tag.call @tag_info[:name] if @end_tag
27
- @attr_key = nil
28
- @attr_value = nil
29
- @tag_text = nil
30
- @tag_info = nil
31
- }
32
-
33
- action see_block_start_with_attributes {
34
- # puts "parsed esi tag at #{p}=>#{@mark}:#{data[p,1].inspect} with data #{@tag_text.inspect}"
35
- @start_tag.call @tag_info[:name], @tag_info[:attributes] if @start_tag
36
- @attr_key = nil
37
- @attr_value = nil
38
- @tag_text = nil
39
- @tag_info = nil
40
- }
41
-
42
- action see_attribute_key {
43
- @attr_key = data[@mark,p-@mark]
44
- @mark += (@attr_key.size)
45
- @attr_key.gsub!(/^['"]/,'')
46
- @attr_key.strip!
47
- # puts "SeeAttributeKey: #{data[@mark,1].inspect}: #{data[p,1].inspect} #{@attr_key.inspect}"
48
- }
49
-
50
- action see_attribute_value {
51
- @attr_value = data[@mark,p-@mark]
52
- @attr_value.strip!
53
- @attr_value.gsub!(/^=?\s*['"]/,'')
54
- @attr_value.gsub!(/['"]$/,'')
55
-
56
- @tag_info[:attributes][@attr_key] = @attr_value
57
- # puts "SeeAttributeValue: #{p} #{data[@mark,1].inspect}: #{data[p,1].inspect} #{@attr_key.inspect} => #{@attr_value.inspect}"
58
- @mark = p
59
- }
60
-
61
- action block_start_tag {
62
- tag_text = data[@mark+1,p-@mark-1]
63
- @start_tag.call tag_text, {} if @start_tag
64
- # puts "Block start: #{p} #{tag_text}"
65
- }
66
-
67
- action block_end_tag {
68
- tag_text = data[@mark+2,p-@mark-2]
69
- @end_tag.call tag_text if @end_tag
70
- # puts "Block end: #{p} #{tag_text}"
71
- }
72
-
73
- action echo {
74
- # print " [#{data[p,1].inspect}:#{cs}] " if $debug
75
-
76
- case cs
77
- when 0
78
- # NOTE: state 12 is the character state before <esi:try>, state 7 is the character before </esi:try>
79
- # | |
80
- # - state 12 - state 7
81
- # state 60 is for empty inline tags e.g.
82
- # <esi:include/>
83
- # |
84
- # - 60
85
-
86
- if @prev_state != 12 and @prev_state != 7
87
- if !@prev_buffer.empty? and (@prev_state != (esi_en_main + 1)) and @prev_state != 60
88
- stream_buffer @prev_buffer
89
- end
90
- stream_buffer data[p,1]
91
- end
92
- @prev_buffer = ""
93
- else
94
- @prev_buffer << data[p,1]
95
- end
96
- @prev_state = cs
97
- }
98
-
99
- include esi_common_parser "common.rl";
100
- }%%
101
-
102
- def initialize
103
- %% write data;
104
- end
105
-
106
- # process a block of esi tags
107
- def process(data)
108
- if @data
109
- # puts "append : #{@mark} : #{p}"
110
- data = @data + data
111
- p = @data.length
112
- end
113
- @mark ||= 0
114
- p ||= 0
115
- pe ||= data.length
116
- @cs ||= esi_start
117
- cs = @cs
118
- # puts "process: #{cs.inspect} :start #{data.inspect}, #{p}"
119
- %% write exec;
120
- @cs = cs
121
- if( @cs != esi_start && @cs != 0 )
122
- # puts "append process: #{@cs.inspect}"
123
- @data = data
124
- else
125
- @data = nil
126
- end
127
- end
128
-
129
- def finish
130
- %% write eof;
131
- end
132
-
133
- end
134
-
135
- end
data/lib/esi/handler.rb DELETED
@@ -1,221 +0,0 @@
1
- require 'uri'
2
- require 'timeout'
3
- require 'net/http'
4
-
5
- require 'esi/logger'
6
- require 'esi/cache'
7
- require 'esi/config'
8
- require 'esi/router'
9
- require 'esi/esi'
10
- require 'esi/tag/base'
11
- require 'esi/tag/include'
12
- require 'esi/tag/invalidate'
13
- require 'esi/tag/attempt'
14
- require 'esi/tag/except'
15
- require 'esi/tag/try'
16
-
17
- module ESI
18
-
19
- class Handler
20
- attr_reader :config
21
- include ESI::Log
22
-
23
- def initialize(dispatcher)
24
- @config = dispatcher.config
25
- @router = dispatcher.router
26
- end
27
-
28
- def process(request, response)
29
-
30
- start = Time.now
31
- status = 200
32
- url = @router.url_for(request.params["REQUEST_URI"])
33
-
34
- params = http_params(request.params)
35
-
36
- proxy_error = nil
37
-
38
-
39
- log_debug "#{request.params["REQUEST_METHOD"]} => #{url}"
40
- chunk_count = 0
41
- uri = URI.parse(url)
42
-
43
- path_with_query = uri.query ? "#{uri.path}?#{uri.query}" : uri.path
44
-
45
- proxy_request = (request.params["REQUEST_METHOD"] == "POST") ?
46
- Net::HTTP::Post.new( path_with_query, params ) :
47
- Net::HTTP::Get.new( path_with_query, params )
48
-
49
- proxy_connection = Net::HTTP.start(uri.host, uri.port)
50
-
51
- # open the conneciton up so we can start to stream the connection
52
- proxy_connection.request(proxy_request,request.body.read) do|proxy_response|
53
-
54
- status = read_status( proxy_response )
55
-
56
- copy_headers( response.header, proxy_response ) unless status >= 500
57
-
58
- if status >= 500 or (status < 400 and status >= 300) or !@config.enable_esi_processor?( proxy_response )
59
- response.start(status, true) do|head,out|
60
-
61
- if status >= 500
62
- # TODO: only report this if configured to expose it
63
- out << proxy_error
64
- end
65
-
66
- # proxy the 500 response
67
- proxy_response.read_body do|fragment|
68
- out << fragment
69
- end
70
-
71
- end
72
- else
73
- # NOTE: It's very important that surrogate control headers are set to parse only if the
74
- # page has esi:include tags. Because of the nature of Transfer-Encoding: chunked if we keep
75
- # everything in memory until we reach an esi tag. Then we load the tag into memory and send the next
76
- # chunk and so on. This means that the density of tags to markup will result in more or less of the document
77
- # being stored in memory. A way we can get around this and attempt to keep a fixed size of the document in
78
- # memory at all time is by setting a buffer size of say 1024. Then no matter what we'll always chunk the document
79
- # by 1024 or some other size chunk.
80
- begin
81
- # Use the ESI Parser
82
-
83
- response.header["Transfer-Encoding"] = "chunked"
84
- # this is the important part, rather then send the whole document back we send in chunks
85
- # each fragment is roughly in it's own chunk, this does mean we require http 1.1, chunk size is still a limit
86
- header = Mongrel::Const::STATUS_FORMAT % [status, Mongrel::HTTP_STATUS_CODES[status]]
87
- header.gsub!(/Connection: close\r\n/,'')
88
- response.header.out.rewind
89
- header << response.header.out.read + Mongrel::Const::LINE_END
90
- header.gsub!(/Status:.*?\r\n/,'')
91
- response.write( header )
92
-
93
- #print header
94
-
95
- parser = ESI::CParser.new
96
- chunk_size = @config[:chunk_size] || 4096
97
- max_depth = @config[:max_depth] || 3
98
- buffer = "" # when buffer reaches chunk_size write to the response socket
99
-
100
- # handle start tags
101
- parser.start_tag_handler do|tag_name, attrs|
102
- tag = ESI::Tag::Base.create( @router,
103
- request.params,
104
- params,
105
- tag_name.gsub(/esi:/,''),
106
- attrs,
107
- @config.cache )
108
- # set the tag depth
109
- tag.depth = parser.depth if tag.respond_to?(:depth=)
110
- tag.max_depth = max_depth if tag.respond_to?(:max_depth=)
111
-
112
- if parser.esi_tag
113
- parser.esi_tag.add_child(tag)
114
- else
115
- parser.esi_tag = tag
116
- end
117
- end
118
-
119
- # handle end tags
120
- parser.end_tag_handler do|tag_name|
121
- #ct = Time.now
122
- if parser.esi_tag.name == tag_name.gsub(/esi:/,'')
123
- parser.esi_tag.close(parser.output)
124
- parser.esi_tag = nil
125
- else
126
- parser.esi_tag.close_child(parser.output,tag_name)
127
- end
128
- #puts "\t[#{tag_name}] Time to close: #{Time.now - ct}"
129
- end
130
-
131
- # handle data streaming
132
- parser.output_handler do|chars|
133
- buffer << chars
134
- if buffer.size >= chunk_size
135
- #print buffer
136
- send_chunk( response, buffer )
137
- chunk_count += 1
138
- buffer = ""
139
- end
140
- end
141
-
142
- #t = Time.now
143
- proxy_response.read_body do|data|
144
- #pt = Time.now
145
- parser.process data
146
- #puts "Time in process: #{Time.now - pt}"
147
- end
148
- #puts "Response Time: #{Time.now - t}"
149
-
150
- parser.finish
151
- parser = nil
152
-
153
- if buffer.size > 0
154
- #print buffer
155
- send_chunk( response, buffer )
156
- chunk_count += 1
157
- end
158
-
159
- rescue => e
160
- STDERR.puts "\n#{e.class}: error in #{__FILE__}:#{__LINE__}\n"
161
- end
162
- response.write( "0\r\n\r\n" )
163
- response.done = true
164
- end
165
- end # end request
166
-
167
- rescue => e
168
- STDERR.puts "\n#{e.class}: error in #{__FILE__}:#{__LINE__}\n"
169
- ensure
170
-
171
- log_request "\nCompleted => #{url}, #{Time.now - start} seconds with status #{status} and #{chunk_count} chunks\n"
172
-
173
- end
174
-
175
- protected
176
-
177
- def send_chunk( response, buffer )
178
- # send a new chunk
179
- size = buffer.size
180
- chunk_header = "#{"%x" % size}" + Mongrel::Const::LINE_END
181
- #puts chunk_header.inspect
182
- response.write( chunk_header ) # write the chunk size
183
- #puts buffer.inspect
184
- response.write( buffer + Mongrel::Const::LINE_END ) # write the chunk
185
- end
186
-
187
- def read_status(response)
188
- Net::HTTPResponse::CODE_TO_OBJ.select { |k,v| v == response.class }.first[0].to_i rescue 500
189
- end
190
-
191
- def http_params(params)
192
- updated_params = {}
193
- params.each do|k,v|
194
- k = k.split('_').collect { |t| t.capitalize }.join('-')
195
- if k[0,5] =='Http-'
196
- k[0,5] = ''
197
- updated_params[k] = v
198
- end
199
- end
200
- updated_params
201
- end
202
-
203
- def copy_headers(head,response)
204
- response.to_hash.each do |k,v|
205
- # for Set-Cookie we need to split on ,
206
- # some edge cases with , since things like expires might be a date with , in them.
207
- k = k.split(/-/).map{|s| s.capitalize }.join('-')
208
- if k == "Set-Cookie"
209
- v.each do|cookie|
210
- head["Set-Cookie"] = cookie.strip # mongrel is case sensitive about handling duplicates
211
- end
212
- else
213
- head[k] = v unless k == "Content-Length" or k == "Surrogate-Control" or k == "Server"
214
- end
215
- end
216
- head["Server"] = "MongrelESI 0.4"
217
- end
218
-
219
- end # Handler
220
-
221
- end # ESI
data/lib/net/ahttp.rb DELETED
@@ -1,36 +0,0 @@
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