diff options
Diffstat (limited to 'src/executor.rs')
-rw-r--r-- | src/executor.rs | 96 |
1 files changed, 71 insertions, 25 deletions
diff --git a/src/executor.rs b/src/executor.rs index 4323bc0..6b1bc5a 100644 --- a/src/executor.rs +++ b/src/executor.rs @@ -42,14 +42,15 @@ impl Context { let value = String::from( var.name("value") .map(|m| m.as_str()) - .or(Some(&String::from(""))).unwrap() + .or(Some(&String::from(""))) + .unwrap(), ); buffer = buffer.replace( // Since this iterates over matches, having match 0 is guaranteed. So the // `unwrap()` operation here is safe. var.get(0).unwrap().as_str(), - self.vars.get(&key).or(Some(&value)).unwrap() + self.vars.get(&key).or(Some(&value)).unwrap(), ); } @@ -66,23 +67,32 @@ impl Executor { Executor { context } } - fn make_req(&self, bfile: &BarbFile, output: &BarbOutput) -> ureq::Request { - output.req( - bfile.method_as_string(), - self.context.substitute(&bfile.url()), - ); + fn make_req( + &self, + bfile: &BarbFile, + headers: Vec<(String, String)>, + output: &BarbOutput, + ) -> ureq::Request { let mut req = ureq::request( bfile.method_as_string().as_str(), self.context.substitute(&bfile.url()).as_str(), ); + let mut final_headers: HashMap<String, String> = HashMap::new(); + for header in bfile.headers() { let hdr_val = self.context.substitute(header.value()); - req = req.set(header.name(), hdr_val.as_str()); - output.req_hdr(header.name().to_string(), hdr_val); + final_headers.insert(String::from(header.name()), hdr_val); } - output.end_req(); + for header in headers { + final_headers.insert(header.0, header.1); + } + + for (hdr_name, hdr_val) in final_headers.iter() { + req = req.set(hdr_name.as_str(), hdr_val.as_str()); + output.req_hdr(String::from(hdr_name), String::from(hdr_val)); + } req } @@ -125,15 +135,34 @@ impl Executor { } } + pub fn execute_dep(&mut self, bfile: &BarbFile, output: &BarbOutput) -> Result<(), String> { + let req = self.make_req(&bfile, vec![], output); + let method = String::from(req.method()); + let url = String::from(req.url()); + + let response = self.run(&bfile, req)?; + + output.req_dep(method, url, response.status(), response.status_text()); + output.end_req(); + self.apply_filters(&bfile, response.into_string().unwrap(), &None)?; + + Ok(()) + } + pub fn execute( &mut self, bfile: &BarbFile, output: &BarbOutput, filter: &Option<String>, - skip_filters: bool + skip_filters: bool, + headers: Vec<(String, String)>, ) -> Result<(), String> { - let response = self.run(&bfile, self.make_req(&bfile, output))?; - //let response = executor.execute(&bfile, &output)?; + let req = self.make_req(&bfile, headers, output); + + output.req(String::from(req.method()), String::from(req.url())); + output.end_req(); + + let response = self.run(&bfile, req)?; output.status(response.status(), response.status_text()); for header_name in response.headers_names() { @@ -144,7 +173,7 @@ impl Executor { } output.end_resp_hdr(); - if ! skip_filters { + if !skip_filters { output.body(self.apply_filters(&bfile, response.into_string().unwrap(), filter)?); } else { output.body(response.into_string().unwrap()); @@ -217,9 +246,7 @@ mod tests_context { #[test] fn test_context_substitute_value_with_default() { - let vars: Vec<(String, String)> = vec![ - (String::from("chewie"), String::from("han")), - ]; + let vars: Vec<(String, String)> = vec![(String::from("chewie"), String::from("han"))]; let ctx = Context::new(vars.into_iter()); assert_eq!( ctx.substitute(&String::from("blah blah {chewie:-wookie} blah")), @@ -247,8 +274,8 @@ mod tests_make_req { fn test_make_req_simple_get() { let executor = Executor::new(Context::empty()); let bfile = BarbFile::from_str("#GET^http://foo.bar\n\n").unwrap(); - let output = BarbOutput::new(false, false, false, false, false, false); - let req = executor.make_req(&bfile, &output); + let output = BarbOutput::quiet(); + let req = executor.make_req(&bfile, vec![], &output); assert_eq!(req.url(), "http://foo.bar"); assert_eq!(req.method(), "GET"); @@ -258,14 +285,33 @@ mod tests_make_req { fn test_make_req_simple_headers() { let executor = Executor::new(Context::empty()); let bfile = BarbFile::from_str("#GET^http://foo.bar\n#Foo: Bar\n#Bar: Baz\n\n").unwrap(); - let output = BarbOutput::new(false, false, false, false, false, false); - let req = executor.make_req(&bfile, &output); + let output = BarbOutput::quiet(); + let req = executor.make_req(&bfile, vec![], &output); - assert_eq!( - req.header_names(), - vec![String::from("foo"), String::from("bar")] - ); + let mut header_names = req.header_names(); + header_names.sort(); + + assert_eq!(header_names, vec![String::from("bar"), String::from("foo")]); assert_eq!(req.header("foo"), Some("Bar")); assert_eq!(req.header("bar"), Some("Baz")); } + + #[test] + fn test_make_req_headers_override() { + let executor = Executor::new(Context::empty()); + let bfile = BarbFile::from_str("#GET^http://foo.bar\n#Foo: Bar\n#Bar: Baz\n\n").unwrap(); + let output = BarbOutput::quiet(); + let req = executor.make_req( + &bfile, + vec![(String::from("Foo"), String::from("Qux"))], + &output, + ); + + let mut header_names = req.header_names(); + header_names.sort(); + + assert_eq!(header_names, vec![String::from("bar"), String::from("foo")]); + assert_eq!(req.header("foo"), Some("Qux")); + assert_eq!(req.header("bar"), Some("Baz")); + } } |