krz/skunky-art

Alternative privacy frontend for DeviantArt.

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

v1.3: app/router.go · raw

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