krz/skunky-art
Alternative privacy frontend for DeviantArt.
clone: git clone https://gitbay.org/krz/skunky-art.git
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}