@@ -10,7 +10,7 @@ use fastly::http::request::PendingRequest;
10
10
use fastly:: http:: { header, Method , StatusCode , Url } ;
11
11
use fastly:: { mime, Body , Request , Response } ;
12
12
use log:: { debug, error, trace} ;
13
- use std:: collections:: VecDeque ;
13
+ use std:: collections:: { HashMap , VecDeque } ;
14
14
use std:: io:: { BufRead , Write } ;
15
15
16
16
pub use crate :: document:: { Element , Fragment } ;
@@ -142,6 +142,9 @@ impl Processor {
142
142
// `root_task` is the root task that will be used to fetch tags in recursive manner
143
143
let root_task = & mut Task :: new ( ) ;
144
144
145
+ // variables
146
+ let mut variables = HashMap :: new ( ) ;
147
+
145
148
let is_escaped = self . configuration . is_escaped_content ;
146
149
// Call the library to parse fn `parse_tags` which will call the callback function
147
150
// on each tag / event it finds in the document.
@@ -156,6 +159,7 @@ impl Processor {
156
159
is_escaped,
157
160
& original_request_metadata,
158
161
dispatch_fragment_request,
162
+ & mut variables,
159
163
)
160
164
} ,
161
165
) ?;
@@ -393,6 +397,7 @@ fn event_receiver(
393
397
is_escaped : bool ,
394
398
original_request_metadata : & Request ,
395
399
dispatch_fragment_request : & FragmentRequestDispatcher ,
400
+ variables : & mut HashMap < String , String > ,
396
401
) -> Result < ( ) > {
397
402
debug ! ( "got {:?}" , event) ;
398
403
@@ -430,12 +435,14 @@ fn event_receiver(
430
435
is_escaped,
431
436
original_request_metadata,
432
437
dispatch_fragment_request,
438
+ variables,
433
439
) ?;
434
440
let except_task = task_handler (
435
441
except_events,
436
442
is_escaped,
437
443
original_request_metadata,
438
444
dispatch_fragment_request,
445
+ variables,
439
446
) ?;
440
447
441
448
trace ! (
@@ -450,10 +457,17 @@ fn event_receiver(
450
457
} ) ;
451
458
}
452
459
Event :: ESI ( Tag :: Assign { name, value } ) => {
453
- // process assignment
460
+ variables . insert ( name , value ) ;
454
461
}
455
462
Event :: ESI ( Tag :: Vars { name } ) => {
456
- // process vars
463
+ if let Some ( name) = name {
464
+ if let Some ( value) = variables. get ( & name) {
465
+ let value = value. to_owned ( ) ;
466
+ queue. push_back ( Element :: Raw ( value. into_bytes ( ) ) ) ;
467
+ }
468
+ } else {
469
+ // TODO: long form
470
+ }
457
471
}
458
472
Event :: XML ( event) => {
459
473
debug ! ( "pushing content to buffer, len: {}" , queue. len( ) ) ;
@@ -473,6 +487,7 @@ fn task_handler(
473
487
is_escaped : bool ,
474
488
original_request_metadata : & Request ,
475
489
dispatch_fragment_request : & FragmentRequestDispatcher ,
490
+ variables : & mut HashMap < String , String > ,
476
491
) -> Result < Task > {
477
492
let mut task = Task :: new ( ) ;
478
493
for event in events {
@@ -482,6 +497,7 @@ fn task_handler(
482
497
is_escaped,
483
498
original_request_metadata,
484
499
dispatch_fragment_request,
500
+ variables,
485
501
) ?;
486
502
}
487
503
Ok ( task)
0 commit comments