PublicSuffix is a Ruby domain name parser based on the Public Suffix List.
What is the Public Suffix List?
The Public Suffix List is a cross-vendor initiative to provide an accurate list of domain name suffixes.
The Public Suffix List is an initiative of the Mozilla Project, but is maintained as a community resource. It is available for use in any software, but was originally created to meet the needs of browser manufacturers.
A "public suffix" is one under which Internet users can directly register names. Some examples of public suffixes are ".com", ".co.uk" and "pvt.k12.wy.us". The Public Suffix List is a list of all known public suffixes.
Why the Public Suffix List is better than any available Regular Expression parser?
Previously, browsers used an algorithm which basically only denied setting wide-ranging cookies for top-level domains with no dots (e.g. com or org). However, this did not work for top-level domains where only third-level registrations are allowed (e.g. co.uk). In these cases, websites could set a cookie for co.uk which will be passed onto every website registered under co.uk.
Clearly, this was a security risk as it allowed websites other than the one setting the cookie to read it, and therefore potentially extract sensitive information.
Since there is no algorithmic method of finding the highest level at which a domain may be registered for a particular top-level domain (the policies differ with each registry), the only method is to create a list of all top-level domains and the level at which domains can be registered. This is the aim of the effective TLD list.
As well as being used to prevent cookies from being set where they shouldn't be, the list can also potentially be used for other applications where the registry controlled and privately controlled parts of a domain name need to be known, for example when grouping by top-level domains.
Not convinced yet? Check out this real world example.
- Ruby >= 2.0
PublicSuffix requires Ruby 2.0 or greater. For older versions of Ruby, see the CHANGELOG.md file.
The best way to install PublicSuffix is via RubyGems.
$ gem install public_suffix
You might need administrator privileges on your system to install the gem.
Parsing a Domain
Example domain without subdomains.
domain = PublicSuffix.parse("google.com") # => # domain.tld # => "com" domain.sld # => "google" domain.trd # => nil domain.domain # => "google.com" domain.subdomain # => nil
Example domain with subdomains.
domain = PublicSuffix.parse("www.google.com") # => # domain.tld # => "com" domain.sld # => "google" domain.trd # => "www" domain.domain # => "google.com" domain.subdomain # => "google.com"
Validating a Domain
PublicSuffix.valid?("google.com") # => true PublicSuffix.valid?("www.google.com") # => true PublicSuffix.valid?("x.invalid") # => false
Catching Invalid Domains
PublicSuffix.parse may raise two kind of exceptions:
PublicSuffix::DomainInvalid- when trying to parse an invalid domain which is not defined by any rule
PublicSuffix::DomainNotAllowed- when trying to parse an invalid domain which is defined by at least one rule with some specific constraints
# Trying to parse an invalid domain PublicSuffix.parse("example.invalid") # => raises PublicSuffix::DomainInvalid PublicSuffix.parse("www.example.invalid") # => raises PublicSuffix::DomainInvalid
# The .do TLD exists but the .do authority doesn't allow domains # like DOMAIN.do but requires at least WWW.DOMAIN.do or DOMAIN.EDU.do. PublicSuffix.parse("example.do") # => raises PublicSuffix::DomainNotAllowed PublicSuffix.parse("www.example.do") # => # PublicSuffix.parse("example.edu.do") # => #
Public Suffix vs Public Suffix Service
Before release 1.0.0 this library was formely known as PublicSuffixService. The library was renamed to PublicSuffix just in time for the first stable major release.
public_suffix_service gem is still available only for compatibility purpose. Please use
public_suffix gem instead.
FeedBack and Bug Reports
If you use this library and find yourself missing any functionality, please let me know.
Pull requests are very welcome! Please include tests and/or feature coverage for every patch, and create a topic branch for every separate change you make.
Report issues or feature requests to GitHub Issues.
Copyright (c) 2009-2014 Simone Carletti. This is Free Software distributed under the MIT license.