aboutsummaryrefslogtreecommitdiff
path: root/src/executor.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/executor.rs')
-rw-r--r--src/executor.rs96
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"));
+ }
}