47 releases

0.15.6 Aug 31, 2022
0.15.4 Jul 6, 2022
0.15.3 Jan 21, 2022
0.15.2 Nov 29, 2021
0.2.0 Jul 30, 2018

#102 in Network programming

Download history 32871/week @ 2023-11-21 45219/week @ 2023-11-28 61464/week @ 2023-12-05 46063/week @ 2023-12-12 32970/week @ 2023-12-19 12613/week @ 2023-12-26 45920/week @ 2024-01-02 42594/week @ 2024-01-09 53595/week @ 2024-01-16 47923/week @ 2024-01-23 45675/week @ 2024-01-30 52279/week @ 2024-02-06 43406/week @ 2024-02-13 58190/week @ 2024-02-20 56417/week @ 2024-02-27 48653/week @ 2024-03-05

217,898 downloads per month
Used in 110 crates (28 directly)

MIT/Apache

93KB
815 lines

Robust and fast domain name parsing

CI Latest Version Docs

This library uses Mozilla's Public Suffix List to reliably parse domain names in Rust. It will reliably check if a domain has valid syntax. It also checks the length restrictions for each label, total number of labels and full length of domain name.

Examples

use addr::{parse_domain_name, parse_dns_name};

// You can find out the root domain
// or extension of any given domain name
let domain = parse_domain_name("www.example.com")?;
assert_eq!(domain.root(), Some("example.com"));
assert_eq!(domain.suffix(), "com");
assert_eq!(domain.prefix(), Some("www"));

let domain = parse_domain_name("www.食狮.中国")?;
assert_eq!(domain.root(), Some("食狮.中国"));
assert_eq!(domain.suffix(), "中国");

let domain = parse_domain_name("www.xn--85x722f.xn--55qx5d.cn")?;
assert_eq!(domain.root(), Some("xn--85x722f.xn--55qx5d.cn"));
assert_eq!(domain.suffix(), "xn--55qx5d.cn");

let domain = parse_domain_name("a.b.example.uk.com")?;
assert_eq!(domain.root(), Some("example.uk.com"));
assert_eq!(domain.suffix(), "uk.com");

let name = parse_dns_name("_tcp.example.com.")?;
assert_eq!(name.suffix(), Some("com."));

// In any case if the domain's suffix is in the list
// then this is definately a registrable domain name
assert!(domain.has_known_suffix());

TODO

Strict internationalized domain names (IDN) validation (use the idna feature flag)

Use Cases

For those who work with domain names the use cases of this library are plenty. publicsuffix.org/learn lists quite a few. For the sake of brevity, I'm not going to repeat them here. I work for a domain registrar so we make good use of this library. Here are some of the ways this library can be used:

  • Validating domain names. This one is probably obvious. If a domain.has_known_suffix() you can be absolutely sure this is a valid domain name. A regular expression is simply not robust enough.
  • Blacklisting or whitelisting domain names. You can't just blindly do this without knowing the actual registrable domain name otherwise you risk being too restrictive or too lenient. Bad news either way...
  • Extracting the registrable part of a domain name so you can check whether the domain is registered or not.
  • Storing details about a domain name in a DBMS using the registrable part of a domain name as the primary key.

Dependencies

~2.5MB
~99K SLoC