diff --git a/packages/hurl/src/runner/entry.rs b/packages/hurl/src/runner/entry.rs index 18dcecd3a1d..7e75c51e0ab 100644 --- a/packages/hurl/src/runner/entry.rs +++ b/packages/hurl/src/runner/entry.rs @@ -161,10 +161,6 @@ pub fn run( }, }; - // Update variables now! - for c in captures.iter() { - variables.insert(c.name.clone(), c.value.clone()); - } if !captures.is_empty() { logger.debug_important("Captures:"); for c in captures.iter() { diff --git a/packages/hurl/src/runner/response.rs b/packages/hurl/src/runner/response.rs index 39901829d0d..07c6fe65b08 100644 --- a/packages/hurl/src/runner/response.rs +++ b/packages/hurl/src/runner/response.rs @@ -281,14 +281,18 @@ fn eval_implicit_body_asserts( } } +/// Evaluates captures from this HTTP `http_response`, given a set of `variables`. pub fn eval_captures( response: &Response, http_response: &http::Response, - variables: &HashMap, + variables: &mut HashMap, ) -> Result, Error> { let mut captures = vec![]; for capture in response.captures().iter() { let capture_result = eval_capture(capture, variables, http_response)?; + // Update variables now so the captures set is ready in case + // the next captures reference this new variable. + variables.insert(capture_result.name.clone(), capture_result.value.clone()); captures.push(capture_result); } Ok(captures) @@ -388,12 +392,12 @@ mod tests { #[test] pub fn test_eval_captures() { - let variables = HashMap::new(); + let mut variables = HashMap::new(); assert_eq!( eval_captures( &user_response(), &http::xml_two_users_http_response(), - &variables, + &mut variables, ) .unwrap(), vec![CaptureResult {