init
This commit is contained in:
5
LICENSE
Normal file
5
LICENSE
Normal file
@@ -0,0 +1,5 @@
|
||||
NIRVÁNA LICENSE
|
||||
|
||||
As this software enters the public domain,
|
||||
it achieves a state of nirvána - complete liberation
|
||||
from the cycle of intellectual property constraints.
|
||||
40
README.md
Normal file
40
README.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# is-valid-domain
|
||||
|
||||
A CLI tool to validate domain names using the public suffix list from `golang.org/x/net/publicsuffix`.
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
./is-valid-domain <domain>
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
```bash
|
||||
./is-valid-domain 029.cyou # Output: valid
|
||||
./is-valid-domain siliconpin.co.in # Output: valid
|
||||
./is-valid-domain co.siliconpin.in # Output: subdomain
|
||||
./is-valid-domain invalid..domain # Output: invalid
|
||||
```
|
||||
|
||||
## Output Categories
|
||||
|
||||
- **valid** - The domain is a registrable domain (effective TLD+1)
|
||||
- **subdomain** - The domain is a subdomain of a registrable domain
|
||||
- **invalid** - The domain is malformed or not a valid domain name
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
go build -o is-valid-domain main.go
|
||||
```
|
||||
|
||||
## How it Works
|
||||
|
||||
The tool uses `publicsuffix.EffectiveTLDPlusOne()` to determine the registrable domain:
|
||||
|
||||
1. If the input domain exactly matches the effective TLD+1 → **valid**
|
||||
2. If the input domain is longer than the effective TLD+1 → **subdomain**
|
||||
3. If there's an error parsing the domain → **invalid**
|
||||
|
||||
This leverages the official public suffix list to correctly handle complex TLD structures like `.co.in`, `.co.uk`, etc.
|
||||
5
go.mod
Normal file
5
go.mod
Normal file
@@ -0,0 +1,5 @@
|
||||
module is-valid-domain
|
||||
|
||||
go 1.25.5
|
||||
|
||||
require golang.org/x/net v0.51.0 // indirect
|
||||
2
go.sum
Normal file
2
go.sum
Normal file
@@ -0,0 +1,2 @@
|
||||
golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo=
|
||||
golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y=
|
||||
BIN
is-valid-domain
Executable file
BIN
is-valid-domain
Executable file
Binary file not shown.
37
main.go
Normal file
37
main.go
Normal file
@@ -0,0 +1,37 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"golang.org/x/net/publicsuffix"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if len(os.Args) != 2 {
|
||||
fmt.Fprintf(os.Stderr, "Usage: %s <domain>\n", os.Args[0])
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
domain := strings.TrimSpace(os.Args[1])
|
||||
if domain == "" {
|
||||
fmt.Println("invalid")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Get the effective TLD+1 (registrable domain)
|
||||
etld1, err := publicsuffix.EffectiveTLDPlusOne(domain)
|
||||
if err != nil {
|
||||
fmt.Println("invalid")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// If the domain is exactly the effective TLD+1, it's a valid domain
|
||||
// If it's longer, it's a subdomain
|
||||
if domain == etld1 {
|
||||
fmt.Println("valid")
|
||||
} else {
|
||||
fmt.Println("subdomain")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user