Extracts the host component of a URL.
Usage
get_host(
url,
protocol_handling = "keep",
www_handling = "none",
source = c("all", "private", "icann"),
subdomain_levels_to_keep = NULL,
case_handling = c("lower", "keep", "upper", "lower_host"),
host_encoding = c("keep", "idna", "unicode"),
scheme_policy = c("infer", "require"),
scheme_acceptance = c("web", "general"),
url_standard = NULL,
engine = NULL
)Arguments
- url
A character vector of URLs.
- protocol_handling
A character string specifying how to handle protocols. Defaults to "keep". Regardless of this option, rurl only processes authority-based URLs whose scheme is one of http, https, ftp, or ftps; a scheme-bearing input with any other scheme (e.g.
mailto:,tel:,ws:) yieldsparse_status = "error". Scheme inference (below) also requires the input to be host-shaped: a scheme-less string that is not a host (e.g."asdfghjkl","12345","/path") or is a non-canonical IP literal (integer/hex/octal/short forms, or leading-zero octets like"192.168.010.1") is rejected as"error"rather than having a scheme fabricated for it."keep": If a supported scheme exists (http, https, ftp, ftps), it's used. If no scheme and the input is host-shaped, "http://" is added; otherwise the input is not a URL and yields
"error"."none": If a supported scheme exists, it's used. If no scheme, then no scheme is used (scheme component will be NA).
"strip": Any existing scheme is removed (scheme component will be NA).
"http": The scheme is forced to be "http".
"https": The scheme is forced to be "https".
- www_handling
A character string specifying how to handle "www" and
www[number]prefixes in the host. Defaults to "none"."none": (Default) Leaves the host's www prefix (or lack thereof) untouched.
"strip": Removes any "www." or
www[number].prefix."keep": Ensures the host starts with "www.". If it has
www[number]., it's normalized to "www.". If no www prefix, "www." is added. An empty input host remains empty."if_no_subdomain": If the host is a bare registered domain (e.g., "example.com"), "www." is added. If the host already has a "www." or
www[number].prefix, it is normalized to "www." (e.g., "www1.example.com" becomes "www.example.com"; "www1.sub.example.com" becomes "www.sub.example.com"). If a non-www subdomain exists (e.g., "sub.example.com" or the normalized "www.sub.example.com"), the host is not further altered. An empty input host remains empty.
- source
Which PSL source to use: "all", "private", or "icann". Subdomain trimming depends on which section is consulted, so pass
source = "icann"to exclude private suffixes (e.g. github.io).- subdomain_levels_to_keep
An integer or NULL. Determines how many levels of subdomains are kept, in addition to any 'www.' prefix handled by
www_handling.NULL: (Default) No specific subdomain stripping is performed beyondwww_handling.0: All subdomains are stripped. Ifwww_handlingpreserved or added 'www.', it remains (e.g., 'www.sub.example.com' becomes 'www.example.com'; 'sub.example.com' becomes 'example.com').N > 0: Keeps up to N levels of subdomains, counted from right-to-left (closest to the registered domain), in addition to any 'www.' prefix. E.g., if N=1, 'three.two.one.example.com' becomes 'one.example.com'; 'www.three.two.one.example.com' (post www_handling) becomes 'www.one.example.com'.
- case_handling
How to handle casing of the returned host. Defaults to "lower".
- host_encoding
How to present the host in
clean_url. Defaults to "keep"."keep": Leave host as parsed by curl (may preserve original case).
"idna": Convert Unicode host labels to Punycode (IDNA) for the cleaned URL.
"unicode": Decode Punycode labels to Unicode for the cleaned URL.
- scheme_policy
Controls whether scheme-less, host-shaped input is accepted (an input-acceptance axis, distinct from
protocol_handling, which only controls how the scheme is presented, and fromurl_standard, which controls interpretation). Defaults to "infer"."infer": (Default) Fabricate
http://for scheme-less host-shaped input (e.g.example.comparses ashttp://example.com), a browser-omnibox-style affordance. This is the historical behavior."require": Reject scheme-less input — a scheme-less host-shaped value becomes
parse_status = "error"rather than gaining a fabricated scheme. Use this for a strict, pure-parser posture. Note this governs only bare host input; scheme-relative//hostinput is governed separately byscheme_relative_handling.
- scheme_acceptance
Which scheme tokens may enter parsing (a scheme-acceptance axis, distinct from
scheme_policy, which governs scheme-less input, and fromurl_standard, which governs interpretation). Defaults to "web"."web": (Default) Only the curated web-scheme allowlist (
http/https/ftp/ftps/file) is admitted; a scheme-bearing input outside it isparse_status = "error". This is the historical, byte-for-byte compatible behavior."general": Admit any syntactically valid scheme token and parse opaque (
mailto:x), non-special (foo://host), and RFC-generic URLs. Requires an expliciturl_standard("rfc3986"or"whatwg"), which decides the interpretation;generalwithurl_standard = NULLis an error. Non-special / opaque hosts receive no www-stripping, no domain/TLD derivation, and are never run through the IDNA/punycode helpers. A non-special scheme with no//is an opaque path: it has no authority, sohost,user,portand thedomain/tldcolumns are allNAand the entire remainder is thepath(query/fragmentare still split off). This includesmailto:— the recipient's@never re-triggers authority parsing. To decompose amailto:recipient, use the accessors (get_host()/get_domain()/get_user(), ADR 0012 D7) orget_mailto_recipients(); those deliberately return a recipient's parts where this table presentsNA, because a recipient domain is extraction metadata, not the URL's authority.
- url_standard
Optional top-level standard profile:
NULL(default),"rfc3986", or"whatwg". WithNULLthe behavior is exactly what the individual low-level options select (fully backward compatible). When set, it selects a coherent set of standard-conformant behaviors for the axes it governs — path percent/dot handling, the host IPv4/reg-name model, andcase_handling— so callers do not have to hand-assemble the low-level knobs. Passing a governed low-level knob (path_normalizationorcase_handling) with a value the selected profile would not choose is an error; passing the value the profile would pick is accepted (onlycase_handling = "lower_host"is accepted under a selector —"keep","lower", and"upper"all conflict, since"lower"also lowercases the path, which neither standard sanctions). Added as the last argument so existing positional calls keep their meaning; always pass it by name. Under"whatwg"the selector additionally recognizes a literal backslash as a path separator for WHATWG-special schemes (http/https/ftp) and nulls default ports in parse output; useport_handling = "strip_default"for spec-style clean URL port rendering. Seeresolve_urlforurl_standard-governed reference resolution. The selector does not govern whetherport_handlingmay be set (it is a standalone editorial knob), nor does it governpath_encoding(an orthogonal path-presentation knob that layers on any profile), IDNA rendering, or query handling.- engine
Optional pslr engine controlling which Public Suffix List backs domain / TLD / subdomain extraction:
NULL(default) resolves against pslr's session-global default list — exactly the historical behavior — while apslr::psl_engine()snapshot resolves against that specific list, per request, without mutating any global state (never callpslr::psl_use()for this). Use it to pin a particular list version or to load an alternate list viapslr::psl_engine(source = "path", path = ...). Process-local: an engine holds a C++ external pointer that does not serialize across R sessions or parallel workers — build it in the process that uses it; never cache it to disk or send it to a worker (rebuild one per process instead). Only the domain-derived outputs (domain,tld, and the subdomain-trimmed host /clean_url) depend on it.
Details
Under scheme_acceptance = "general" a mailto: URL's first
recipient domain is returned, decomposed through the same PSL seam a web host
uses, so get_domain / get_tld /
get_subdomain work on it too (ADR 0012 D7). This deliberately
diverges from safe_parse_url, whose host column is
NA for a mailto: URL: a mailto: is a WHATWG opaque path
and has no authority, so the recipient domain is surfaced here as extraction
metadata rather than presented as a parsed authority. Under the default
"web" acceptance a mailto: URL is not parsed and this returns
NA.
Examples
get_host("http://sub.example.com:8080")
#> [1] "sub.example.com"
get_host(
"http://www.two.one.example.com",
subdomain_levels_to_keep = 1
) # Result: "www.one.example.com"
#> [1] "www.one.example.com"
get_host(
"http://www.two.one.example.com",
www_handling = "strip",
subdomain_levels_to_keep = 1
) # Result: "one.example.com"
#> [1] "one.example.com"
get_host(
"http://www.two.one.example.com",
www_handling = "keep",
subdomain_levels_to_keep = 1
) # Result: "www.one.example.com"
#> [1] "www.one.example.com"
get_host(
"http://three.two.one.example.com",
subdomain_levels_to_keep = 0
) # Result: "example.com"
#> [1] "example.com"
get_host(
"http://www.three.two.one.example.com",
subdomain_levels_to_keep = 0
) # Result: "www.example.com"
#> [1] "www.example.com"