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.
- data/README +10 -9
- data/doc/rdoc/classes/ESI/Cache.html +10 -10
- data/doc/rdoc/classes/ESI/Cache.src/{M000085.html → M000087.html} +0 -0
- data/doc/rdoc/classes/ESI/Cache.src/{M000086.html → M000088.html} +0 -0
- data/doc/rdoc/classes/ESI/Config.html +43 -62
- data/doc/rdoc/classes/ESI/Config.src/M000049.html +18 -0
- data/doc/rdoc/classes/ESI/Config.src/{M000059.html → M000050.html} +5 -5
- data/doc/rdoc/classes/ESI/Config.src/M000051.html +35 -0
- data/doc/rdoc/classes/ESI/Config.src/M000052.html +27 -5
- data/doc/rdoc/classes/ESI/Config.src/M000053.html +10 -5
- data/doc/rdoc/classes/ESI/Config.src/M000054.html +5 -22
- data/doc/rdoc/classes/ESI/Config.src/M000055.html +7 -25
- data/doc/rdoc/classes/ESI/Config.src/M000056.html +11 -10
- data/doc/rdoc/classes/ESI/Config/CacheConfig.html +25 -25
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/{M000068.html → M000060.html} +6 -5
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/{M000065.html → M000061.html} +5 -5
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/{M000066.html → M000062.html} +4 -4
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/{M000067.html → M000063.html} +4 -4
- data/doc/rdoc/classes/ESI/Config/CacheConfig.src/M000064.html +5 -6
- data/doc/rdoc/classes/ESI/Config/ConfigRouter.html +15 -15
- data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/{M000061.html → M000057.html} +5 -5
- data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/{M000062.html → M000058.html} +7 -7
- data/doc/rdoc/classes/ESI/Config/ConfigRouter.src/{M000063.html → M000059.html} +7 -7
- data/doc/rdoc/classes/ESI/Dispatcher.html +17 -15
- data/doc/rdoc/classes/ESI/Dispatcher.src/{M000087.html → M000092.html} +4 -7
- data/doc/rdoc/classes/ESI/Dispatcher.src/M000093.html +27 -0
- data/doc/rdoc/classes/ESI/Fragment.html +15 -15
- data/doc/rdoc/classes/ESI/Fragment.src/{M000100.html → M000111.html} +0 -0
- data/doc/rdoc/classes/ESI/Fragment.src/{M000101.html → M000112.html} +0 -0
- data/doc/rdoc/classes/ESI/Fragment.src/{M000102.html → M000113.html} +0 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.html +46 -46
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000037.html +24 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000038.html +22 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000039.html +19 -0
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000040.html +10 -11
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000041.html +5 -9
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000042.html +6 -6
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000043.html +5 -10
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000044.html +5 -5
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000045.html +4 -6
- data/doc/rdoc/classes/ESI/OutputAdapter.html +204 -0
- data/doc/rdoc/classes/ESI/OutputAdapter.src/M000094.html +37 -0
- data/doc/rdoc/classes/ESI/OutputAdapter.src/M000095.html +18 -0
- data/doc/rdoc/classes/ESI/OutputAdapter.src/M000096.html +18 -0
- data/doc/rdoc/classes/ESI/OutputAdapter.src/M000097.html +18 -0
- data/doc/rdoc/classes/ESI/Parser.html +15 -15
- data/doc/rdoc/classes/ESI/Parser.src/{M000049.html → M000065.html} +0 -0
- data/doc/rdoc/classes/ESI/Parser.src/{M000050.html → M000066.html} +0 -0
- data/doc/rdoc/classes/ESI/Parser.src/{M000051.html → M000067.html} +0 -0
- data/doc/rdoc/classes/ESI/Processor.html +15 -15
- data/doc/rdoc/classes/ESI/Processor.src/{M000037.html → M000046.html} +0 -0
- data/doc/rdoc/classes/ESI/Processor.src/{M000038.html → M000047.html} +1 -1
- data/doc/rdoc/classes/ESI/Processor.src/{M000039.html → M000048.html} +0 -0
- data/doc/rdoc/classes/ESI/Proxy.html +48 -48
- data/doc/rdoc/classes/ESI/Proxy.src/M000071.html +7 -40
- data/doc/rdoc/classes/ESI/Proxy.src/M000072.html +50 -12
- data/doc/rdoc/classes/ESI/Proxy.src/M000073.html +49 -6
- data/doc/rdoc/classes/ESI/Proxy.src/M000074.html +11 -14
- data/doc/rdoc/classes/ESI/Proxy.src/M000075.html +6 -5
- data/doc/rdoc/classes/ESI/Proxy.src/M000076.html +9 -15
- data/doc/rdoc/classes/ESI/Proxy.src/M000077.html +5 -16
- data/doc/rdoc/classes/ESI/Proxy.src/M000078.html +28 -0
- data/doc/rdoc/classes/ESI/Proxy.src/M000079.html +29 -0
- data/doc/rdoc/classes/ESI/RackAdapter.html +214 -0
- data/doc/rdoc/classes/ESI/RackAdapter.src/M000068.html +18 -0
- data/doc/rdoc/classes/ESI/RackAdapter.src/M000069.html +34 -0
- data/doc/rdoc/classes/ESI/{MemcachedCache.src/M000048.html → RackAdapter.src/M000070.html} +4 -4
- data/doc/rdoc/classes/ESI/RackConfig.html +173 -0
- data/doc/rdoc/classes/ESI/RackConfig.src/M000089.html +28 -0
- data/doc/rdoc/classes/ESI/RackConfig.src/M000090.html +18 -0
- data/doc/rdoc/classes/ESI/RackConfig.src/M000091.html +20 -0
- data/doc/rdoc/classes/ESI/Request.html +158 -0
- data/doc/rdoc/classes/ESI/{MemcachedCache.src/M000046.html → Request.src/M000098.html} +5 -5
- data/doc/rdoc/classes/ESI/Request.src/M000099.html +18 -0
- data/doc/rdoc/classes/ESI/Response.html +36 -36
- data/doc/rdoc/classes/ESI/Response.src/M000080.html +10 -8
- data/doc/rdoc/classes/ESI/Response.src/M000081.html +5 -7
- data/doc/rdoc/classes/ESI/Response.src/M000082.html +8 -12
- data/doc/rdoc/classes/ESI/Response.src/M000083.html +7 -5
- data/doc/rdoc/classes/ESI/Response.src/M000084.html +12 -20
- data/doc/rdoc/classes/ESI/Response.src/{M000079.html → M000085.html} +5 -5
- data/doc/rdoc/classes/ESI/Response.src/M000086.html +33 -0
- data/doc/rdoc/classes/ESI/Router.html +10 -10
- data/doc/rdoc/classes/ESI/Router.src/{M000098.html → M000109.html} +0 -0
- data/doc/rdoc/classes/ESI/Router.src/{M000099.html → M000110.html} +0 -0
- data/doc/rdoc/classes/ESI/RubyCache.html +45 -45
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000089.html → M000100.html} +6 -6
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000090.html → M000101.html} +6 -6
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000091.html → M000102.html} +6 -6
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000092.html → M000103.html} +8 -8
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000093.html → M000104.html} +4 -4
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000094.html → M000105.html} +8 -8
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000095.html → M000106.html} +4 -4
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000096.html → M000107.html} +4 -4
- data/doc/rdoc/classes/ESI/RubyCache.src/{M000097.html → M000108.html} +4 -4
- data/doc/rdoc/classes/ESI/Tag.html +8 -8
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/COPYING.html +1 -1
- data/doc/rdoc/files/LICENSE.html +1 -1
- data/doc/rdoc/files/README.html +12 -10
- data/doc/rdoc/files/ext/esi/common_rl.html +1 -1
- data/doc/rdoc/files/ext/esi/esi_parser_c.html +1 -1
- data/doc/rdoc/files/ext/esi/parser_c.html +1 -1
- data/doc/rdoc/files/ext/esi/parser_h.html +1 -1
- data/doc/rdoc/files/ext/esi/parser_rl.html +122 -82
- data/doc/rdoc/files/ext/esi/test/test_c.html +1 -1
- data/doc/rdoc/files/lib/esi/cache_rb.html +2 -1
- data/doc/rdoc/files/lib/esi/config_rb.html +2 -1
- data/doc/rdoc/files/lib/esi/dispatcher_rb.html +3 -1
- data/doc/rdoc/files/lib/esi/invalidator_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/logger_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/parser_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/processor_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/proxy_rb.html +2 -2
- data/doc/rdoc/files/{ext/esi/test/parser_c.html → lib/esi/rack_adapter_rb.html} +21 -5
- data/doc/rdoc/files/lib/esi/response_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/router_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/tag/attempt_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/tag/base_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/tag/container_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/tag/except_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/tag/include_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/tag/invalidate_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/tag/try_rb.html +1 -1
- data/doc/rdoc/files/lib/esi/version_rb.html +1 -1
- data/doc/rdoc/files/lib/multi_dirhandler_rb.html +1 -1
- data/doc/rdoc/fr_class_index.html +4 -0
- data/doc/rdoc/fr_file_index.html +1 -5
- data/doc/rdoc/fr_method_index.html +87 -76
- data/ext/esi/esi_parser.c +2 -2
- data/ext/esi/parser.c +133 -107
- data/ext/esi/parser.h +9 -4
- data/ext/esi/parser.rl +99 -73
- data/ext/esi/test/test.c +11 -6
- data/lib/esi/cache.rb +7 -3
- data/lib/esi/config.rb +4 -8
- data/lib/esi/dispatcher.rb +14 -5
- data/lib/esi/processor.rb +1 -1
- data/lib/esi/proxy.rb +58 -48
- data/lib/esi/rack_adapter.rb +97 -0
- data/lib/esi/response.rb +30 -1
- data/lib/esi/version.rb +1 -1
- data/test/bench-plot.rb +31 -0
- data/test/benchmarks/csv-perf-serial0.4 +101 -0
- data/test/benchmarks/csv-perf-trunk +101 -0
- data/test/benchmarks/perf-serial0.4-n1000-c1.csv +101 -0
- data/test/benchmarks/perf-serial0.4-n1000-c2.csv +101 -0
- data/test/benchmarks/perf-serial0.4-n1000-c3.csv +101 -0
- data/test/benchmarks/perf-serial0.4-n1000-c4.csv +101 -0
- data/test/benchmarks/perf-serial0.4-n1000-c5.csv +101 -0
- data/test/benchmarks/perf-serial0.4-n1000-c6.csv +101 -0
- data/test/benchmarks/perf-serial0.4-n1000-c7.csv +101 -0
- data/test/benchmarks/perf-trunk-n1000-c1.csv +101 -0
- data/test/benchmarks/perf-trunk-n1000-c2.csv +101 -0
- data/test/benchmarks/perf-trunk-n1000-c3.csv +101 -0
- data/test/benchmarks/perf-trunk-n1000-c4.csv +101 -0
- data/test/benchmarks/perf-trunk-n1000-c5.csv +101 -0
- data/test/benchmarks/perf-trunk-n1000-c6.csv +101 -0
- data/test/benchmarks/perf-trunk-n1000-c7.csv +101 -0
- data/test/load_test.rb +5 -2
- data/test/load_test_ab.rb +9 -4
- metadata +261 -227
- data/doc/rdoc/classes/ESI/Config.src/M000057.html +0 -18
- data/doc/rdoc/classes/ESI/Config.src/M000058.html +0 -20
- data/doc/rdoc/classes/ESI/Config.src/M000060.html +0 -24
- data/doc/rdoc/classes/ESI/Dispatcher.src/M000088.html +0 -18
- data/doc/rdoc/classes/ESI/MemcachedCache.src/M000047.html +0 -18
- data/doc/rdoc/classes/ESI/Proxy.src/M000069.html +0 -20
- data/doc/rdoc/classes/ESI/Proxy.src/M000070.html +0 -55
- data/doc/rdoc/classes/ESI/Response.src/M000078.html +0 -23
- data/doc/rdoc/files/ext/esi/test/common_rl.html +0 -160
- data/doc/rdoc/files/ext/esi/test/parser_h.html +0 -101
- data/doc/rdoc/files/ext/esi/test/parser_rl.html +0 -827
- data/doc/rdoc/files/ext/esi/test/sp_c.html +0 -101
- data/ext/esi/test/common.rl +0 -46
- data/ext/esi/test/parser.c +0 -1875
- data/ext/esi/test/parser.h +0 -120
- data/ext/esi/test/parser.rl +0 -585
- data/ext/esi/test/sp.c +0 -125
data/ext/esi/parser.h
CHANGED
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
#include <sys/types.h>
|
|
8
8
|
|
|
9
9
|
/* how much output to hold in memory before sending out */
|
|
10
|
-
#define ESI_OUTPUT_BUFFER_SIZE
|
|
10
|
+
#define ESI_OUTPUT_BUFFER_SIZE 4096
|
|
11
|
+
#define ESI_ECHOBUFFER_SIZE 128
|
|
11
12
|
|
|
12
13
|
char *esi_strndup( const char *str, size_t len );
|
|
13
14
|
|
|
@@ -28,8 +29,10 @@ char *esi_strndup( const char *str, size_t len );
|
|
|
28
29
|
*
|
|
29
30
|
* */
|
|
30
31
|
typedef struct _ESIAttr {
|
|
31
|
-
char *name;
|
|
32
|
-
char *value;
|
|
32
|
+
const char *name;
|
|
33
|
+
const char *value;
|
|
34
|
+
size_t name_length;
|
|
35
|
+
size_t value_length;
|
|
33
36
|
struct _ESIAttr *next;
|
|
34
37
|
}ESIAttribute;
|
|
35
38
|
|
|
@@ -59,8 +62,10 @@ typedef struct _ESIParser {
|
|
|
59
62
|
void *user_data;
|
|
60
63
|
|
|
61
64
|
const char *mark;
|
|
62
|
-
size_t overflow_data_size; /*
|
|
65
|
+
size_t overflow_data_size; /* amount of the overflow buffer being used */
|
|
66
|
+
size_t overflow_data_allocated; /* amount of memory allocated to use for the overflow buffer */
|
|
63
67
|
char *overflow_data; /* overflow buffer if execute finishes and we are not in a final state store the parse data */
|
|
68
|
+
unsigned using_overflow:1; /* if this is 1, overflow data is in use. */
|
|
64
69
|
|
|
65
70
|
size_t echobuffer_allocated; /* amount of memory allocated for the echobuffer */
|
|
66
71
|
size_t echobuffer_index; /* current write position of the last echo'ed character */
|
data/ext/esi/parser.rl
CHANGED
|
@@ -64,6 +64,21 @@ static void esi_parser_echo_char( ESIParser *parser, char ch )
|
|
|
64
64
|
esi_parser_flush_output( parser );
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
+
static void esi_parser_send_buffer( ESIParser *parser, const char *seq, size_t len )
|
|
68
|
+
{
|
|
69
|
+
const char *nseq = seq + len;
|
|
70
|
+
size_t nlen = parser->output_buffer_size + len;
|
|
71
|
+
|
|
72
|
+
if( nlen < ESI_OUTPUT_BUFFER_SIZE ) {
|
|
73
|
+
memcpy( parser->output_buffer + parser->output_buffer_size, seq, len );
|
|
74
|
+
parser->output_buffer_size += len;
|
|
75
|
+
}
|
|
76
|
+
else if( nlen > ESI_OUTPUT_BUFFER_SIZE ) {
|
|
77
|
+
while( seq != nseq ) {
|
|
78
|
+
esi_parser_echo_char( parser, *seq++ );
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
67
82
|
/* send any buffered characters to the output handler.
|
|
68
83
|
* This happens when we enter a case such as <em> where the
|
|
69
84
|
* first two characters < and e match the <esi: expression
|
|
@@ -99,6 +114,7 @@ static void esi_parser_concat_to_echobuffer( ESIParser *parser, char ch )
|
|
|
99
114
|
/* double the echobuffer size
|
|
100
115
|
* we're getting some crazy input if this case ever happens
|
|
101
116
|
*/
|
|
117
|
+
printf( "increase echobuffer: %d, %s\n", parser->echobuffer_allocated, parser->echobuffer );
|
|
102
118
|
parser->echobuffer_allocated *= 2;
|
|
103
119
|
parser->echobuffer = (char*)realloc( parser->echobuffer, parser->echobuffer_allocated );
|
|
104
120
|
}
|
|
@@ -165,9 +181,8 @@ static void rtrim_pointer( const char **ptr, const char *bounds, size_t *len )
|
|
|
165
181
|
/* send the start tag and end tag message */
|
|
166
182
|
esi_parser_flush_output( parser );
|
|
167
183
|
parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->attributes, parser->user_data );
|
|
168
|
-
esi_parser_flush_output( parser );
|
|
169
184
|
parser->end_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->user_data );
|
|
170
|
-
|
|
185
|
+
//printf("\t[see inline tag]\n");
|
|
171
186
|
|
|
172
187
|
/* mark the position */
|
|
173
188
|
parser->tag_text = NULL;
|
|
@@ -187,7 +202,7 @@ static void rtrim_pointer( const char **ptr, const char *bounds, size_t *len )
|
|
|
187
202
|
/* send the start and end tag message */
|
|
188
203
|
esi_parser_flush_output( parser );
|
|
189
204
|
parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->attributes, parser->user_data );
|
|
190
|
-
|
|
205
|
+
//printf("\t[see start tag with attributes]\n");
|
|
191
206
|
|
|
192
207
|
parser->tag_text = NULL;
|
|
193
208
|
parser->tag_text_length = 0;
|
|
@@ -253,7 +268,7 @@ static void rtrim_pointer( const char **ptr, const char *bounds, size_t *len )
|
|
|
253
268
|
|
|
254
269
|
esi_parser_flush_output( parser );
|
|
255
270
|
parser->start_tag_handler( data, parser->tag_text, parser->tag_text_length, NULL, parser->user_data );
|
|
256
|
-
|
|
271
|
+
//printf("\t[see start tag]\n");
|
|
257
272
|
|
|
258
273
|
esi_parser_echobuffer_clear( parser );
|
|
259
274
|
}
|
|
@@ -271,7 +286,7 @@ static void rtrim_pointer( const char **ptr, const char *bounds, size_t *len )
|
|
|
271
286
|
|
|
272
287
|
esi_parser_flush_output( parser );
|
|
273
288
|
parser->end_tag_handler( data, parser->tag_text, parser->tag_text_length, parser->user_data );
|
|
274
|
-
|
|
289
|
+
//printf("\t[see end tag]\n");
|
|
275
290
|
|
|
276
291
|
esi_parser_echobuffer_clear( parser );
|
|
277
292
|
}
|
|
@@ -319,8 +334,10 @@ char *esi_strndup( const char *str, size_t len )
|
|
|
319
334
|
ESIAttribute *esi_attribute_new( const char *name, size_t name_length, const char *value, size_t value_length )
|
|
320
335
|
{
|
|
321
336
|
ESIAttribute *attr = (ESIAttribute*)malloc(sizeof(ESIAttribute));
|
|
322
|
-
attr->name = esi_strndup(name, name_length);
|
|
323
|
-
attr->value = esi_strndup(value, value_length);
|
|
337
|
+
attr->name = name;//esi_strndup(name, name_length);
|
|
338
|
+
attr->value = value;//esi_strndup(value, value_length);
|
|
339
|
+
attr->name_length = name_length;
|
|
340
|
+
attr->value_length = value_length;
|
|
324
341
|
attr->next = NULL;
|
|
325
342
|
return attr;
|
|
326
343
|
}
|
|
@@ -331,16 +348,16 @@ ESIAttribute *esi_attribute_copy( ESIAttribute *attribute )
|
|
|
331
348
|
if( !attribute ){ return NULL; }
|
|
332
349
|
|
|
333
350
|
// copy the first attribute
|
|
334
|
-
nattr = esi_attribute_new( attribute->name,
|
|
335
|
-
attribute->value,
|
|
351
|
+
nattr = esi_attribute_new( attribute->name, attribute->name_length,
|
|
352
|
+
attribute->value, attribute->value_length );
|
|
336
353
|
// save a pointer for return
|
|
337
354
|
head = nattr;
|
|
338
355
|
// copy next attributes
|
|
339
356
|
attribute = attribute->next;
|
|
340
357
|
while( attribute ) {
|
|
341
358
|
// set the next attribute
|
|
342
|
-
nattr->next = esi_attribute_new( attribute->name,
|
|
343
|
-
attribute->value,
|
|
359
|
+
nattr->next = esi_attribute_new( attribute->name, attribute->name_length,
|
|
360
|
+
attribute->value, attribute->value_length );
|
|
344
361
|
// next attribute
|
|
345
362
|
nattr = nattr->next;
|
|
346
363
|
attribute = attribute->next;
|
|
@@ -352,8 +369,8 @@ void esi_attribute_free( ESIAttribute *attribute )
|
|
|
352
369
|
{
|
|
353
370
|
ESIAttribute *ptr;
|
|
354
371
|
while( attribute ){
|
|
355
|
-
free( attribute->name );
|
|
356
|
-
free( attribute->value );
|
|
372
|
+
// free( attribute->name );
|
|
373
|
+
// free( attribute->value );
|
|
357
374
|
ptr = attribute->next;
|
|
358
375
|
free( attribute );
|
|
359
376
|
attribute = ptr;
|
|
@@ -370,9 +387,11 @@ ESIParser *esi_parser_new()
|
|
|
370
387
|
parser->attr_value = NULL;
|
|
371
388
|
parser->overflow_data_size = 0;
|
|
372
389
|
parser->overflow_data = NULL;
|
|
390
|
+
parser->overflow_data_allocated = 0;
|
|
391
|
+
parser->using_overflow = 0;
|
|
373
392
|
|
|
374
393
|
/* allocate ESI_OUTPUT_BUFFER_SIZE bytes for the echobuffer */
|
|
375
|
-
parser->echobuffer_allocated =
|
|
394
|
+
parser->echobuffer_allocated = ESI_ECHOBUFFER_SIZE;
|
|
376
395
|
parser->echobuffer_index = -1;
|
|
377
396
|
parser->echobuffer = (char*)malloc(sizeof(char)*parser->echobuffer_allocated);
|
|
378
397
|
|
|
@@ -393,6 +412,7 @@ void esi_parser_free( ESIParser *parser )
|
|
|
393
412
|
if( parser->overflow_data ){ free( parser->overflow_data ); }
|
|
394
413
|
|
|
395
414
|
free( parser->echobuffer );
|
|
415
|
+
|
|
396
416
|
esi_attribute_free( parser->attributes );
|
|
397
417
|
|
|
398
418
|
free( parser );
|
|
@@ -465,6 +485,54 @@ esi_parser_scan_for_start( ESIParser *parser, const char *data, size_t length )
|
|
|
465
485
|
}
|
|
466
486
|
}
|
|
467
487
|
|
|
488
|
+
static void
|
|
489
|
+
esi_parser_append_data_to_overflow_data( ESIParser *parser, const char *data, size_t length )
|
|
490
|
+
{
|
|
491
|
+
int mark_offset = 0;
|
|
492
|
+
int tag_text_offset = 0;
|
|
493
|
+
int attr_key_offset = 0;
|
|
494
|
+
int attr_value_offset = 0;
|
|
495
|
+
|
|
496
|
+
if( parser->using_overflow ) {
|
|
497
|
+
// recompute mark, tag_text, attr_key, and attr_value as they all exist within overflow_data
|
|
498
|
+
mark_offset = compute_offset( parser->mark, parser->overflow_data );
|
|
499
|
+
tag_text_offset = compute_offset( parser->tag_text, parser->overflow_data );
|
|
500
|
+
attr_key_offset = compute_offset( parser->attr_key, parser->overflow_data );
|
|
501
|
+
attr_value_offset = compute_offset( parser->attr_value, parser->overflow_data );
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
// recompute mark, tag_text, attr_key, and attr_value as they all exist within data
|
|
505
|
+
mark_offset = compute_offset( parser->mark, data );
|
|
506
|
+
tag_text_offset = compute_offset( parser->tag_text, data );
|
|
507
|
+
attr_key_offset = compute_offset( parser->attr_key, data );
|
|
508
|
+
attr_value_offset = compute_offset( parser->attr_value, data );
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
if( parser->overflow_data ) {
|
|
512
|
+
// check if we need to resize or grow the buffer
|
|
513
|
+
if( (parser->overflow_data_size + length) > parser->overflow_data_allocated ) {
|
|
514
|
+
parser->overflow_data_allocated += length;
|
|
515
|
+
// printf( "realloc: %d bytes, using %d\n", (int)parser->overflow_data_allocated, (int)(parser->overflow_data_size+length) );
|
|
516
|
+
parser->overflow_data = (char*)realloc( parser->overflow_data, sizeof(char)*(parser->overflow_data_allocated) );
|
|
517
|
+
}
|
|
518
|
+
memcpy( parser->overflow_data+parser->overflow_data_size, data, length );
|
|
519
|
+
parser->overflow_data_size += length;
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
parser->overflow_data_allocated = ESI_OUTPUT_BUFFER_SIZE > length ? ESI_OUTPUT_BUFFER_SIZE : length;
|
|
523
|
+
parser->overflow_data = (char*)malloc( sizeof( char ) * parser->overflow_data_allocated );
|
|
524
|
+
memcpy( parser->overflow_data, data, length );
|
|
525
|
+
parser->overflow_data_size = length;
|
|
526
|
+
// printf( "malloc: %d for %d bytes\n", (int)parser->overflow_data_allocated, (int)length );
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
// in our new memory space mark will now be
|
|
530
|
+
parser->mark = ( mark_offset >= 0 ) ? parser->overflow_data + mark_offset : NULL;
|
|
531
|
+
parser->tag_text = ( tag_text_offset >= 0 ) ? parser->overflow_data + tag_text_offset : NULL;
|
|
532
|
+
parser->attr_key = ( attr_key_offset >= 0 ) ? parser->overflow_data + attr_key_offset : NULL;
|
|
533
|
+
parser->attr_value = ( attr_value_offset >= 0 ) ? parser->overflow_data + attr_value_offset : NULL;
|
|
534
|
+
}
|
|
535
|
+
|
|
468
536
|
/* accept an arbitrary length string buffer
|
|
469
537
|
* when this methods exits it determines if an end state was reached
|
|
470
538
|
* if no end state was reached it saves the full input into an internal buffer
|
|
@@ -482,49 +550,31 @@ int esi_parser_execute( ESIParser *parser, const char *data, size_t length )
|
|
|
482
550
|
if( length == 0 ){ return cs; }
|
|
483
551
|
|
|
484
552
|
/* scan data for any '<esi:' start sequences, /<$/, /<e$/, /<es$/, /<esi$/, /<esi:$/ */
|
|
485
|
-
if( cs == esi_start ) {
|
|
553
|
+
if( cs == esi_start || cs == 0 ) {
|
|
486
554
|
pindex = esi_parser_scan_for_start( parser, data, length );
|
|
487
|
-
if( pindex == -1 ) {
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
}
|
|
491
|
-
return cs;
|
|
555
|
+
if( pindex == -1 ) { /* this means there are no start sequences in the buffer we recieved */
|
|
556
|
+
esi_parser_send_buffer( parser, data, length );
|
|
557
|
+
return cs; /* no esi start sequences send it all out and break out early */
|
|
492
558
|
}
|
|
493
559
|
}
|
|
494
560
|
|
|
495
|
-
/* there's an existing overflow buffer
|
|
496
|
-
if( parser->overflow_data && parser->overflow_data_size > 0 ) {
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
int tag_text_offset = compute_offset( parser->tag_text, parser->overflow_data );
|
|
501
|
-
int attr_key_offset = compute_offset( parser->attr_key, parser->overflow_data );
|
|
502
|
-
int attr_value_offset = compute_offset( parser->attr_value, parser->overflow_data );
|
|
503
|
-
|
|
504
|
-
parser->overflow_data = (char*)realloc( parser->overflow_data, sizeof(char)*(parser->overflow_data_size+length) );
|
|
505
|
-
memcpy( parser->overflow_data+parser->overflow_data_size, data, length );
|
|
561
|
+
/* there's an existing overflow buffer and it's being used, append the new data */
|
|
562
|
+
//if( parser->overflow_data && parser->overflow_data_size > 0 ) {
|
|
563
|
+
if( parser->using_overflow ) {
|
|
564
|
+
int prev_overflow_size = parser->overflow_data_size; // save the current overflow size
|
|
565
|
+
esi_parser_append_data_to_overflow_data( parser, data, length );
|
|
506
566
|
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
// in our new memory space mark will now be
|
|
510
|
-
parser->mark = ( mark_offset >= 0 ) ? parser->overflow_data + mark_offset : NULL;
|
|
511
|
-
parser->tag_text = ( tag_text_offset >= 0 ) ? parser->overflow_data + tag_text_offset : NULL;
|
|
512
|
-
parser->attr_key = ( attr_key_offset >= 0 ) ? parser->overflow_data + attr_key_offset : NULL;
|
|
513
|
-
parser->attr_value = ( attr_value_offset >= 0 ) ? parser->overflow_data + attr_value_offset : NULL;
|
|
514
|
-
|
|
567
|
+
/* set parser variables */
|
|
568
|
+
p = parser->overflow_data + prev_overflow_size;
|
|
515
569
|
data = parser->overflow_data;
|
|
516
|
-
|
|
517
|
-
// printf( "grow overflow data: %ld\n", parser->overflow_data_size );
|
|
570
|
+
length = parser->overflow_data_size;
|
|
518
571
|
pe = data + length;
|
|
519
|
-
|
|
520
572
|
}
|
|
521
573
|
|
|
522
574
|
if( !parser->mark ) {
|
|
523
575
|
parser->mark = p;
|
|
524
576
|
}
|
|
525
577
|
|
|
526
|
-
// printf( "cs: %d, ", cs );
|
|
527
|
-
|
|
528
578
|
%% write exec;
|
|
529
579
|
|
|
530
580
|
parser->cs = cs;
|
|
@@ -532,37 +582,13 @@ int esi_parser_execute( ESIParser *parser, const char *data, size_t length )
|
|
|
532
582
|
if( cs != esi_start && cs != 0 ) {
|
|
533
583
|
|
|
534
584
|
/* reached the end and we're not at a termination point save the buffer as overflow */
|
|
535
|
-
if( !parser->
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
int tag_text_offset = compute_offset( parser->tag_text, data );
|
|
539
|
-
int attr_key_offset = compute_offset( parser->attr_key, data );
|
|
540
|
-
int attr_value_offset = compute_offset( parser->attr_value, data );
|
|
541
|
-
//debug_string( "mark before move", parser->mark, 1 );
|
|
542
|
-
|
|
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 );
|
|
550
|
-
memcpy( parser->overflow_data, data, length );
|
|
551
|
-
parser->overflow_data_size = length;
|
|
552
|
-
//printf( "allocate overflow data: %ld\n", parser->echobuffer_allocated );
|
|
553
|
-
|
|
554
|
-
// in our new memory space mark will now be
|
|
555
|
-
parser->mark = ( mark_offset >= 0 ) ? parser->overflow_data + mark_offset : NULL;
|
|
556
|
-
parser->tag_text = ( tag_text_offset >= 0 ) ? parser->overflow_data + tag_text_offset : NULL;
|
|
557
|
-
parser->attr_key = ( attr_key_offset >= 0 ) ? parser->overflow_data + attr_key_offset : NULL;
|
|
558
|
-
parser->attr_value = ( attr_value_offset >= 0 ) ? parser->overflow_data + attr_value_offset : NULL;
|
|
559
|
-
//if( parser->mark ){ debug_string( "mark after move", parser->mark, 1 ); } else { printf( "mark is now empty\n" ); }
|
|
585
|
+
if( !parser->using_overflow ) {
|
|
586
|
+
esi_parser_append_data_to_overflow_data( parser, data, length );
|
|
587
|
+
parser->using_overflow = 1;
|
|
560
588
|
}
|
|
561
589
|
|
|
562
|
-
}else if( parser->
|
|
563
|
-
|
|
564
|
-
free( parser->overflow_data );
|
|
565
|
-
parser->overflow_data = NULL;
|
|
590
|
+
} else if ( parser->using_overflow ) {
|
|
591
|
+
parser->using_overflow = 0;
|
|
566
592
|
parser->overflow_data_size = 0;
|
|
567
593
|
}
|
|
568
594
|
|
data/ext/esi/test/test.c
CHANGED
|
@@ -38,11 +38,16 @@ TagInfo* tag_info_new( const char *name, size_t len, ESIAttribute *attributes )
|
|
|
38
38
|
static
|
|
39
39
|
void tag_info_show( TagInfo *ti )
|
|
40
40
|
{
|
|
41
|
+
char buffer1[1024], buffer2[1024];
|
|
41
42
|
ESIAttribute *attrs = ti->attributes;
|
|
42
43
|
if( attrs ) {
|
|
43
44
|
printf("%s{", ti->name );
|
|
44
45
|
while( attrs ) {
|
|
45
|
-
|
|
46
|
+
memcpy( buffer1, attrs->name, attrs->name_length );
|
|
47
|
+
buffer1[attrs->name_length] = '\0';
|
|
48
|
+
memcpy( buffer2, attrs->value, attrs->value_length );
|
|
49
|
+
buffer2[attrs->value_length] = '\0';
|
|
50
|
+
printf( "(%s=>%s),", buffer1, buffer2 );
|
|
46
51
|
attrs = attrs->next;
|
|
47
52
|
}
|
|
48
53
|
printf("}\n");
|
|
@@ -198,7 +203,7 @@ static void feed_data( ESIParser *parser, const char *data )
|
|
|
198
203
|
#define TEST_WITH_FILE(file)\
|
|
199
204
|
int size = 0;\
|
|
200
205
|
FILE *input = NULL;\
|
|
201
|
-
char buffer[
|
|
206
|
+
char buffer[4096]; \
|
|
202
207
|
TEST_INIT\
|
|
203
208
|
\
|
|
204
209
|
input = fopen( file, "r" );\
|
|
@@ -207,7 +212,7 @@ static void feed_data( ESIParser *parser, const char *data )
|
|
|
207
212
|
return;\
|
|
208
213
|
}\
|
|
209
214
|
\
|
|
210
|
-
while( (size = fread( buffer, sizeof(char),
|
|
215
|
+
while( (size = fread( buffer, sizeof(char), 4095, input )) > 0 ){\
|
|
211
216
|
esi_parser_execute( parser, buffer, size );\
|
|
212
217
|
}\
|
|
213
218
|
\
|
|
@@ -281,13 +286,13 @@ static void test_small_buffer( ESIParser *parser )
|
|
|
281
286
|
int i, len = strlen(input);
|
|
282
287
|
|
|
283
288
|
TEST_INIT
|
|
289
|
+
// printf("\n");
|
|
284
290
|
|
|
285
291
|
for( i = 0; i < len; i += input_size ) {
|
|
286
292
|
if( i + input_size <= len ) {
|
|
287
293
|
esi_parser_execute( parser, (input+i), input_size );
|
|
288
294
|
}
|
|
289
295
|
else {
|
|
290
|
-
printf("using: %d\n", len - i );
|
|
291
296
|
esi_parser_execute( parser, (input+i), len - i );
|
|
292
297
|
}
|
|
293
298
|
}
|
|
@@ -545,10 +550,10 @@ static void test_large_chunked_file( ESIParser *parser )
|
|
|
545
550
|
buffer_end = buffer + size;
|
|
546
551
|
|
|
547
552
|
for( chunk_start = buffer; chunk_start != buffer_end; ) {
|
|
548
|
-
while(
|
|
553
|
+
while( chunk_start != buffer_end && *chunk_start != '{' ) { ++chunk_start; }
|
|
549
554
|
if( chunk_start == buffer_end ){ break; }
|
|
550
555
|
chunk_end = chunk_start;
|
|
551
|
-
while(
|
|
556
|
+
while( chunk_end != buffer_end && *chunk_end != '}' ) { ++chunk_end; }
|
|
552
557
|
++chunk_start;
|
|
553
558
|
if( chunk_start > buffer_end ){ break; }
|
|
554
559
|
|
data/lib/esi/cache.rb
CHANGED
|
@@ -92,8 +92,12 @@ module ESI
|
|
|
92
92
|
#
|
|
93
93
|
class MemcachedCache < Cache
|
|
94
94
|
require 'rubygems'
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
begin
|
|
96
|
+
require 'memcached'
|
|
97
|
+
rescue => e
|
|
98
|
+
puts "using memcache client"
|
|
99
|
+
require 'memcache'
|
|
100
|
+
end
|
|
97
101
|
include ESI::Log
|
|
98
102
|
|
|
99
103
|
def initialize( options )
|
|
@@ -175,7 +179,7 @@ module ESI
|
|
|
175
179
|
def get( uri, params )
|
|
176
180
|
key = cache_key(uri,params)
|
|
177
181
|
fragment = @semaphore.synchronize { @cache[key] }
|
|
178
|
-
fragment.dup if fragment and fragment.respond_to?(:dup)
|
|
182
|
+
fragment.dup if fragment and fragment.valid? and fragment.respond_to?(:dup)
|
|
179
183
|
end
|
|
180
184
|
|
|
181
185
|
def put( uri, params, max_age, body )
|
data/lib/esi/config.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Copyright (c) 2008 Todd A. Fisher
|
|
2
2
|
# see LICENSE
|
|
3
3
|
require 'ostruct'
|
|
4
|
+
require 'esi/router'
|
|
4
5
|
|
|
5
6
|
module ESI
|
|
6
7
|
# This file provides configuration options to mongrel-esi
|
|
@@ -108,6 +109,8 @@ module ESI
|
|
|
108
109
|
yield cache_options
|
|
109
110
|
if cache_options.memcached?
|
|
110
111
|
@config[:cache] = 'memcached'
|
|
112
|
+
else
|
|
113
|
+
@config[:cache] = 'ruby'
|
|
111
114
|
end
|
|
112
115
|
@config[:cache_options] = cache_options.options
|
|
113
116
|
else
|
|
@@ -135,7 +138,7 @@ module ESI
|
|
|
135
138
|
end
|
|
136
139
|
|
|
137
140
|
def router
|
|
138
|
-
Router.new( @config[:routing] )
|
|
141
|
+
ESI::Router.new( @config[:routing] )
|
|
139
142
|
end
|
|
140
143
|
|
|
141
144
|
class ConfigRouter
|
|
@@ -169,13 +172,6 @@ module ESI
|
|
|
169
172
|
@config[:routing] = config_router.routes
|
|
170
173
|
end
|
|
171
174
|
|
|
172
|
-
# return true/false depending on the value of
|
|
173
|
-
# invalidator: on/off
|
|
174
|
-
# within in config/esi.yml
|
|
175
|
-
def start_invalidator?
|
|
176
|
-
@config[:invalidator]
|
|
177
|
-
end
|
|
178
|
-
|
|
179
175
|
def self.define( listeners )
|
|
180
176
|
listeners.each do|host,server|
|
|
181
177
|
esi_handlers = server.classifier.handler_map.select do|uri,handler|
|
data/lib/esi/dispatcher.rb
CHANGED
|
@@ -1,22 +1,31 @@
|
|
|
1
|
+
require 'mongrel'
|
|
1
2
|
require 'esi/proxy'
|
|
3
|
+
require 'esi/logger'
|
|
2
4
|
|
|
3
5
|
module ESI
|
|
4
6
|
|
|
5
7
|
class Dispatcher < Mongrel::HttpHandler
|
|
6
|
-
attr_reader :config
|
|
8
|
+
attr_reader :config
|
|
9
|
+
include ESI::Log
|
|
7
10
|
|
|
8
11
|
Thread.abort_on_exception = false
|
|
9
12
|
|
|
10
13
|
def initialize( options )
|
|
11
14
|
super()
|
|
12
15
|
@config = ESI::Config.new( options )
|
|
13
|
-
if @config.start_invalidator?
|
|
14
|
-
ESI::Invalidator.start( self )
|
|
15
|
-
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def process(request, response)
|
|
19
|
-
|
|
19
|
+
start = Time.now
|
|
20
|
+
|
|
21
|
+
url = @config.router.url_for(request.params["REQUEST_URI"])
|
|
22
|
+
|
|
23
|
+
chunk_count, bytes_sent, status, sent_from_cache = ESI::Proxy.new(@config).process(url, request,response)
|
|
24
|
+
|
|
25
|
+
rescue => e
|
|
26
|
+
log_error "\n#{e.message}: error at #{e.backtrace.first} msg at #{__FILE__}:#{__LINE__}\n"
|
|
27
|
+
ensure
|
|
28
|
+
log_request "\n#{url}, #{Time.now - start} seconds with status #{status} #{sent_from_cache ? "from cache" : ''} and #{chunk_count} chunks, #{bytes_sent} bytes\n"
|
|
20
29
|
end
|
|
21
30
|
|
|
22
31
|
end
|