From 2edea43979a3b6c94a0dd8b4368f88a643f5c77b Mon Sep 17 00:00:00 2001 From: Fabrice Reix Date: Fri, 31 Jul 2026 08:27:18 +0200 Subject: [PATCH 1/2] Add no_header option in config_file --- .../hurl/tests_ok/no_header/hurl/config | 2 ++ .../no_header/no_header_config_file.out | 1 + .../no_header/no_header_config_file.ps1 | 5 ++++ .../no_header/no_header_config_file.sh | 6 +++++ .../hurl/src/cli/options/config_file/mod.rs | 23 +++++++++++++++++++ 5 files changed, 37 insertions(+) create mode 100644 integration/hurl/tests_ok/no_header/hurl/config create mode 100644 integration/hurl/tests_ok/no_header/no_header_config_file.out create mode 100644 integration/hurl/tests_ok/no_header/no_header_config_file.ps1 create mode 100755 integration/hurl/tests_ok/no_header/no_header_config_file.sh 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..91468ceff93 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; @@ -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"); From 36e683afd2b1061c11b270ef9ff489b436f5b4ae Mon Sep 17 00:00:00 2001 From: Fabrice Reix Date: Fri, 31 Jul 2026 08:34:28 +0200 Subject: [PATCH 2/2] Consume newline consistently for option with/without value --- packages/hurl/src/cli/options/config_file/mod.rs | 12 ++++++------ .../hurl/src/cli/options/config_file/primitives.rs | 7 +++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/hurl/src/cli/options/config_file/mod.rs b/packages/hurl/src/cli/options/config_file/mod.rs index 91468ceff93..7ed14f5b73d 100644 --- a/packages/hurl/src/cli/options/config_file/mod.rs +++ b/packages/hurl/src/cli/options/config_file/mod.rs @@ -330,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] @@ -360,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] @@ -369,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] @@ -378,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] 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");