package main import ( "database/sql" "fmt" "math/rand" "net/http" "net/url" "time" _ "modernc.org/sqlite" ) func main() { db, err := sql.Open("sqlite", "base.db") if err != nil { panic(err) } defer db.Close() _, err = db.Exec("CREATE TABLE IF NOT EXISTS urls (short TEXT, long TEXT)") if err != nil { panic(err) } s := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" rng := rand.New(rand.NewSource(time.Now().UnixNano())) c := rng.Int63() 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 := "" t := c c = c + 1 for t > 0 { b = string(s[t%62]) + b t = t / 62 } for len(b) < 6 { b = string(s[0]) + b } // сохранение в базу _, err = db.Exec("INSERT INTO urls (short, long) VALUES (?, ?)", b, a) if err != nil { fmt.Fprintln(w, "db error") return } fmt.Fprintln(w, "short url: http://localhost:8080/"+b) return } x := r.URL.Path[1:] y := "" err = db.QueryRow("SELECT long FROM urls WHERE short = ?", x).Scan(&y) if err != nil || y == "" { fmt.Fprintln(w, "not found") return } http.Redirect(w, r, y, 302) }) fmt.Println("start http://localhost:8080") http.ListenAndServe(":8080", nil) }