krz/skunky-art

Alternative privacy frontend for DeviantArt.

clone: git clone https://gitbay.org/krz/skunky-art.git

v1.3.1: app/router.go · raw

  1package app
  2
  3import (
  4	"net/http"
  5	u "net/url"
  6	"strconv"
  7	"strings"
  8)
  9
 10var Host string
 11
 12func Router() {
 13	parsepath := func(path string) map[int]string {
 14		if l := len(CFG.URI); len(path) > l {
 15			path = path[l-1:]
 16		} else {
 17			path = "/"
 18		}
 19
 20		parsedpath := make(map[int]string)
 21		for x := 0; true; x++ {
 22			slash := strings.Index(path, "/") + 1
 23			content := path[:slash]
 24			path = path[slash:]
 25			if slash == 0 {
 26				parsedpath[x] = path
 27				break
 28			}
 29			parsedpath[x] = content[:slash-1]
 30		}
 31		return parsedpath
 32	}
 33
 34	next := func(path map[int]string, from int) (out string) {
 35		for x, l := from, len(path)-1; x <= l; x++ {
 36			out += path[x]
 37			if x != l {
 38				out += "/"
 39			}
 40		}
 41		return
 42	}
 43
 44	// функция, что управляет всем
 45	handle := func(w http.ResponseWriter, r *http.Request) {
 46		if h := r.Header["X-Forwarded-Proto"]; len(h) != 0 && h[0] == "https" {
 47			Host = h[0] + "://" + r.Host
 48		} else {
 49			Host = "http://" + r.Host
 50		}
 51
 52		path := parsepath(r.URL.Path)
 53		// структура с функциями
 54		var skunky skunkyart
 55		skunky.Writer = w
 56		skunky.Args = r.URL.Query()
 57		skunky.BasePath = CFG.URI
 58
 59		arg := skunky.Args.Get
 60		skunky.QueryRaw = arg("q")
 61		skunky.Query = u.QueryEscape(skunky.QueryRaw)
 62
 63		if t := arg("type"); len(t) > 0 {
 64			skunky.Type = rune(t[0])
 65		}
 66		p, _ := strconv.Atoi(arg("p"))
 67		skunky.Page = p
 68
 69		if arg("atom") == "true" {
 70			skunky.Atom = true
 71		}
 72
 73		// пути
 74		switch path[1] {
 75		default:
 76			skunky.ReturnHTTPError(404)
 77		case "":
 78			skunky.ExecuteTemplate("index.htm", &CFG.URI)
 79		case "post":
 80			skunky.Deviation(path[2], path[3])
 81		case "search":
 82			skunky.Search()
 83		case "dd":
 84			skunky.DD()
 85		case "group_user":
 86			skunky.GRUser()
 87
 88		case "media":
 89			switch path[2] {
 90			case "file":
 91				skunky.DownloadAndSendMedia(path[3], next(path, 4))
 92			case "emojitar":
 93				skunky.Emojitar(path[3])
 94			}
 95		case "about":
 96			skunky.About()
 97		case "stylesheet":
 98			w.Header().Add("content-type", "text/css")
 99			wr(w, Templates["skunky.css"])
100		case "favicon.ico":
101			wr(w, Templates["logo.png"])
102		}
103	}
104
105	http.HandleFunc("/", handle)
106	println("SkunkyArt is listening on", CFG.Listen)
107
108	tryWithExitStatus(http.ListenAndServe(CFG.Listen, nil), 1)
109}