mongrel_esi 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -15,6 +15,8 @@ static void debug_string( const char *msg, const char *str, size_t len )
15
15
  printf( "%s :'%s'\n", msg, pstr );
16
16
  free( pstr );
17
17
  }
18
+ #else
19
+ #define debug_string(m,s,l)
18
20
  #endif
19
21
 
20
22
  /* define default callbacks */
@@ -93,7 +95,7 @@ static void esi_parser_concat_to_echobuffer( ESIParser *parser, char ch )
93
95
  {
94
96
  parser->echobuffer_index++;
95
97
 
96
- if( parser->echobuffer_allocated <= parser->echobuffer_index ){
98
+ if( parser->echobuffer_allocated <= parser->echobuffer_index ) {
97
99
  /* double the echobuffer size
98
100
  * we're getting some crazy input if this case ever happens
99
101
  */
@@ -114,7 +116,7 @@ static void ltrim_pointer( const char **ptr, const char *bounds, size_t *len )
114
116
  **ptr == '=' ||
115
117
  **ptr == '"' ||
116
118
  **ptr == '<' ||
117
- **ptr == '\'' ) && (*len > 0) && (*ptr != bounds) ){
119
+ **ptr == '\'' ) && (*len > 0) && (*ptr != bounds) ) {
118
120
  (*ptr)++;
119
121
  (*len)--;
120
122
  }
@@ -229,11 +231,11 @@ static void rtrim_pointer( const char **ptr, const char *bounds, size_t *len )
229
231
  parser->attr_value, parser->attr_value_length );
230
232
 
231
233
  /* add the new attribute to the list of attributes */
232
- if( parser->attributes ){
234
+ if( parser->attributes ) {
233
235
  parser->last->next = attr;
234
236
  parser->last = attr;
235
237
  }
236
- else{
238
+ else {
237
239
  parser->last = parser->attributes = attr;
238
240
  }
239
241
  }
@@ -277,7 +279,7 @@ static void rtrim_pointer( const char **ptr, const char *bounds, size_t *len )
277
279
  # process each character in the input stream for output
278
280
  action echo {
279
281
  //printf( "[%c:%d],", *p, cs );
280
- switch( cs ){
282
+ switch( cs ) {
281
283
  case 0: /* non matching state */
282
284
  if( parser->prev_state != 12 && parser->prev_state != 7 ){ /* states following a possible end state for a tag */
283
285
  if( parser->echobuffer && parser->echobuffer_index != -1 ){
@@ -363,11 +365,14 @@ ESIParser *esi_parser_new()
363
365
  ESIParser *parser = (ESIParser*)malloc(sizeof(ESIParser));
364
366
  parser->cs = esi_start;
365
367
  parser->mark = NULL;
368
+ parser->tag_text = NULL;
369
+ parser->attr_key = NULL;
370
+ parser->attr_value = NULL;
366
371
  parser->overflow_data_size = 0;
367
372
  parser->overflow_data = NULL;
368
373
 
369
- /* allocate 1024 bytes for the echobuffer */
370
- parser->echobuffer_allocated = ESI_OUTPUT_BUFFER_SIZE; /* NOTE: change this value, to reduce memory consumtion or allocations */
374
+ /* allocate ESI_OUTPUT_BUFFER_SIZE bytes for the echobuffer */
375
+ parser->echobuffer_allocated = ESI_OUTPUT_BUFFER_SIZE;
371
376
  parser->echobuffer_index = -1;
372
377
  parser->echobuffer = (char*)malloc(sizeof(char)*parser->echobuffer_allocated);
373
378
 
@@ -408,12 +413,58 @@ int esi_parser_init( ESIParser *parser )
408
413
 
409
414
  static int compute_offset( const char *mark, const char *data )
410
415
  {
411
- if( mark ){
416
+ if( mark ) {
412
417
  return mark - data;
413
418
  }
414
419
  return -1;
415
420
  }
416
421
 
422
+ /*
423
+ * scans the data buffer for a start sequence /<$/, /<e$/, /<es$/, /<esi$/, /<esi:$/
424
+ * returns index of if start sequence found else returns -1
425
+ */
426
+ static int
427
+ esi_parser_scan_for_start( ESIParser *parser, const char *data, size_t length )
428
+ {
429
+ size_t i, f = -2, s = -2;
430
+ char ch;
431
+
432
+ for( i = 0; i < length; ++i ) {
433
+ ch = data[i];
434
+ switch( ch ) {
435
+ case '<':
436
+ f = s = i;
437
+ break;
438
+ case '/':
439
+ if( s == (i-1) && f != -2 ) { s = i; }
440
+ break;
441
+ case 'e':
442
+ if( s == (i-1) && f != -2 ) { s = i; }
443
+ break;
444
+ case 's':
445
+ if( s == (i-1) && f != -2 ) { s = i; }
446
+ break;
447
+ case 'i':
448
+ if( s == (i-1) && f != -2 ) { s = i; }
449
+ break;
450
+ case ':':
451
+ if( s == (i-1) && f != -2 ) { s = i; return f; }
452
+ break;
453
+ default:
454
+ f = s = -2;
455
+ break;
456
+ }
457
+ }
458
+
459
+ // if s and f are still valid at end of input return f
460
+ if( f != -2 && s != -2 ) {
461
+ return f;
462
+ }
463
+ else {
464
+ return -1;
465
+ }
466
+ }
467
+
417
468
  /* accept an arbitrary length string buffer
418
469
  * when this methods exits it determines if an end state was reached
419
470
  * if no end state was reached it saves the full input into an internal buffer
@@ -426,11 +477,23 @@ int esi_parser_execute( ESIParser *parser, const char *data, size_t length )
426
477
  const char *p = data;
427
478
  const char *eof = NULL; // ragel 6.x compat
428
479
  const char *pe = data + length;
480
+ int pindex;
429
481
 
430
482
  if( length == 0 ){ return cs; }
431
483
 
484
+ /* scan data for any '<esi:' start sequences, /<$/, /<e$/, /<es$/, /<esi$/, /<esi:$/ */
485
+ if( cs == esi_start ) {
486
+ pindex = esi_parser_scan_for_start( parser, data, length );
487
+ if( pindex == -1 ) {
488
+ for( pindex = 0; pindex < length; ++pindex ) {
489
+ esi_parser_echo_char( parser, data[pindex] );
490
+ }
491
+ return cs;
492
+ }
493
+ }
494
+
432
495
  /* there's an existing overflow buffer data append the new data to the existing data */
433
- if( parser->overflow_data && parser->overflow_data_size > 0 ){
496
+ if( parser->overflow_data && parser->overflow_data_size > 0 ) {
434
497
 
435
498
  // recompute mark, tag_text, attr_key, and attr_value since they all exist within overflow_data
436
499
  int mark_offset = compute_offset( parser->mark, parser->overflow_data );
@@ -456,7 +519,7 @@ int esi_parser_execute( ESIParser *parser, const char *data, size_t length )
456
519
 
457
520
  }
458
521
 
459
- if( !parser->mark ){
522
+ if( !parser->mark ) {
460
523
  parser->mark = p;
461
524
  }
462
525
 
@@ -466,7 +529,7 @@ int esi_parser_execute( ESIParser *parser, const char *data, size_t length )
466
529
 
467
530
  parser->cs = cs;
468
531
 
469
- if( cs != esi_start && cs != 0 ){
532
+ if( cs != esi_start && cs != 0 ) {
470
533
 
471
534
  /* reached the end and we're not at a termination point save the buffer as overflow */
472
535
  if( !parser->overflow_data ){
@@ -477,10 +540,16 @@ int esi_parser_execute( ESIParser *parser, const char *data, size_t length )
477
540
  int attr_value_offset = compute_offset( parser->attr_value, data );
478
541
  //debug_string( "mark before move", parser->mark, 1 );
479
542
 
480
- parser->overflow_data = (char*)malloc( sizeof( char ) * length );
543
+ if( ESI_OUTPUT_BUFFER_SIZE > length ) {
544
+ parser->echobuffer_allocated = ESI_OUTPUT_BUFFER_SIZE;
545
+ }
546
+ else {
547
+ parser->echobuffer_allocated = length;
548
+ }
549
+ parser->overflow_data = (char*)malloc( sizeof( char ) * parser->echobuffer_allocated );
481
550
  memcpy( parser->overflow_data, data, length );
482
551
  parser->overflow_data_size = length;
483
- // printf( "allocate overflow data: %ld\n", parser->overflow_data_size );
552
+ //printf( "allocate overflow data: %ld\n", parser->echobuffer_allocated );
484
553
 
485
554
  // in our new memory space mark will now be
486
555
  parser->mark = ( mark_offset >= 0 ) ? parser->overflow_data + mark_offset : NULL;
@@ -490,7 +559,7 @@ int esi_parser_execute( ESIParser *parser, const char *data, size_t length )
490
559
  //if( parser->mark ){ debug_string( "mark after move", parser->mark, 1 ); } else { printf( "mark is now empty\n" ); }
491
560
  }
492
561
 
493
- }else if( parser->overflow_data ){
562
+ }else if( parser->overflow_data ) {
494
563
  /* dump the overflow buffer execution ended at a final state */
495
564
  free( parser->overflow_data );
496
565
  parser->overflow_data = NULL;
data/ext/esi/test/sp.c ADDED
@@ -0,0 +1,125 @@
1
+ /*
2
+ * This is an attempt at a custom fast parser for ESI
3
+ *
4
+ * call backs
5
+ *
6
+ * esi_output
7
+ * esi_start
8
+ * esi_end
9
+ *
10
+ */
11
+
12
+ #include <stdio.h>
13
+ #include <stdlib.h>
14
+ #include <string.h>
15
+
16
+ typedef int (*esi_start_cb)(const char *tag_str, size_t tag_length, void *ptr);
17
+ typedef int (*esi_end_cb)(const char *tag_str, size_t tag_length, void *ptr);
18
+ typedef int (*esi_output_cb)(const char *data, size_t data_length, void *ptr);
19
+
20
+ #define ESI_BUFFER_SIZE 1024
21
+
22
+ typedef struct _ESIParser {
23
+ esi_start_cb start_cb;
24
+ esi_end_cb end_cb;
25
+ esi_output_cb output_cb;
26
+ char buffer[ESI_BUFFER_SIZE];
27
+ char tag_buffer[ESI_BUFFER_SIZE];
28
+ int tag_size;
29
+
30
+ void *callptr;
31
+ }ESIParser;
32
+
33
+ ESIParser *esi_parser_new();
34
+ void esi_parser_free( ESIParser *parser );
35
+
36
+ int esi_parser_feed( ESIParser *parser, const char *data, size_t length );
37
+
38
+ int esi_parser_finish( ESIParser *parser );
39
+
40
+ static int start_cb( const char *tag_str, size_t tag_length, void *ptr )
41
+ {
42
+ return 0;
43
+ }
44
+ static int end_cb( const char *tag_str, size_t tag_length, void *ptr )
45
+ {
46
+ return 0;
47
+ }
48
+ static int output_cb( const char *data, size_t data_length, void *ptr )
49
+ {
50
+ return 0;
51
+ }
52
+
53
+ int main( int argc, char **argv )
54
+ {
55
+ char *ptr = NULL;
56
+ const int buffer_size = 1024;
57
+ char buffer[buffer_size];
58
+ FILE *file = NULL;
59
+ ESIParser *parser = esi_parser_new();
60
+
61
+ parser->start_cb = start_cb;
62
+ parser->end_cb = end_cb;
63
+ parser->output_cb = output_cb;
64
+
65
+ file = fopen("sample.html","r");
66
+ if( !file ){ fprintf( stderr, "Failed to open sample.html\n" ); return 1; }
67
+
68
+ while( (ptr=fgets(buffer, buffer_size, file)) ) {
69
+ esi_parser_feed( parser, ptr, strlen(ptr) );
70
+ }
71
+
72
+ fclose(file);
73
+ esi_parser_free( parser );
74
+ return 0;
75
+ }
76
+
77
+ ESIParser *esi_parser_new()
78
+ {
79
+ ESIParser *parser = (ESIParser*)calloc(1,sizeof(ESIParser));
80
+
81
+ return parser;
82
+ }
83
+ void esi_parser_free( ESIParser *parser )
84
+ {
85
+ free( parser );
86
+ }
87
+
88
+ int esi_parser_feed( ESIParser *parser, const char *data, size_t length )
89
+ {
90
+ size_t i;
91
+ size_t buffered = 0;
92
+
93
+ for( i = 0; (i+4) < length ; ++i ) {
94
+ if( data[i] == '<' &&
95
+ data[i+1] == 'e' &&
96
+ data[i+2] == 's' &&
97
+ data[i+3] == 'i' &&
98
+ data[i+4] == ':' ) { // start sequence
99
+ printf("start: %ld\n", i );
100
+ }
101
+ else if( data[i] == '<' &&
102
+ data[i+1] == '/' &&
103
+ data[i+2] == 'e' &&
104
+ data[i+3] == 's' &&
105
+ data[i+4] == 'i' &&
106
+ data[i+5] == ':' ) { // end sequence
107
+ printf("end: %ld\n", i );
108
+ }
109
+ else {
110
+ parser->buffer[buffered++] = data[i];
111
+ if( buffered == ESI_BUFFER_SIZE ) {
112
+ if( parser->output_cb ) {
113
+ parser->output_cb( parser->buffer, buffered, parser->callptr );
114
+ }
115
+ buffered = 0;
116
+ }
117
+ }
118
+ }
119
+ return buffered;
120
+ }
121
+
122
+ int esi_parser_finish( ESIParser *parser )
123
+ {
124
+ return 0;
125
+ }
data/ext/esi/test/test.c CHANGED
@@ -35,6 +35,23 @@ TagInfo* tag_info_new( const char *name, size_t len, ESIAttribute *attributes )
35
35
  return ti;
36
36
  }
37
37
 
38
+ static
39
+ void tag_info_show( TagInfo *ti )
40
+ {
41
+ ESIAttribute *attrs = ti->attributes;
42
+ if( attrs ) {
43
+ printf("%s{", ti->name );
44
+ while( attrs ) {
45
+ printf( "(%s=>%s),", attrs->name, attrs->value );
46
+ attrs = attrs->next;
47
+ }
48
+ printf("}\n");
49
+ }
50
+ else {
51
+ printf("%s\n", ti->name );
52
+ }
53
+ }
54
+
38
55
  static
39
56
  void tag_info_free( TagInfo *ti )
40
57
  {
@@ -68,7 +85,7 @@ static int verify_match_string( const char *expr, const char *str_value, int lin
68
85
  status = regexec( &reg_expr, str_value, (size_t) 0, NULL, 0 );
69
86
  regfree( &reg_expr );
70
87
  if( status != 0 ){
71
- printf( "No matching %s expression found in '%s' at %s:%d ", expr, str_value, test_name, line );
88
+ printf( "No matching %s expression found in '%s' at %s:%d \n", expr, str_value, test_name, line );
72
89
  return 1;
73
90
  }
74
91
  return 0;
@@ -181,7 +198,7 @@ static void feed_data( ESIParser *parser, const char *data )
181
198
  #define TEST_WITH_FILE(file)\
182
199
  int size = 0;\
183
200
  FILE *input = NULL;\
184
- char buffer[16]; /* intentially using a small buffer size */\
201
+ char buffer[1024]; /* intentially using a small buffer size */\
185
202
  TEST_INIT\
186
203
  \
187
204
  input = fopen( file, "r" );\
@@ -190,7 +207,7 @@ static void feed_data( ESIParser *parser, const char *data )
190
207
  return;\
191
208
  }\
192
209
  \
193
- while( (size = fread( buffer, sizeof(char), 15, input )) > 0 ){\
210
+ while( (size = fread( buffer, sizeof(char), 1023, input )) > 0 ){\
194
211
  esi_parser_execute( parser, buffer, size );\
195
212
  }\
196
213
  \
@@ -257,6 +274,36 @@ static void test_simple_parser_input( ESIParser *parser )
257
274
  TEST_FINISH
258
275
  }
259
276
 
277
+ static void test_small_buffer( ESIParser *parser )
278
+ {
279
+ const int input_size = 2;
280
+ const char *input = "<p>some input</p><esi:include />some more input\nsome input<esi:include timeout='10' src='hello'/>some more input";
281
+ int i, len = strlen(input);
282
+
283
+ TEST_INIT
284
+
285
+ for( i = 0; i < len; i += input_size ) {
286
+ if( i + input_size <= len ) {
287
+ esi_parser_execute( parser, (input+i), input_size );
288
+ }
289
+ else {
290
+ printf("using: %d\n", len - i );
291
+ esi_parser_execute( parser, (input+i), len - i );
292
+ }
293
+ }
294
+
295
+ TEST_PREPARE_ASSERTIONS
296
+
297
+ ASSERT_EQUAL( "<p>some input</p>some more input\nsome inputsome more input", output );
298
+ ASSERT_TRUE( start_tag_count == 2 );
299
+ ASSERT_TRUE( end_tag_count == 2 );
300
+
301
+ ASSERT_TAG_NAMES( start_tags )
302
+ ASSERT_TAG_NAMES( end_tags )
303
+
304
+ TEST_FINISH
305
+ }
306
+
260
307
  static void test_chunked_input( ESIParser *parser )
261
308
  {
262
309
  TEST_INIT
@@ -313,7 +360,8 @@ static void test_sample_input( ESIParser *parser )
313
360
 
314
361
  printf( "start_tag_count: %d\n", start_tag_count );
315
362
  printf( "end_tag_count: %d\n", end_tag_count );
316
- */
363
+ */
364
+
317
365
  ASSERT_TRUE( start_tag_count == 13 );
318
366
  ASSERT_TRUE( end_tag_count == 13 );
319
367
 
@@ -361,13 +409,89 @@ static void test_large_file( ESIParser *parser )
361
409
 
362
410
  TEST_FINISH
363
411
  }
364
-
365
- int main( int argc, char **argv )
412
+
413
+ static void test_sample1( ESIParser *parser )
414
+ {
415
+ TEST_WITH_FILE( "sample1.html" );
416
+
417
+ TEST_PREPARE_ASSERTIONS
418
+
419
+ // ASSERT_MATCH("YYY", output);
420
+ //ASSERT_NO_MATCH("failed", output );
421
+ ASSERT_NO_MATCH("<esi:", output);
422
+ ASSERT_MATCH("<html", output);
423
+ ASSERT_MATCH("</html>", output);
424
+ ASSERT_MATCH("line 1: <pre>", output);
425
+ ASSERT_MATCH("line 2: <pre>", output);
426
+ ASSERT_MATCH("line 3: <pre>", output);
427
+ ASSERT_MATCH("line 4: <pre>", output);
428
+ ASSERT_MATCH("line 5: <pre>", output);
429
+ ASSERT_MATCH("line 6: <pre>", output);
430
+ ASSERT_MATCH("line 7: <pre>", output);
431
+ ASSERT_MATCH("line 8: <pre>", output);
432
+ ASSERT_MATCH("line 9: <pre>", output);
433
+
434
+
435
+ /*
436
+ TagInfo *ptr = start_tags;
437
+ while( ptr ) {
438
+ tag_info_show( ptr );
439
+ ptr = ptr->next;
440
+ }
441
+ printf( "start_tag_count: %d\n", start_tag_count );
442
+ printf( "end_tag_count: %d\n", end_tag_count );
443
+ */
444
+
445
+
446
+ ASSERT_TRUE( start_tag_count == 30 );
447
+ ASSERT_TRUE( end_tag_count == 30 );
448
+
449
+ ASSERT_TAG_NAMES( start_tags )
450
+ ASSERT_TAG_NAMES( end_tags )
451
+
452
+ TEST_FINISH
453
+ }
454
+ #if 0
455
+ static void test_sample1_with_chunking( ESIParser *parser )
456
+ {
457
+ TEST_WITH_FILE( "sample1.html" );
458
+
459
+ TEST_PREPARE_ASSERTIONS
460
+
461
+ // ASSERT_MATCH("YYY", output);
462
+ ASSERT_NO_MATCH("failed", output );
463
+ ASSERT_NO_MATCH("<esi:", output);
464
+
465
+ /*TagInfo *ptr = start_tags;
466
+ while( ptr ) {
467
+ tag_info_show( ptr );
468
+ ptr = ptr->next;
469
+ }
470
+ printf( "start_tag_count: %d\n", start_tag_count );
471
+ printf( "end_tag_count: %d\n", end_tag_count );
472
+ */
473
+
474
+ ASSERT_TRUE( start_tag_count == 23 );
475
+ ASSERT_TRUE( end_tag_count == 16 );
476
+
477
+ ASSERT_TAG_NAMES( start_tags )
478
+ ASSERT_TAG_NAMES( end_tags )
479
+
480
+ TEST_FINISH
481
+ }
482
+ #endif
483
+
484
+ static void test_large_chunked_file( ESIParser *parser );
485
+
486
+ static void run_parser_through_all()
366
487
  {
367
488
  ESIParser *parser = esi_parser_new();
489
+ printf( "%s\n", __FUNCTION__ );
368
490
 
369
491
  test_simple_parser_input( parser );
370
492
 
493
+ test_small_buffer( parser );
494
+
371
495
  test_chunked_input( parser );
372
496
 
373
497
  test_sample_input( parser );
@@ -376,7 +500,75 @@ int main( int argc, char **argv )
376
500
 
377
501
  test_large_file( parser );
378
502
 
503
+ test_large_chunked_file( parser );
504
+
505
+ test_sample1( parser );
506
+
379
507
  esi_parser_free( parser );
508
+ }
380
509
 
510
+ int main( int argc, char **argv )
511
+ {
512
+ run_parser_through_all();
381
513
  return 0;
382
514
  }
515
+
516
+ #define ESI_LARGE_FILE_CHUNKED "chunks.txt"
517
+ static void test_large_chunked_file( ESIParser *parser )
518
+ {
519
+ int size = 0;
520
+ FILE *input = NULL;
521
+ char *buffer = NULL;
522
+ char *chunk_start = NULL;
523
+ char *chunk_end = NULL;
524
+ char *buffer_end = NULL;
525
+
526
+ TEST_INIT
527
+
528
+ // printf( "\n" );
529
+
530
+ input = fopen( ESI_LARGE_FILE_CHUNKED, "r" );
531
+ if( !input ){
532
+ printf( "Failed to open %s\n", ESI_LARGE_FILE_CHUNKED );
533
+ return;
534
+ }
535
+
536
+ fstat( fileno(input), &st );
537
+
538
+ buffer = (char*)malloc(sizeof(char)*st.st_size);
539
+
540
+ size = fread( buffer, sizeof(char), st.st_size, input );
541
+ if( size != st.st_size ) {
542
+ printf( "Read error\n" );
543
+ return;
544
+ }
545
+ buffer_end = buffer + size;
546
+
547
+ for( chunk_start = buffer; chunk_start != buffer_end; ) {
548
+ while( *chunk_start != '{' && chunk_start != buffer_end ) { ++chunk_start; }
549
+ if( chunk_start == buffer_end ){ break; }
550
+ chunk_end = chunk_start;
551
+ while( *chunk_end != '}' && chunk_end != buffer_end ) { ++chunk_end; }
552
+ ++chunk_start;
553
+ if( chunk_start > buffer_end ){ break; }
554
+
555
+ if( (chunk_end - chunk_start) > 0 ) {
556
+ esi_parser_execute( parser, chunk_start, chunk_end - chunk_start );
557
+ chunk_start = chunk_end;
558
+ }
559
+ }
560
+
561
+ fclose( input );
562
+ free( buffer );
563
+
564
+ TEST_PREPARE_ASSERTIONS
565
+
566
+ ASSERT_NO_MATCH("<esi:", output);
567
+
568
+ ASSERT_MATCH( "</html>", output );
569
+
570
+ ASSERT_TAG_NAMES( start_tags )
571
+ ASSERT_TAG_NAMES( end_tags )
572
+
573
+ TEST_FINISH
574
+ }