#parse #link #parser

parse_link_header

A library for parsing HTTP Link header

9 releases

0.3.3 Nov 4, 2022
0.3.2 Jan 11, 2022
0.2.2 Jan 6, 2022
0.2.1 Feb 10, 2021
0.1.1 Mar 16, 2020

#2004 in Parser implementations

Download history 2760/week @ 2023-06-09 2523/week @ 2023-06-16 2136/week @ 2023-06-23 2120/week @ 2023-06-30 2104/week @ 2023-07-07 2241/week @ 2023-07-14 2228/week @ 2023-07-21 2634/week @ 2023-07-28 2983/week @ 2023-08-04 2796/week @ 2023-08-11 3646/week @ 2023-08-18 3590/week @ 2023-08-25 4261/week @ 2023-09-01 5698/week @ 2023-09-08 6081/week @ 2023-09-15 5202/week @ 2023-09-22

22,024 downloads per month
Used in 32 crates (27 directly)

MIT license

25KB
318 lines

parse_link_header

Rust codecov Crates.io Crates.io

A library for parsing HTTP Link header.

How to use

Note for version 0.1.x

The version 0.1 can't correctly handle the relative ref which described in https://tools.ietf.org/html/rfc3986#section-4.1

The parsed value of version 0.1 refers to the return value of https://github.com/thlorenz/parse-link-header, which is a HashMap with the same structure.

So if you want to parse relative ref, please use version >=0.2.

Or if you don't care about relative ref and wanna simple HashMap<String, HashMap<String, String>> result, you can use version 0.1.

Example

In your Cargo.toml, add:

[dependencies]
parse_link_header = "0.3"

Then:

let link_header = r#"<https://api.github.com/repositories/41986369/contributors?page=2>; rel="next", <https://api.github.com/repositories/41986369/contributors?page=14>; rel="last""#;

let res = parse_link_header::parse(link_header);
assert!(res.is_ok());

let val = res.unwrap();
assert_eq!(val.len(), 2);
assert_eq!(val.get(&Some("next".to_string())).unwrap().raw_uri, "https://api.github.com/repositories/41986369/contributors?page=2");
assert_eq!(val.get(&Some("last".to_string())).unwrap().raw_uri, "https://api.github.com/repositories/41986369/contributors?page=14");

The parsed value is a Result<HashMap<Option<Rel>, Link>, Error> (aka a LinkMap, which Rel and Link is:

use std::collections::HashMap;

use http::Uri;

#[derive(Debug, PartialEq)]
pub struct Link {
    pub uri: Uri, // https://docs.rs/http/0.2.1/http/uri/struct.Uri.html
    pub raw_uri: String,
    pub queries: HashMap<String, String>,
    pub params: HashMap<String, String>,
}

type Rel = String;

You can see why the key of HashMap is Option<Rel> because if you won't provide a rel type, the key will be an empty string.

Refer to https://tools.ietf.org/html/rfc8288#section-3.3 (October 2017), the rel parameter MUST be present.

Therefore, if you find that key is None, please check if you provide the rel type.

parse_with_rel

Version >= 0.3.0

Alternatively, use the parse_with_rel() function to get a HashMap<String, Link> (aka a RelLinkMap), as in:

let link_header = r#"<https://api.github.com/repositories/41986369/contributors?page=2>; rel="next", <https://api.github.com/repositories/41986369/contributors?page=14>; rel="last""#;

let res = parse_link_header::parse_with_rel(link_header);
assert!(res.is_ok());

let val = res.unwrap();
assert_eq!(val.len(), 2);
assert_eq!(val.get("next").unwrap().raw_uri, "https://api.github.com/repositories/41986369/contributors?page=2");
assert_eq!(val.get("last").unwrap().raw_uri, "https://api.github.com/repositories/41986369/contributors?page=14");

You can use this function if you ensure that the rel parameter is present in the header.

Feature: url

Version >= 0.3.0

If the url feature is enabled, the uri field in struct parse_link_header::Link will be of type url::Url from the url crate, rather than the http::uri::Uri it normally is. This allows integration with other libraries that use the url crate, such as reqwest.

NOTE: This implicitly disabled support for relative refs, as URLs do not support relative refs (whereas URIs do).

How to contribute

Pull a request or open an issue to describe your changes or problems.

License

MIT @ g1eny0ung

Dependencies

~2.6–4MB
~71K SLoC