From a55db041cc7267c138626cf41a4fdba0e11c3fad Mon Sep 17 00:00:00 2001 From: srxr <10549030+srxr@users.noreply.github.com> Date: Sat, 27 Mar 2021 07:03:43 +0000 Subject: [PATCH] Validate URL before shorten --- models.go | 21 ++++++++++++++++++++- models_test.go | 3 +++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/models.go b/models.go index f661e05..b6d8078 100644 --- a/models.go +++ b/models.go @@ -1,6 +1,9 @@ package main import ( + "fmt" + nurl "net/url" + "strings" "time" ) @@ -25,11 +28,27 @@ func GenerateID() string { } func NewURL(target string) (url *URL, err error) { - url = &URL{ID: GenerateID(), URL: target, CreatedAt: time.Now()} + u, err := parse(target) + if err != nil { + return nil, err + } + + url = &URL{ID: GenerateID(), URL: u.String(), CreatedAt: time.Now()} err = db.Save(url) return } +func parse(target string) (u *nurl.URL, err error) { + u, err = nurl.Parse(strings.TrimSpace(target)) + if err != nil { + return nil, fmt.Errorf("URL (%s) no satisfied", target) + } + if u.Scheme == "" || u.Host == "" { + return nil, fmt.Errorf("URL (%s) without scheme or host", target) + } + return u, nil +} + // SetName ... func (u *URL) SetName(name string) error { u.Name = name diff --git a/models_test.go b/models_test.go index e6cc9ea..e3b3a36 100644 --- a/models_test.go +++ b/models_test.go @@ -48,4 +48,7 @@ func TestNewURL(t *testing.T) { assert.NotEqual(u.ID, "") assert.Equal(u.URL, "https://www.google.com") assert.Equal(u.Name, "") + + u, err = NewURL("www.google.com") + assert.NotNil(t, err) }