Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
mre committed Nov 8, 2024
1 parent d4ede50 commit cd2833b
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 13 deletions.
11 changes: 11 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions lychee-bin/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ tokio = { version = "1.41.0", features = ["full"] }
tokio-stream = "0.1.16"
toml = "0.8.19"
url = "2.5.2"
http-serde = "2.1.1"

[dev-dependencies]
assert_cmd = "2.0.16"
Expand Down
15 changes: 9 additions & 6 deletions lychee-bin/src/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use anyhow::{anyhow, Context, Error, Result};
use clap::builder::PossibleValuesParser;
use clap::{arg, builder::TypedValueParser, Parser};
use const_format::{concatcp, formatcp};
use http::HeaderMap;
use lychee_lib::{
Base, BasicAuthSelector, Input, StatusCodeExcluder, StatusCodeSelector, DEFAULT_MAX_REDIRECTS,
DEFAULT_MAX_RETRIES, DEFAULT_RETRY_WAIT_TIME_SECS, DEFAULT_TIMEOUT_SECS, DEFAULT_USER_AGENT,
Expand Down Expand Up @@ -195,7 +196,6 @@ impl LycheeOptions {
} else {
Some(self.config.exclude_path.clone())
};
let headers = parse_headers(&self.config.header)?;
self.raw_inputs
.iter()
.map(|s| {
Expand All @@ -204,7 +204,7 @@ impl LycheeOptions {
None,
self.config.glob_ignore_case,
excluded.clone(),
headers.clone(),
self.config.header.clone(),
)
})
.collect::<Result<_, _>>()
Expand Down Expand Up @@ -399,10 +399,13 @@ Example: --fallback-extensions html,htm,php,asp,aspx,jsp,cgi"
)]
pub(crate) fallback_extensions: Vec<String>,

/// Custom request header
#[arg(long)]
#[serde(default)]
pub(crate) header: Vec<String>,
/// Set custom header for requests
#[clap(
long = "header",
value_parser = parse_header,
number_of_values = 1
)]
pub header: Vec<HeaderMap>,

/// A List of accepted status codes for valid links
#[arg(
Expand Down
26 changes: 19 additions & 7 deletions lychee-bin/src/parse.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use anyhow::{anyhow, Context, Result};
use headers::{HeaderMap, HeaderName};
use http::HeaderValue;
use lychee_lib::{remap::Remaps, Base};
use std::time::Duration;

Expand All @@ -20,14 +21,25 @@ pub(crate) const fn parse_duration_secs(secs: usize) -> Duration {
Duration::from_secs(secs as u64)
}

/// Parse HTTP headers into a `HeaderMap`
pub(crate) fn parse_headers<T: AsRef<str>>(headers: &[T]) -> Result<HeaderMap> {
let mut out = HeaderMap::new();
for header in headers {
let (key, val) = read_header(header.as_ref())?;
out.insert(HeaderName::from_bytes(key.as_bytes())?, val.parse()?);
/// Parse a header given in a string format into a `HeaderMap`
///
/// Headers are expected to be in format "key:value".
fn parse_header(header: &str) -> Result<HeaderMap, String> {
let header: Vec<&str> = header.split(':').collect();
if header.len() != 2 {
return Err("Wrong header format (see --help for format)".to_string());
}
Ok(out)

let (header_name, header_value) = (header[0], header[1]);

let hn = HeaderName::from_lowercase(header_name.trim().to_lowercase().as_bytes())
.map_err(|e| e.to_string())?;

let hv = HeaderValue::from_str(header_value.trim()).map_err(|e| e.to_string())?;

let mut map = HeaderMap::new();
map.insert(hn, hv);
Ok(map)
}

/// Parse URI remaps
Expand Down

0 comments on commit cd2833b

Please sign in to comment.