|
@@ -0,0 +1,96 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "flag"
|
|
|
+ "html/template"
|
|
|
+ "log"
|
|
|
+ "net/http"
|
|
|
+ "strings"
|
|
|
+)
|
|
|
+
|
|
|
+const (
|
|
|
+ shortenPath = "/s/"
|
|
|
+ decodePath = "/d/"
|
|
|
+)
|
|
|
+
|
|
|
+var host = flag.String("h", "localhost", "Host on which to serve")
|
|
|
+var port = flag.String("p", "9090", "Port on which to serve")
|
|
|
+var file = flag.String("f", "links.txt", "File to which save links")
|
|
|
+var domain = flag.String("d", "", "Domain of shorty, preferably add schema")
|
|
|
+
|
|
|
+var toSave chan string
|
|
|
+
|
|
|
+func init() {
|
|
|
+ toSave = make(chan string, 100)
|
|
|
+}
|
|
|
+
|
|
|
+func shorten(w http.ResponseWriter, r *http.Request) {
|
|
|
+ link := r.URL.Query().Get("link")
|
|
|
+ if link == "" {
|
|
|
+ link = strings.TrimPrefix(r.URL.Path, shortenPath)
|
|
|
+ }
|
|
|
+
|
|
|
+ linkID := addLink(link, toSave)
|
|
|
+
|
|
|
+ t := template.Must(template.ParseFiles("./html/result.html"))
|
|
|
+
|
|
|
+ shortened := r.Host + "/" + linkID
|
|
|
+ if *domain != "" {
|
|
|
+ shortened = *domain + "/" + linkID
|
|
|
+ }
|
|
|
+ t.Execute(w, shortened)
|
|
|
+}
|
|
|
+
|
|
|
+func decode(w http.ResponseWriter, r *http.Request) {
|
|
|
+ link := r.URL.Query().Get("link")
|
|
|
+ if link == "" {
|
|
|
+ link = strings.TrimPrefix(r.URL.Path, shortenPath)
|
|
|
+ }
|
|
|
+
|
|
|
+ t := template.Must(template.ParseFiles("./html/result.html"))
|
|
|
+
|
|
|
+ parts := strings.Split(link, "/")
|
|
|
+ linkID := parts[len(parts)-1]
|
|
|
+ if linkID != "" {
|
|
|
+ fullLink := getLink(linkID)
|
|
|
+ if fullLink != "" {
|
|
|
+ t.Execute(w, fullLink)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ t.Execute(w, "Not found!")
|
|
|
+}
|
|
|
+
|
|
|
+func serveIndex(w http.ResponseWriter, r *http.Request) {
|
|
|
+ t := template.Must(template.ParseFiles("./html/index.html"))
|
|
|
+ t.Execute(w, nil)
|
|
|
+}
|
|
|
+
|
|
|
+func redirectOrServe(w http.ResponseWriter, r *http.Request) {
|
|
|
+ linkID := strings.TrimPrefix(r.URL.Path, "/")
|
|
|
+
|
|
|
+ if linkID == "" {
|
|
|
+ serveIndex(w, r)
|
|
|
+ } else {
|
|
|
+ link := getLink(linkID)
|
|
|
+ if link != "" {
|
|
|
+ http.Redirect(w, r, link, http.StatusMovedPermanently)
|
|
|
+ } else {
|
|
|
+ serveIndex(w, r)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func main() {
|
|
|
+ flag.Parse()
|
|
|
+ readLinks(*file)
|
|
|
+
|
|
|
+ go saveLink(*file, toSave)
|
|
|
+
|
|
|
+ hostname := *host + ":" + *port
|
|
|
+ http.HandleFunc(shortenPath, shorten)
|
|
|
+ http.HandleFunc(decodePath, decode)
|
|
|
+ http.HandleFunc("/", redirectOrServe)
|
|
|
+ log.Fatal(http.ListenAndServe(hostname, nil))
|
|
|
+}
|