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, "")
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)
}