diff --git a/integration/hurl/tests_ok/no_header/hurl/config b/integration/hurl/tests_ok/no_header/hurl/config new file mode 100644 index 00000000000..81d3782fc01 --- /dev/null +++ b/integration/hurl/tests_ok/no_header/hurl/config @@ -0,0 +1,2 @@ +--no-header user-agent +--no-header Accept diff --git a/integration/hurl/tests_ok/no_header/no_header_config_file.out b/integration/hurl/tests_ok/no_header/no_header_config_file.out new file mode 100644 index 00000000000..c57eff55ebc --- /dev/null +++ b/integration/hurl/tests_ok/no_header/no_header_config_file.out @@ -0,0 +1 @@ +Hello World! \ No newline at end of file diff --git a/integration/hurl/tests_ok/no_header/no_header_config_file.ps1 b/integration/hurl/tests_ok/no_header/no_header_config_file.ps1 new file mode 100644 index 00000000000..1e15bc29b92 --- /dev/null +++ b/integration/hurl/tests_ok/no_header/no_header_config_file.ps1 @@ -0,0 +1,5 @@ +Set-StrictMode -Version latest +$ErrorActionPreference = 'Stop' + +$env:XDG_CONFIG_HOME=$PSScriptRoot +hurl tests_ok/no_header/no_header.hurl diff --git a/integration/hurl/tests_ok/no_header/no_header_config_file.sh b/integration/hurl/tests_ok/no_header/no_header_config_file.sh new file mode 100755 index 00000000000..944258fe239 --- /dev/null +++ b/integration/hurl/tests_ok/no_header/no_header_config_file.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -Eeuo pipefail + +XDG_CONFIG_HOME=$(dirname "$0") +export XDG_CONFIG_HOME +hurl tests_ok/no_header/no_header.hurl diff --git a/packages/hurl/src/cli/options/config_file/mod.rs b/packages/hurl/src/cli/options/config_file/mod.rs index 52bf1e9e234..7ed14f5b73d 100644 --- a/packages/hurl/src/cli/options/config_file/mod.rs +++ b/packages/hurl/src/cli/options/config_file/mod.rs @@ -229,6 +229,19 @@ fn parse_option(reader: &mut Reader, options: &mut CliOptions) -> Result<(), Con options.no_cookie_store = true; Ok(()) } + "no-header" => { + parse_value_separator(reader)?; + let value = parse_value(reader)?; + + if value.is_empty() { + return Err(ConfigFileError::new( + save.pos, + "Option --no-header requires a value", + )); + } + options.no_headers.push(value); + Ok(()) + } "no-jsonpath-coercion" => { expect_no_value(reader)?; options.no_jsonpath_coercion = true; @@ -317,19 +330,19 @@ mod tests { let mut options = CliOptions::default(); assert!(parse_option(&mut reader, &mut options).is_ok()); assert_eq!(options.headers, vec!["header1:value1"]); - assert_eq!(reader.cursor().pos, Pos::new(1, 24)); + assert_eq!(reader.cursor().pos, Pos::new(2, 1)); let mut reader = Reader::new("--header header2:value2\n--verbose\n"); let mut options = CliOptions::default(); assert!(parse_option(&mut reader, &mut options).is_ok()); assert_eq!(options.headers, vec!["header2:value2"]); - assert_eq!(reader.cursor().pos, Pos::new(1, 24)); + assert_eq!(reader.cursor().pos, Pos::new(2, 1)); let mut reader = Reader::new("--header --test:1\n"); let mut options = CliOptions::default(); assert!(parse_option(&mut reader, &mut options).is_ok()); assert_eq!(options.headers, vec!["--test:1"]); - assert_eq!(reader.cursor().pos, Pos::new(1, 18)); + assert_eq!(reader.cursor().pos, Pos::new(2, 1)); } #[test] @@ -347,7 +360,7 @@ mod tests { let mut options = CliOptions::default(); assert!(parse_option(&mut reader, &mut options).is_ok()); assert_eq!(options.user, Some("bob@email.com:secret".to_string())); - assert_eq!(reader.cursor().pos, Pos::new(1, 28)); + assert_eq!(reader.cursor().pos, Pos::new(2, 1)); } #[test] @@ -356,7 +369,7 @@ mod tests { let mut options = CliOptions::default(); assert!(parse_option(&mut reader, &mut options).is_ok()); assert_eq!(options.delay, std::time::Duration::from_secs(1)); - assert_eq!(reader.cursor().pos, Pos::new(1, 11)); + assert_eq!(reader.cursor().pos, Pos::new(2, 1)); } #[test] @@ -365,7 +378,7 @@ mod tests { let mut options = CliOptions::default(); assert!(parse_option(&mut reader, &mut options).is_ok()); assert_eq!(options.limit_rate, Some(BytesPerSec(2_000_000))); - assert_eq!(reader.cursor().pos, Pos::new(1, 21)); + assert_eq!(reader.cursor().pos, Pos::new(2, 1)); } #[test] @@ -526,6 +539,16 @@ mod tests { assert_eq!(reader.cursor().pos, Pos::new(2, 1)); } + #[test] + fn test_parse_option_no_header() { + let mut reader = Reader::new("--no-header=user-agent\n"); + let mut options = CliOptions::default(); + assert!(options.no_headers.is_empty()); + assert!(parse_option(&mut reader, &mut options).is_ok()); + assert_eq!(options.no_headers, vec!["user-agent"]); + assert_eq!(reader.cursor().pos, Pos::new(2, 1)); + } + #[test] fn test_parse_option_no_jsonpath_coercion() { let mut reader = Reader::new("--no-jsonpath-coercion\n"); diff --git a/packages/hurl/src/cli/options/config_file/primitives.rs b/packages/hurl/src/cli/options/config_file/primitives.rs index 0280bf1a7db..e2a1f36b827 100644 --- a/packages/hurl/src/cli/options/config_file/primitives.rs +++ b/packages/hurl/src/cli/options/config_file/primitives.rs @@ -99,6 +99,9 @@ pub fn parse_value(reader: &mut Reader) -> Result { } } else { let s = reader.read_while(|c| c != '\n').trim().to_string(); + if reader.peek() == Some('\n') { + reader.read(); // consume newline + } Ok(s) } } @@ -197,12 +200,12 @@ mod tests { // You can have an empty value let mut reader = Reader::new("\n"); assert_eq!(parse_value(&mut reader).unwrap(), ""); - assert_eq!((reader.cursor().index), CharPos(0)); + assert_eq!((reader.cursor().index), CharPos(1)); // Unquoted String let mut reader = Reader::new("1\n"); assert_eq!(parse_value(&mut reader).unwrap(), "1"); - assert_eq!((reader.cursor().index), CharPos(1)); + assert_eq!((reader.cursor().index), CharPos(2)); // Quoted String let mut reader = Reader::new("\"Hello\"\n");