mirror of
https://github.com/Hopiu/lychee.git
synced 2026-04-04 05:30:26 +00:00
Adds support for accept ranges discussed in #1157. This allows the user to specify custom HTTP status codes accepted during checking and thus will report as valid (not broken). The accept option only supports specifying status codes as a comma-separated list. With this PR, the option will accept a list of status code ranges formatted like this: ```toml accept = ["100..=103", "200..=299", "403"] ``` These combinations will be supported: `..<end>`, ` ..=<end>`, `<start>..<end>` and `<start>..=<end>`. The behavior is copied from the Rust Range like concepts: ``` ..<end>, includes 0 to <end> (exclusive) ..=<end>, includes 0 to <end> (inclusive) <start>..<end>, includes <start> to <end> (exclusive) <start>..=<end>, includes <start> to <end> (inclusive) ``` - Foundation and enhancements for accept ranges, including support for comma-separated strings and integration into the CLI. - Implementations and updates for AcceptSelector, including Default, Display, and serde defaults. - Address and fix various errors: clippy, cargo fmt, and tests. - Add more tests, address edge cases, and enhance error messaging, especially for TOML config parsing. - Update dependencies.
98 lines
2.8 KiB
Rust
98 lines
2.8 KiB
Rust
//! `lychee-lib` is the library component of [`lychee`], and is used for checking links.
|
|
//!
|
|
//! "Hello world" example:
|
|
//!
|
|
//! ```
|
|
//! use lychee_lib::Result;
|
|
//!
|
|
//! #[tokio::main]
|
|
//! async fn main() -> Result<()> {
|
|
//! let response = lychee_lib::check("https://github.com/lycheeverse/lychee").await?;
|
|
//! println!("{response}");
|
|
//! Ok(())
|
|
//! }
|
|
//! ```
|
|
//!
|
|
//! For more specific use-cases you can build a lychee client yourself,
|
|
//! using the `ClientBuilder` which can be used to
|
|
//! configure and run your own link checker and grants full flexibility:
|
|
//!
|
|
//! ```
|
|
//! use lychee_lib::{ClientBuilder, Result, Status};
|
|
//!
|
|
//! #[tokio::main]
|
|
//! async fn main() -> Result<()> {
|
|
//! let client = ClientBuilder::default().client()?;
|
|
//! let response = client.check("https://github.com/lycheeverse/lychee").await?;
|
|
//! assert!(response.status().is_success());
|
|
//! Ok(())
|
|
//! }
|
|
//! ```
|
|
//!
|
|
//! [`lychee`]: https://github.com/lycheeverse/lychee
|
|
#![warn(clippy::all, clippy::pedantic)]
|
|
#![warn(
|
|
absolute_paths_not_starting_with_crate,
|
|
rustdoc::invalid_html_tags,
|
|
missing_copy_implementations,
|
|
missing_debug_implementations,
|
|
semicolon_in_expressions_from_macros,
|
|
unreachable_pub,
|
|
unused_crate_dependencies,
|
|
unused_extern_crates,
|
|
variant_size_differences,
|
|
clippy::missing_const_for_fn
|
|
)]
|
|
#![deny(anonymous_parameters, macro_use_extern_crate, pointer_structural_match)]
|
|
#![deny(missing_docs)]
|
|
#![allow(clippy::module_name_repetitions)]
|
|
|
|
#[cfg(doctest)]
|
|
doc_comment::doctest!("../../README.md");
|
|
|
|
mod basic_auth;
|
|
mod client;
|
|
/// A pool of clients, to handle concurrent checks
|
|
pub mod collector;
|
|
mod quirks;
|
|
mod retry;
|
|
mod types;
|
|
mod utils;
|
|
|
|
/// Functionality to extract URIs from inputs
|
|
pub mod extract;
|
|
|
|
pub mod remap;
|
|
|
|
/// Filters are a way to define behavior when encountering
|
|
/// URIs that need to be treated differently, such as
|
|
/// local IPs or e-mail addresses
|
|
pub mod filter;
|
|
|
|
#[cfg(test)]
|
|
#[macro_use]
|
|
pub mod test_utils;
|
|
|
|
#[cfg(test)]
|
|
use doc_comment as _; // required for doctest
|
|
use ring as _; // required for apple silicon
|
|
|
|
#[cfg(feature = "native-tls")]
|
|
use openssl_sys as _; // required for vendored-openssl feature
|
|
|
|
#[doc(inline)]
|
|
pub use crate::{
|
|
basic_auth::BasicAuthExtractor,
|
|
// Constants get exposed so that the CLI can use the same defaults as the library
|
|
client::{
|
|
check, Client, ClientBuilder, DEFAULT_MAX_REDIRECTS, DEFAULT_MAX_RETRIES,
|
|
DEFAULT_RETRY_WAIT_TIME_SECS, DEFAULT_TIMEOUT_SECS, DEFAULT_USER_AGENT,
|
|
},
|
|
collector::Collector,
|
|
filter::{Excludes, Filter, Includes},
|
|
types::{
|
|
uri::valid::Uri, AcceptRange, AcceptRangeError, AcceptSelector, Base, BasicAuthCredentials,
|
|
BasicAuthSelector, CacheStatus, CookieJar, ErrorKind, FileType, Input, InputContent,
|
|
InputSource, Request, Response, ResponseBody, Result, Status,
|
|
},
|
|
};
|