From 1ae0849da53fd4e0e77a1c5da4c25eb0d3ed7e717975e6e79381d040a8e15647 Mon Sep 17 00:00:00 2001 From: void <1wbw9dks67y2evx7qrrbocox@systemli.org> Date: Thu, 25 Jun 2026 14:18:00 +0000 Subject: [PATCH] Upload files to "/" --- main.go | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 main.go diff --git a/main.go b/main.go new file mode 100644 index 0000000..26c5fdb --- /dev/null +++ b/main.go @@ -0,0 +1,91 @@ +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) +}