package main import ( "fmt" "math/rand" "net/http" "net/url" ) func main() { m := map[string]string{} s := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/" && r.Method == "GET" { fmt.Fprintln(w, "

shortener

") fmt.Fprintln(w, "
") fmt.Fprintln(w, "") fmt.Fprintln(w, "") fmt.Fprintln(w, "
") return } if r.URL.Path == "/" && r.Method == "POST" { a := r.FormValue("url") if a == "" { fmt.Fprintln(w, "empty") return } u, err := url.Parse(a) if err != nil || u.Scheme == "" || u.Host == "" { fmt.Fprintln(w, "bad url") return } b := "" for j := 0; j < 6; j++ { b = b + string(s[rand.Intn(len(s))]) } for m[b] != "" { b = "" for j := 0; j < 6; j++ { b = b + string(s[rand.Intn(len(s))]) } } m[b] = a fmt.Fprintln(w, "short url: http://localhost:8080/"+b) return } x := r.URL.Path[1:] y := m[x] if y == "" { fmt.Fprintln(w, "not found") return } http.Redirect(w, r, y, 302) }) fmt.Println("start http://localhost:8080") http.ListenAndServe(":8080", nil) }