mirror of
https://github.com/jimeh/ozu.io.git
synced 2026-02-19 08:06:39 +00:00
Initial work on shortner package
This commit is contained in:
65
shortner/normalize_url.go
Normal file
65
shortner/normalize_url.go
Normal file
@@ -0,0 +1,65 @@
|
||||
package shortner
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/url"
|
||||
)
|
||||
|
||||
var errURLFileSchema = errors.New("Schema 'file://' not allowed")
|
||||
var errURLInvalid = errors.New("Invalid URL")
|
||||
|
||||
var slashByte = byte(47)
|
||||
var maxLengthURL = 2048
|
||||
|
||||
// NormalizeURL validates and normalizes given rawURL string.
|
||||
func NormalizeURL(rawURL []byte) ([]byte, error) {
|
||||
url, err := normalizeURLPassOne(rawURL)
|
||||
if err != nil {
|
||||
return []byte{}, err
|
||||
}
|
||||
|
||||
url, err = normalizeURLPassTwo(url)
|
||||
if err != nil {
|
||||
return []byte{}, err
|
||||
}
|
||||
|
||||
return url, nil
|
||||
}
|
||||
|
||||
func normalizeURLPassOne(rawURL []byte) ([]byte, error) {
|
||||
if len(rawURL) > maxLengthURL {
|
||||
return []byte{}, errURLInvalid
|
||||
}
|
||||
|
||||
u, err := url.Parse(string(rawURL))
|
||||
if err != nil {
|
||||
return []byte{}, errURLInvalid
|
||||
}
|
||||
|
||||
if u.Scheme == "" {
|
||||
u.Scheme = "http"
|
||||
}
|
||||
|
||||
if u.Scheme == "file" {
|
||||
return []byte{}, errURLFileSchema
|
||||
}
|
||||
|
||||
if u.Host == "" && (u.Path == "" || u.Path[0] == slashByte) {
|
||||
return []byte{}, errURLInvalid
|
||||
}
|
||||
|
||||
return []byte(u.String()), nil
|
||||
}
|
||||
|
||||
func normalizeURLPassTwo(rawURL []byte) ([]byte, error) {
|
||||
u, err := url.Parse(string(rawURL))
|
||||
if err != nil {
|
||||
return []byte{}, errURLInvalid
|
||||
}
|
||||
|
||||
if u.Host != "" && u.Path == "" {
|
||||
u.Path = "/"
|
||||
}
|
||||
|
||||
return []byte(u.String()), nil
|
||||
}
|
||||
Reference in New Issue
Block a user