mongrel_esi 0.5.1 → 0.5.2

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 (179) hide show
  1. data/README +10 -9
  2. data/doc/rdoc/classes/ESI/Cache.html +10 -10
  3. data/doc/rdoc/classes/ESI/Cache.src/{M000085.html → M000087.html} +0 -0
  4. data/doc/rdoc/classes/ESI/Cache.src/{M000086.html → M000088.html} +0 -0
  5. data/doc/rdoc/classes/ESI/Config.html +43 -62
  6. data/doc/rdoc/classes/ESI/Config.src/M000049.html +18 -0
  7. data/doc/rdoc/classes/ESI/Config.src/{M000059.html → M000050.html} +5 -5
  8. data/doc/rdoc/classes/ESI/Config.src/M000051.html +35 -0
  9. data/doc/rdoc/classes/ESI/Config.src/M000052.html +27 -5
  10. data/doc/rdoc/classes/ESI/Config.src/M000053.html +10 -5
  11. data/doc/rdoc/classes/ESI/Config.src/M000054.html +5 -22
  12. data/doc/rdoc/classes/ESI/Config.src/M000055.html +7 -25
  13. data/doc/rdoc/classes/ESI/Config.src/M000056.html +11 -10
  14. data/doc/rdoc/classes/ESI/Config/CacheConfig.html +25 -25
  15. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/{M000068.html → M000060.html} +6 -5
  16. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/{M000065.html → M000061.html} +5 -5
  17. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/{M000066.html → M000062.html} +4 -4
  18. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/{M000067.html → M000063.html} +4 -4
  19. data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000064.html +5 -6
  20. data/doc/rdoc/classes/ESI/Config/ConfigRouter.html +15 -15
  21. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/{M000061.html → M000057.html} +5 -5
  22. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/{M000062.html → M000058.html} +7 -7
  23. data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/{M000063.html → M000059.html} +7 -7
  24. data/doc/rdoc/classes/ESI/Dispatcher.html +17 -15
  25. data/doc/rdoc/classes/ESI/Dispatcher.src/{M000087.html → M000092.html} +4 -7
  26. data/doc/rdoc/classes/ESI/Dispatcher.src/M000093.html +27 -0
  27. data/doc/rdoc/classes/ESI/Fragment.html +15 -15
  28. data/doc/rdoc/classes/ESI/Fragment.src/{M000100.html → M000111.html} +0 -0
  29. data/doc/rdoc/classes/ESI/Fragment.src/{M000101.html → M000112.html} +0 -0
  30. data/doc/rdoc/classes/ESI/Fragment.src/{M000102.html → M000113.html} +0 -0
  31. data/doc/rdoc/classes/ESI/MemcachedCache.html +46 -46
  32. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000037.html +24 -0
  33. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000038.html +22 -0
  34. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000039.html +19 -0
  35. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000040.html +10 -11
  36. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000041.html +5 -9
  37. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000042.html +6 -6
  38. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000043.html +5 -10
  39. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000044.html +5 -5
  40. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000045.html +4 -6
  41. data/doc/rdoc/classes/ESI/OutputAdapter.html +204 -0
  42. data/doc/rdoc/classes/ESI/OutputAdapter.src/M000094.html +37 -0
  43. data/doc/rdoc/classes/ESI/OutputAdapter.src/M000095.html +18 -0
  44. data/doc/rdoc/classes/ESI/OutputAdapter.src/M000096.html +18 -0
  45. data/doc/rdoc/classes/ESI/OutputAdapter.src/M000097.html +18 -0
  46. data/doc/rdoc/classes/ESI/Parser.html +15 -15
  47. data/doc/rdoc/classes/ESI/Parser.src/{M000049.html → M000065.html} +0 -0
  48. data/doc/rdoc/classes/ESI/Parser.src/{M000050.html → M000066.html} +0 -0
  49. data/doc/rdoc/classes/ESI/Parser.src/{M000051.html → M000067.html} +0 -0
  50. data/doc/rdoc/classes/ESI/Processor.html +15 -15
  51. data/doc/rdoc/classes/ESI/Processor.src/{M000037.html → M000046.html} +0 -0
  52. data/doc/rdoc/classes/ESI/Processor.src/{M000038.html → M000047.html} +1 -1
  53. data/doc/rdoc/classes/ESI/Processor.src/{M000039.html → M000048.html} +0 -0
  54. data/doc/rdoc/classes/ESI/Proxy.html +48 -48
  55. data/doc/rdoc/classes/ESI/Proxy.src/M000071.html +7 -40
  56. data/doc/rdoc/classes/ESI/Proxy.src/M000072.html +50 -12
  57. data/doc/rdoc/classes/ESI/Proxy.src/M000073.html +49 -6
  58. data/doc/rdoc/classes/ESI/Proxy.src/M000074.html +11 -14
  59. data/doc/rdoc/classes/ESI/Proxy.src/M000075.html +6 -5
  60. data/doc/rdoc/classes/ESI/Proxy.src/M000076.html +9 -15
  61. data/doc/rdoc/classes/ESI/Proxy.src/M000077.html +5 -16
  62. data/doc/rdoc/classes/ESI/Proxy.src/M000078.html +28 -0
  63. data/doc/rdoc/classes/ESI/Proxy.src/M000079.html +29 -0
  64. data/doc/rdoc/classes/ESI/RackAdapter.html +214 -0
  65. data/doc/rdoc/classes/ESI/RackAdapter.src/M000068.html +18 -0
  66. data/doc/rdoc/classes/ESI/RackAdapter.src/M000069.html +34 -0
  67. data/doc/rdoc/classes/ESI/{MemcachedCache.src/M000048.html → RackAdapter.src/M000070.html} +4 -4
  68. data/doc/rdoc/classes/ESI/RackConfig.html +173 -0
  69. data/doc/rdoc/classes/ESI/RackConfig.src/M000089.html +28 -0
  70. data/doc/rdoc/classes/ESI/RackConfig.src/M000090.html +18 -0
  71. data/doc/rdoc/classes/ESI/RackConfig.src/M000091.html +20 -0
  72. data/doc/rdoc/classes/ESI/Request.html +158 -0
  73. data/doc/rdoc/classes/ESI/{MemcachedCache.src/M000046.html → Request.src/M000098.html} +5 -5
  74. data/doc/rdoc/classes/ESI/Request.src/M000099.html +18 -0
  75. data/doc/rdoc/classes/ESI/Response.html +36 -36
  76. data/doc/rdoc/classes/ESI/Response.src/M000080.html +10 -8
  77. data/doc/rdoc/classes/ESI/Response.src/M000081.html +5 -7
  78. data/doc/rdoc/classes/ESI/Response.src/M000082.html +8 -12
  79. data/doc/rdoc/classes/ESI/Response.src/M000083.html +7 -5
  80. data/doc/rdoc/classes/ESI/Response.src/M000084.html +12 -20
  81. data/doc/rdoc/classes/ESI/Response.src/{M000079.html → M000085.html} +5 -5
  82. data/doc/rdoc/classes/ESI/Response.src/M000086.html +33 -0
  83. data/doc/rdoc/classes/ESI/Router.html +10 -10
  84. data/doc/rdoc/classes/ESI/Router.src/{M000098.html → M000109.html} +0 -0
  85. data/doc/rdoc/classes/ESI/Router.src/{M000099.html → M000110.html} +0 -0
  86. data/doc/rdoc/classes/ESI/RubyCache.html +45 -45
  87. data/doc/rdoc/classes/ESI/RubyCache.src/{M000089.html → M000100.html} +6 -6
  88. data/doc/rdoc/classes/ESI/RubyCache.src/{M000090.html → M000101.html} +6 -6
  89. data/doc/rdoc/classes/ESI/RubyCache.src/{M000091.html → M000102.html} +6 -6
  90. data/doc/rdoc/classes/ESI/RubyCache.src/{M000092.html → M000103.html} +8 -8
  91. data/doc/rdoc/classes/ESI/RubyCache.src/{M000093.html → M000104.html} +4 -4
  92. data/doc/rdoc/classes/ESI/RubyCache.src/{M000094.html → M000105.html} +8 -8
  93. data/doc/rdoc/classes/ESI/RubyCache.src/{M000095.html → M000106.html} +4 -4
  94. data/doc/rdoc/classes/ESI/RubyCache.src/{M000096.html → M000107.html} +4 -4
  95. data/doc/rdoc/classes/ESI/RubyCache.src/{M000097.html → M000108.html} +4 -4
  96. data/doc/rdoc/classes/ESI/Tag.html +8 -8
  97. data/doc/rdoc/created.rid +1 -1
  98. data/doc/rdoc/files/COPYING.html +1 -1
  99. data/doc/rdoc/files/LICENSE.html +1 -1
  100. data/doc/rdoc/files/README.html +12 -10
  101. data/doc/rdoc/files/ext/esi/common_rl.html +1 -1
  102. data/doc/rdoc/files/ext/esi/esi_parser_c.html +1 -1
  103. data/doc/rdoc/files/ext/esi/parser_c.html +1 -1
  104. data/doc/rdoc/files/ext/esi/parser_h.html +1 -1
  105. data/doc/rdoc/files/ext/esi/parser_rl.html +122 -82
  106. data/doc/rdoc/files/ext/esi/test/test_c.html +1 -1
  107. data/doc/rdoc/files/lib/esi/cache_rb.html +2 -1
  108. data/doc/rdoc/files/lib/esi/config_rb.html +2 -1
  109. data/doc/rdoc/files/lib/esi/dispatcher_rb.html +3 -1
  110. data/doc/rdoc/files/lib/esi/invalidator_rb.html +1 -1
  111. data/doc/rdoc/files/lib/esi/logger_rb.html +1 -1
  112. data/doc/rdoc/files/lib/esi/parser_rb.html +1 -1
  113. data/doc/rdoc/files/lib/esi/processor_rb.html +1 -1
  114. data/doc/rdoc/files/lib/esi/proxy_rb.html +2 -2
  115. data/doc/rdoc/files/{ext/esi/test/parser_c.html → lib/esi/rack_adapter_rb.html} +21 -5
  116. data/doc/rdoc/files/lib/esi/response_rb.html +1 -1
  117. data/doc/rdoc/files/lib/esi/router_rb.html +1 -1
  118. data/doc/rdoc/files/lib/esi/tag/attempt_rb.html +1 -1
  119. data/doc/rdoc/files/lib/esi/tag/base_rb.html +1 -1
  120. data/doc/rdoc/files/lib/esi/tag/container_rb.html +1 -1
  121. data/doc/rdoc/files/lib/esi/tag/except_rb.html +1 -1
  122. data/doc/rdoc/files/lib/esi/tag/include_rb.html +1 -1
  123. data/doc/rdoc/files/lib/esi/tag/invalidate_rb.html +1 -1
  124. data/doc/rdoc/files/lib/esi/tag/try_rb.html +1 -1
  125. data/doc/rdoc/files/lib/esi/version_rb.html +1 -1
  126. data/doc/rdoc/files/lib/multi_dirhandler_rb.html +1 -1
  127. data/doc/rdoc/fr_class_index.html +4 -0
  128. data/doc/rdoc/fr_file_index.html +1 -5
  129. data/doc/rdoc/fr_method_index.html +87 -76
  130. data/ext/esi/esi_parser.c +2 -2
  131. data/ext/esi/parser.c +133 -107
  132. data/ext/esi/parser.h +9 -4
  133. data/ext/esi/parser.rl +99 -73
  134. data/ext/esi/test/test.c +11 -6
  135. data/lib/esi/cache.rb +7 -3
  136. data/lib/esi/config.rb +4 -8
  137. data/lib/esi/dispatcher.rb +14 -5
  138. data/lib/esi/processor.rb +1 -1
  139. data/lib/esi/proxy.rb +58 -48
  140. data/lib/esi/rack_adapter.rb +97 -0
  141. data/lib/esi/response.rb +30 -1
  142. data/lib/esi/version.rb +1 -1
  143. data/test/bench-plot.rb +31 -0
  144. data/test/benchmarks/csv-perf-serial0.4 +101 -0
  145. data/test/benchmarks/csv-perf-trunk +101 -0
  146. data/test/benchmarks/perf-serial0.4-n1000-c1.csv +101 -0
  147. data/test/benchmarks/perf-serial0.4-n1000-c2.csv +101 -0
  148. data/test/benchmarks/perf-serial0.4-n1000-c3.csv +101 -0
  149. data/test/benchmarks/perf-serial0.4-n1000-c4.csv +101 -0
  150. data/test/benchmarks/perf-serial0.4-n1000-c5.csv +101 -0
  151. data/test/benchmarks/perf-serial0.4-n1000-c6.csv +101 -0
  152. data/test/benchmarks/perf-serial0.4-n1000-c7.csv +101 -0
  153. data/test/benchmarks/perf-trunk-n1000-c1.csv +101 -0
  154. data/test/benchmarks/perf-trunk-n1000-c2.csv +101 -0
  155. data/test/benchmarks/perf-trunk-n1000-c3.csv +101 -0
  156. data/test/benchmarks/perf-trunk-n1000-c4.csv +101 -0
  157. data/test/benchmarks/perf-trunk-n1000-c5.csv +101 -0
  158. data/test/benchmarks/perf-trunk-n1000-c6.csv +101 -0
  159. data/test/benchmarks/perf-trunk-n1000-c7.csv +101 -0
  160. data/test/load_test.rb +5 -2
  161. data/test/load_test_ab.rb +9 -4
  162. metadata +261 -227
  163. data/doc/rdoc/classes/ESI/Config.src/M000057.html +0 -18
  164. data/doc/rdoc/classes/ESI/Config.src/M000058.html +0 -20
  165. data/doc/rdoc/classes/ESI/Config.src/M000060.html +0 -24
  166. data/doc/rdoc/classes/ESI/Dispatcher.src/M000088.html +0 -18
  167. data/doc/rdoc/classes/ESI/MemcachedCache.src/M000047.html +0 -18
  168. data/doc/rdoc/classes/ESI/Proxy.src/M000069.html +0 -20
  169. data/doc/rdoc/classes/ESI/Proxy.src/M000070.html +0 -55
  170. data/doc/rdoc/classes/ESI/Response.src/M000078.html +0 -23
  171. data/doc/rdoc/files/ext/esi/test/common_rl.html +0 -160
  172. data/doc/rdoc/files/ext/esi/test/parser_h.html +0 -101
  173. data/doc/rdoc/files/ext/esi/test/parser_rl.html +0 -827
  174. data/doc/rdoc/files/ext/esi/test/sp_c.html +0 -101
  175. data/ext/esi/test/common.rl +0 -46
  176. data/ext/esi/test/parser.c +0 -1875
  177. data/ext/esi/test/parser.h +0 -120
  178. data/ext/esi/test/parser.rl +0 -585
  179. data/ext/esi/test/sp.c +0 -125
data/ext/esi/esi_parser.c CHANGED
@@ -92,8 +92,8 @@ esi_parser_default_start_cb( const void *data,
92
92
  VALUE attr_hash = rb_hash_new();
93
93
  VALUE tag_text = rb_str_new( name_start, name_length );
94
94
  while( attr ){
95
- VALUE name = rb_str_new( attr->name, strlen( attr->name ) );
96
- VALUE value = rb_str_new( attr->value, strlen( attr->value ) );
95
+ VALUE name = rb_str_new( attr->name, attr->name_length );
96
+ VALUE value = rb_str_new( attr->value, attr->value_length );
97
97
  rb_hash_aset( attr_hash, name, value );
98
98
  attr = attr->next;
99
99
  }
data/ext/esi/parser.c CHANGED
@@ -65,6 +65,21 @@ static void esi_parser_echo_char( ESIParser *parser, char ch )
65
65
  esi_parser_flush_output( parser );
66
66
  }
67
67
  }
68
+ static void esi_parser_send_buffer( ESIParser *parser, const char *seq, size_t len )
69
+ {
70
+ const char *nseq = seq + len;
71
+ size_t nlen = parser->output_buffer_size + len;
72
+
73
+ if( nlen < ESI_OUTPUT_BUFFER_SIZE ) {
74
+ memcpy( parser->output_buffer + parser->output_buffer_size, seq, len );
75
+ parser->output_buffer_size += len;
76
+ }
77
+ else if( nlen > ESI_OUTPUT_BUFFER_SIZE ) {
78
+ while( seq != nseq ) {
79
+ esi_parser_echo_char( parser, *seq++ );
80
+ }
81
+ }
82
+ }
68
83
  /* send any buffered characters to the output handler.
69
84
  * This happens when we enter a case such as <em> where the
70
85
  * first two characters < and e match the <esi: expression
@@ -100,6 +115,7 @@ static void esi_parser_concat_to_echobuffer( ESIParser *parser, char ch )
100
115
  /* double the echobuffer size
101
116
  * we're getting some crazy input if this case ever happens
102
117
  */
118
+ printf( "increase echobuffer: %d, %s\n", parser->echobuffer_allocated, parser->echobuffer );
103
119
  parser->echobuffer_allocated *= 2;
104
120
  parser->echobuffer = (char*)realloc( parser->echobuffer, parser->echobuffer_allocated );
105
121
  }
@@ -139,11 +155,11 @@ static void rtrim_pointer( const char **ptr, const char *bounds, size_t *len )
139
155
  }
140
156
  }
141
157
 
142
- #line 306 "parser.rl"
158
+ #line 321 "parser.rl"
143
159
 
144
160
 
145
161
 
146
- #line 147 "parser.c"
162
+ #line 163 "parser.c"
147
163
  static const char _esi_eof_actions[] = {
148
164
  0, 0, 0, 0, 0, 0, 0, 0,
149
165
  0, 0, 0, 0, 0, 0, 0, 0,
@@ -163,7 +179,7 @@ static const int esi_error = -1;
163
179
 
164
180
  static const int esi_en_main = 75;
165
181
 
166
- #line 309 "parser.rl"
182
+ #line 324 "parser.rl"
167
183
 
168
184
  /* dup the string up to len */
169
185
  char *esi_strndup( const char *str, size_t len )
@@ -177,8 +193,10 @@ char *esi_strndup( const char *str, size_t len )
177
193
  ESIAttribute *esi_attribute_new( const char *name, size_t name_length, const char *value, size_t value_length )
178
194
  {
179
195
  ESIAttribute *attr = (ESIAttribute*)malloc(sizeof(ESIAttribute));
180
- attr->name = esi_strndup(name, name_length);
181
- attr->value = esi_strndup(value, value_length);
196
+ attr->name = name;//esi_strndup(name, name_length);
197
+ attr->value = value;//esi_strndup(value, value_length);
198
+ attr->name_length = name_length;
199
+ attr->value_length = value_length;
182
200
  attr->next = NULL;
183
201
  return attr;
184
202
  }
@@ -189,16 +207,16 @@ ESIAttribute *esi_attribute_copy( ESIAttribute *attribute )
189
207
  if( !attribute ){ return NULL; }
190
208
 
191
209
  // copy the first attribute
192
- nattr = esi_attribute_new( attribute->name, strlen( attribute->name ),
193
- attribute->value, strlen( attribute->value ) );
210
+ nattr = esi_attribute_new( attribute->name, attribute->name_length,
211
+ attribute->value, attribute->value_length );
194
212
  // save a pointer for return
195
213
  head = nattr;
196
214
  // copy next attributes
197
215
  attribute = attribute->next;
198
216
  while( attribute ) {
199
217
  // set the next attribute
200
- nattr->next = esi_attribute_new( attribute->name, strlen( attribute->name ),
201
- attribute->value, strlen( attribute->value ) );
218
+ nattr->next = esi_attribute_new( attribute->name, attribute->name_length,
219
+ attribute->value, attribute->value_length );
202
220
  // next attribute
203
221
  nattr = nattr->next;
204
222
  attribute = attribute->next;
@@ -210,8 +228,8 @@ void esi_attribute_free( ESIAttribute *attribute )
210
228
  {
211
229
  ESIAttribute *ptr;
212
230
  while( attribute ){
213
- free( attribute->name );
214
- free( attribute->value );
231
+ // free( attribute->name );
232
+ // free( attribute->value );
215
233
  ptr = attribute->next;
216
234
  free( attribute );
217
235
  attribute = ptr;
@@ -228,9 +246,11 @@ ESIParser *esi_parser_new()
228
246
  parser->attr_value = NULL;
229
247
  parser->overflow_data_size = 0;
230
248
  parser->overflow_data = NULL;
249
+ parser->overflow_data_allocated = 0;
250
+ parser->using_overflow = 0;
231
251
 
232
252
  /* allocate ESI_OUTPUT_BUFFER_SIZE bytes for the echobuffer */
233
- parser->echobuffer_allocated = ESI_OUTPUT_BUFFER_SIZE;
253
+ parser->echobuffer_allocated = ESI_ECHOBUFFER_SIZE;
234
254
  parser->echobuffer_index = -1;
235
255
  parser->echobuffer = (char*)malloc(sizeof(char)*parser->echobuffer_allocated);
236
256
 
@@ -251,6 +271,7 @@ void esi_parser_free( ESIParser *parser )
251
271
  if( parser->overflow_data ){ free( parser->overflow_data ); }
252
272
 
253
273
  free( parser->echobuffer );
274
+
254
275
  esi_attribute_free( parser->attributes );
255
276
 
256
277
  free( parser );
@@ -265,11 +286,11 @@ int esi_parser_init( ESIParser *parser )
265
286
  {
266
287
  int cs;
267
288
 
268
- #line 269 "parser.c"
289
+ #line 290 "parser.c"
269
290
  {
270
291
  cs = esi_start;
271
292
  }
272
- #line 410 "parser.rl"
293
+ #line 430 "parser.rl"
273
294
  parser->prev_state = parser->cs = cs;
274
295
  return 0;
275
296
  }
@@ -328,6 +349,54 @@ esi_parser_scan_for_start( ESIParser *parser, const char *data, size_t length )
328
349
  }
329
350
  }
330
351
 
352
+ static void
353
+ esi_parser_append_data_to_overflow_data( ESIParser *parser, const char *data, size_t length )
354
+ {
355
+ int mark_offset = 0;
356
+ int tag_text_offset = 0;
357
+ int attr_key_offset = 0;
358
+ int attr_value_offset = 0;
359
+
360
+ if( parser->using_overflow ) {
361
+ // recompute mark, tag_text, attr_key, and attr_value as they all exist within overflow_data
362
+ mark_offset = compute_offset( parser->mark, parser->overflow_data );
363
+ tag_text_offset = compute_offset( parser->tag_text, parser->overflow_data );
364
+ attr_key_offset = compute_offset( parser->attr_key, parser->overflow_data );
365
+ attr_value_offset = compute_offset( parser->attr_value, parser->overflow_data );
366
+ }
367
+ else {
368
+ // recompute mark, tag_text, attr_key, and attr_value as they all exist within data
369
+ mark_offset = compute_offset( parser->mark, data );
370
+ tag_text_offset = compute_offset( parser->tag_text, data );
371
+ attr_key_offset = compute_offset( parser->attr_key, data );
372
+ attr_value_offset = compute_offset( parser->attr_value, data );
373
+ }
374
+
375
+ if( parser->overflow_data ) {
376
+ // check if we need to resize or grow the buffer
377
+ if( (parser->overflow_data_size + length) > parser->overflow_data_allocated ) {
378
+ parser->overflow_data_allocated += length;
379
+ // printf( "realloc: %d bytes, using %d\n", (int)parser->overflow_data_allocated, (int)(parser->overflow_data_size+length) );
380
+ parser->overflow_data = (char*)realloc( parser->overflow_data, sizeof(char)*(parser->overflow_data_allocated) );
381
+ }
382
+ memcpy( parser->overflow_data+parser->overflow_data_size, data, length );
383
+ parser->overflow_data_size += length;
384
+ }
385
+ else {
386
+ parser->overflow_data_allocated = ESI_OUTPUT_BUFFER_SIZE > length ? ESI_OUTPUT_BUFFER_SIZE : length;
387
+ parser->overflow_data = (char*)malloc( sizeof( char ) * parser->overflow_data_allocated );
388
+ memcpy( parser->overflow_data, data, length );
389
+ parser->overflow_data_size = length;
390
+ // printf( "malloc: %d for %d bytes\n", (int)parser->overflow_data_allocated, (int)length );
391
+ }
392
+
393
+ // in our new memory space mark will now be
394
+ parser->mark = ( mark_offset >= 0 ) ? parser->overflow_data + mark_offset : NULL;
395
+ parser->tag_text = ( tag_text_offset >= 0 ) ? parser->overflow_data + tag_text_offset : NULL;
396
+ parser->attr_key = ( attr_key_offset >= 0 ) ? parser->overflow_data + attr_key_offset : NULL;
397
+ parser->attr_value = ( attr_value_offset >= 0 ) ? parser->overflow_data + attr_value_offset : NULL;
398
+ }
399
+
331
400
  /* accept an arbitrary length string buffer
332
401
  * when this methods exits it determines if an end state was reached
333
402
  * if no end state was reached it saves the full input into an internal buffer
@@ -345,51 +414,33 @@ int esi_parser_execute( ESIParser *parser, const char *data, size_t length )
345
414
  if( length == 0 ){ return cs; }
346
415
 
347
416
  /* scan data for any '<esi:' start sequences, /<$/, /<e$/, /<es$/, /<esi$/, /<esi:$/ */
348
- if( cs == esi_start ) {
417
+ if( cs == esi_start || cs == 0 ) {
349
418
  pindex = esi_parser_scan_for_start( parser, data, length );
350
- if( pindex == -1 ) {
351
- for( pindex = 0; pindex < length; ++pindex ) {
352
- esi_parser_echo_char( parser, data[pindex] );
353
- }
354
- return cs;
419
+ if( pindex == -1 ) { /* this means there are no start sequences in the buffer we recieved */
420
+ esi_parser_send_buffer( parser, data, length );
421
+ return cs; /* no esi start sequences send it all out and break out early */
355
422
  }
356
423
  }
357
424
 
358
- /* there's an existing overflow buffer data append the new data to the existing data */
359
- if( parser->overflow_data && parser->overflow_data_size > 0 ) {
425
+ /* there's an existing overflow buffer and it's being used, append the new data */
426
+ //if( parser->overflow_data && parser->overflow_data_size > 0 ) {
427
+ if( parser->using_overflow ) {
428
+ int prev_overflow_size = parser->overflow_data_size; // save the current overflow size
429
+ esi_parser_append_data_to_overflow_data( parser, data, length );
360
430
 
361
- // recompute mark, tag_text, attr_key, and attr_value since they all exist within overflow_data
362
- int mark_offset = compute_offset( parser->mark, parser->overflow_data );
363
- int tag_text_offset = compute_offset( parser->tag_text, parser->overflow_data );
364
- int attr_key_offset = compute_offset( parser->attr_key, parser->overflow_data );
365
- int attr_value_offset = compute_offset( parser->attr_value, parser->overflow_data );
366
-
367
- parser->overflow_data = (char*)realloc( parser->overflow_data, sizeof(char)*(parser->overflow_data_size+length) );
368
- memcpy( parser->overflow_data+parser->overflow_data_size, data, length );
369
-
370
- p = parser->overflow_data + parser->overflow_data_size;
371
-
372
- // in our new memory space mark will now be
373
- parser->mark = ( mark_offset >= 0 ) ? parser->overflow_data + mark_offset : NULL;
374
- parser->tag_text = ( tag_text_offset >= 0 ) ? parser->overflow_data + tag_text_offset : NULL;
375
- parser->attr_key = ( attr_key_offset >= 0 ) ? parser->overflow_data + attr_key_offset : NULL;
376
- parser->attr_value = ( attr_value_offset >= 0 ) ? parser->overflow_data + attr_value_offset : NULL;
377
-
431
+ /* set parser variables */
432
+ p = parser->overflow_data + prev_overflow_size;
378
433
  data = parser->overflow_data;
379
- parser->overflow_data_size = length = length + parser->overflow_data_size;
380
- // printf( "grow overflow data: %ld\n", parser->overflow_data_size );
434
+ length = parser->overflow_data_size;
381
435
  pe = data + length;
382
-
383
436
  }
384
437
 
385
438
  if( !parser->mark ) {
386
439
  parser->mark = p;
387
440
  }
388
441
 
389
- // printf( "cs: %d, ", cs );
390
-
391
442
 
392
- #line 393 "parser.c"
443
+ #line 444 "parser.c"
393
444
  {
394
445
  if ( p == pe )
395
446
  goto _test_eof;
@@ -1303,7 +1354,7 @@ case 79:
1303
1354
  tr98: cs = 79; goto f8;
1304
1355
 
1305
1356
  f0:
1306
- #line 280 "parser.rl"
1357
+ #line 295 "parser.rl"
1307
1358
  {
1308
1359
  //printf( "[%c:%d],", *p, cs );
1309
1360
  switch( cs ) {
@@ -1330,7 +1381,7 @@ f0:
1330
1381
  }
1331
1382
  goto _again;
1332
1383
  f1:
1333
- #line 280 "parser.rl"
1384
+ #line 295 "parser.rl"
1334
1385
  {
1335
1386
  //printf( "[%c:%d],", *p, cs );
1336
1387
  switch( cs ) {
@@ -1355,14 +1406,14 @@ f1:
1355
1406
  */
1356
1407
  parser->prev_state = cs;
1357
1408
  }
1358
- #line 144 "parser.rl"
1409
+ #line 160 "parser.rl"
1359
1410
  {
1360
1411
  parser->mark = p;
1361
1412
  //debug_string( "begin", p, 1 );
1362
1413
  }
1363
1414
  goto _again;
1364
1415
  f10:
1365
- #line 280 "parser.rl"
1416
+ #line 295 "parser.rl"
1366
1417
  {
1367
1418
  //printf( "[%c:%d],", *p, cs );
1368
1419
  switch( cs ) {
@@ -1387,13 +1438,13 @@ f10:
1387
1438
  */
1388
1439
  parser->prev_state = cs;
1389
1440
  }
1390
- #line 148 "parser.rl"
1441
+ #line 164 "parser.rl"
1391
1442
  {
1392
1443
  // printf( "finish\n" );
1393
1444
  }
1394
1445
  goto _again;
1395
1446
  f3:
1396
- #line 280 "parser.rl"
1447
+ #line 295 "parser.rl"
1397
1448
  {
1398
1449
  //printf( "[%c:%d],", *p, cs );
1399
1450
  switch( cs ) {
@@ -1418,7 +1469,7 @@ f3:
1418
1469
  */
1419
1470
  parser->prev_state = cs;
1420
1471
  }
1421
- #line 153 "parser.rl"
1472
+ #line 169 "parser.rl"
1422
1473
  {
1423
1474
  parser->tag_text = parser->mark+1;
1424
1475
  parser->tag_text_length = p - (parser->mark+1);
@@ -1426,7 +1477,7 @@ f3:
1426
1477
  }
1427
1478
  goto _again;
1428
1479
  f8:
1429
- #line 280 "parser.rl"
1480
+ #line 295 "parser.rl"
1430
1481
  {
1431
1482
  //printf( "[%c:%d],", *p, cs );
1432
1483
  switch( cs ) {
@@ -1451,7 +1502,7 @@ f8:
1451
1502
  */
1452
1503
  parser->prev_state = cs;
1453
1504
  }
1454
- #line 160 "parser.rl"
1505
+ #line 176 "parser.rl"
1455
1506
  {
1456
1507
  /* trim the tag text */
1457
1508
  ltrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
@@ -1460,9 +1511,8 @@ f8:
1460
1511
  /* send the start tag and end tag message */
1461
1512
  esi_parser_flush_output( parser );
1462
1513
  parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->attributes, parser->user_data );
1463
- esi_parser_flush_output( parser );
1464
1514
  parser->end_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->user_data );
1465
- esi_parser_flush_output( parser );
1515
+ //printf("\t[see inline tag]\n");
1466
1516
 
1467
1517
  /* mark the position */
1468
1518
  parser->tag_text = NULL;
@@ -1474,7 +1524,7 @@ f8:
1474
1524
  }
1475
1525
  goto _again;
1476
1526
  f5:
1477
- #line 280 "parser.rl"
1527
+ #line 295 "parser.rl"
1478
1528
  {
1479
1529
  //printf( "[%c:%d],", *p, cs );
1480
1530
  switch( cs ) {
@@ -1499,7 +1549,7 @@ f5:
1499
1549
  */
1500
1550
  parser->prev_state = cs;
1501
1551
  }
1502
- #line 182 "parser.rl"
1552
+ #line 197 "parser.rl"
1503
1553
  {
1504
1554
  /* trim tag text */
1505
1555
  ltrim_pointer( &(parser->tag_text), p, &(parser->tag_text_length) );
@@ -1508,7 +1558,7 @@ f5:
1508
1558
  /* send the start and end tag message */
1509
1559
  esi_parser_flush_output( parser );
1510
1560
  parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->attributes, parser->user_data );
1511
- esi_parser_flush_output( parser );
1561
+ //printf("\t[see start tag with attributes]\n");
1512
1562
 
1513
1563
  parser->tag_text = NULL;
1514
1564
  parser->tag_text_length = 0;
@@ -1519,7 +1569,7 @@ f5:
1519
1569
  }
1520
1570
  goto _again;
1521
1571
  f6:
1522
- #line 280 "parser.rl"
1572
+ #line 295 "parser.rl"
1523
1573
  {
1524
1574
  //printf( "[%c:%d],", *p, cs );
1525
1575
  switch( cs ) {
@@ -1544,7 +1594,7 @@ f6:
1544
1594
  */
1545
1595
  parser->prev_state = cs;
1546
1596
  }
1547
- #line 201 "parser.rl"
1597
+ #line 216 "parser.rl"
1548
1598
  {
1549
1599
  /* save the attribute key start */
1550
1600
  parser->attr_key = parser->mark;
@@ -1559,7 +1609,7 @@ f6:
1559
1609
  }
1560
1610
  goto _again;
1561
1611
  f7:
1562
- #line 280 "parser.rl"
1612
+ #line 295 "parser.rl"
1563
1613
  {
1564
1614
  //printf( "[%c:%d],", *p, cs );
1565
1615
  switch( cs ) {
@@ -1584,7 +1634,7 @@ f7:
1584
1634
  */
1585
1635
  parser->prev_state = cs;
1586
1636
  }
1587
- #line 215 "parser.rl"
1637
+ #line 230 "parser.rl"
1588
1638
  {
1589
1639
  ESIAttribute *attr;
1590
1640
 
@@ -1614,7 +1664,7 @@ f7:
1614
1664
  }
1615
1665
  goto _again;
1616
1666
  f4:
1617
- #line 280 "parser.rl"
1667
+ #line 295 "parser.rl"
1618
1668
  {
1619
1669
  //printf( "[%c:%d],", *p, cs );
1620
1670
  switch( cs ) {
@@ -1639,7 +1689,7 @@ f4:
1639
1689
  */
1640
1690
  parser->prev_state = cs;
1641
1691
  }
1642
- #line 244 "parser.rl"
1692
+ #line 259 "parser.rl"
1643
1693
  {
1644
1694
 
1645
1695
  parser->tag_text = parser->mark;
@@ -1652,13 +1702,13 @@ f4:
1652
1702
 
1653
1703
  esi_parser_flush_output( parser );
1654
1704
  parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, NULL, parser->user_data );
1655
- esi_parser_flush_output( parser );
1705
+ //printf("\t[see start tag]\n");
1656
1706
 
1657
1707
  esi_parser_echobuffer_clear( parser );
1658
1708
  }
1659
1709
  goto _again;
1660
1710
  f2:
1661
- #line 280 "parser.rl"
1711
+ #line 295 "parser.rl"
1662
1712
  {
1663
1713
  //printf( "[%c:%d],", *p, cs );
1664
1714
  switch( cs ) {
@@ -1683,7 +1733,7 @@ f2:
1683
1733
  */
1684
1734
  parser->prev_state = cs;
1685
1735
  }
1686
- #line 262 "parser.rl"
1736
+ #line 277 "parser.rl"
1687
1737
  {
1688
1738
  /* offset by 2 to account for the </ characters */
1689
1739
  parser->tag_text = parser->mark+2;
@@ -1696,13 +1746,13 @@ f2:
1696
1746
 
1697
1747
  esi_parser_flush_output( parser );
1698
1748
  parser->end_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->user_data );
1699
- esi_parser_flush_output( parser );
1749
+ //printf("\t[see end tag]\n");
1700
1750
 
1701
1751
  esi_parser_echobuffer_clear( parser );
1702
1752
  }
1703
1753
  goto _again;
1704
1754
  f12:
1705
- #line 280 "parser.rl"
1755
+ #line 295 "parser.rl"
1706
1756
  {
1707
1757
  //printf( "[%c:%d],", *p, cs );
1708
1758
  switch( cs ) {
@@ -1727,18 +1777,18 @@ f12:
1727
1777
  */
1728
1778
  parser->prev_state = cs;
1729
1779
  }
1730
- #line 144 "parser.rl"
1780
+ #line 160 "parser.rl"
1731
1781
  {
1732
1782
  parser->mark = p;
1733
1783
  //debug_string( "begin", p, 1 );
1734
1784
  }
1735
- #line 148 "parser.rl"
1785
+ #line 164 "parser.rl"
1736
1786
  {
1737
1787
  // printf( "finish\n" );
1738
1788
  }
1739
1789
  goto _again;
1740
1790
  f11:
1741
- #line 280 "parser.rl"
1791
+ #line 295 "parser.rl"
1742
1792
  {
1743
1793
  //printf( "[%c:%d],", *p, cs );
1744
1794
  switch( cs ) {
@@ -1763,7 +1813,7 @@ f11:
1763
1813
  */
1764
1814
  parser->prev_state = cs;
1765
1815
  }
1766
- #line 215 "parser.rl"
1816
+ #line 230 "parser.rl"
1767
1817
  {
1768
1818
  ESIAttribute *attr;
1769
1819
 
@@ -1791,7 +1841,7 @@ f11:
1791
1841
  parser->last = parser->attributes = attr;
1792
1842
  }
1793
1843
  }
1794
- #line 148 "parser.rl"
1844
+ #line 164 "parser.rl"
1795
1845
  {
1796
1846
  // printf( "finish\n" );
1797
1847
  }
@@ -1805,54 +1855,30 @@ _again:
1805
1855
  {
1806
1856
  switch ( _esi_eof_actions[cs] ) {
1807
1857
  case 10:
1808
- #line 148 "parser.rl"
1858
+ #line 164 "parser.rl"
1809
1859
  {
1810
1860
  // printf( "finish\n" );
1811
1861
  }
1812
1862
  break;
1813
- #line 1814 "parser.c"
1863
+ #line 1864 "parser.c"
1814
1864
  }
1815
1865
  }
1816
1866
 
1817
1867
  }
1818
- #line 529 "parser.rl"
1868
+ #line 579 "parser.rl"
1819
1869
 
1820
1870
  parser->cs = cs;
1821
1871
 
1822
1872
  if( cs != esi_start && cs != 0 ) {
1823
1873
 
1824
1874
  /* reached the end and we're not at a termination point save the buffer as overflow */
1825
- if( !parser->overflow_data ){
1826
- // recompute mark, tag_text, attr_key, and attr_value since they all exist within overflow_data
1827
- int mark_offset = compute_offset( parser->mark, data );
1828
- int tag_text_offset = compute_offset( parser->tag_text, data );
1829
- int attr_key_offset = compute_offset( parser->attr_key, data );
1830
- int attr_value_offset = compute_offset( parser->attr_value, data );
1831
- //debug_string( "mark before move", parser->mark, 1 );
1832
-
1833
- if( ESI_OUTPUT_BUFFER_SIZE > length ) {
1834
- parser->echobuffer_allocated = ESI_OUTPUT_BUFFER_SIZE;
1835
- }
1836
- else {
1837
- parser->echobuffer_allocated = length;
1838
- }
1839
- parser->overflow_data = (char*)malloc( sizeof( char ) * parser->echobuffer_allocated );
1840
- memcpy( parser->overflow_data, data, length );
1841
- parser->overflow_data_size = length;
1842
- //printf( "allocate overflow data: %ld\n", parser->echobuffer_allocated );
1843
-
1844
- // in our new memory space mark will now be
1845
- parser->mark = ( mark_offset >= 0 ) ? parser->overflow_data + mark_offset : NULL;
1846
- parser->tag_text = ( tag_text_offset >= 0 ) ? parser->overflow_data + tag_text_offset : NULL;
1847
- parser->attr_key = ( attr_key_offset >= 0 ) ? parser->overflow_data + attr_key_offset : NULL;
1848
- parser->attr_value = ( attr_value_offset >= 0 ) ? parser->overflow_data + attr_value_offset : NULL;
1849
- //if( parser->mark ){ debug_string( "mark after move", parser->mark, 1 ); } else { printf( "mark is now empty\n" ); }
1875
+ if( !parser->using_overflow ) {
1876
+ esi_parser_append_data_to_overflow_data( parser, data, length );
1877
+ parser->using_overflow = 1;
1850
1878
  }
1851
1879
 
1852
- }else if( parser->overflow_data ) {
1853
- /* dump the overflow buffer execution ended at a final state */
1854
- free( parser->overflow_data );
1855
- parser->overflow_data = NULL;
1880
+ } else if ( parser->using_overflow ) {
1881
+ parser->using_overflow = 0;
1856
1882
  parser->overflow_data_size = 0;
1857
1883
  }
1858
1884