diff options
author | Přemysl Janouch <p@janouch.name> | 2019-04-15 03:16:19 +0200 |
---|---|---|
committer | Přemysl Janouch <p@janouch.name> | 2019-04-15 03:45:41 +0200 |
commit | 5b7113905ecdb1646ead78a05b1e10c5ebee9b6f (patch) | |
tree | 0ed701ab97df72295fb7b06c539f7cdd0d519fc9 | |
parent | dc0536c011d2a74dc49f66eceeac26d63e1b6fd0 (diff) | |
download | sklad-5b7113905ecdb1646ead78a05b1e10c5ebee9b6f.tar.gz sklad-5b7113905ecdb1646ead78a05b1e10c5ebee9b6f.tar.xz sklad-5b7113905ecdb1646ead78a05b1e10c5ebee9b6f.zip |
sklad: support running under a prefix
-rw-r--r-- | cmd/sklad/base.tmpl | 8 | ||||
-rw-r--r-- | cmd/sklad/container.tmpl | 20 | ||||
-rw-r--r-- | cmd/sklad/main.go | 59 | ||||
-rw-r--r-- | cmd/sklad/search.tmpl | 6 | ||||
-rw-r--r-- | cmd/sklad/series.tmpl | 8 | ||||
-rw-r--r-- | cmd/sklad/session.go | 2 |
6 files changed, 57 insertions, 46 deletions
diff --git a/cmd/sklad/base.tmpl b/cmd/sklad/base.tmpl index d92a818..956bfa4 100644 --- a/cmd/sklad/base.tmpl +++ b/cmd/sklad/base.tmpl @@ -49,14 +49,14 @@ <h1>sklad</h1> {{ block "HeaderControls" . }} - <a href=/>Obaly</a> - <a href=/series>Řady</a> + <a href="container">Obaly</a> + <a href="series">Řady</a> - <form method=get action=/search> + <form method=get action="search"> <input type=text name=q autofocus><input type=submit value="Hledat"> </form> - <form method=post action=/logout> + <form method=post action="logout"> <input type=submit value="Odhlásit"> </form> {{ end }} diff --git a/cmd/sklad/container.tmpl b/cmd/sklad/container.tmpl index 3300a1f..147e124 100644 --- a/cmd/sklad/container.tmpl +++ b/cmd/sklad/container.tmpl @@ -24,18 +24,18 @@ <header> <h2>{{ .Container.Id }} {{ range .Container.Path }} - <small>« <a href="/?id={{ . }}">{{ . }}</a></small> + <small>« <a href="container?id={{ . }}">{{ . }}</a></small> {{ end }} </h2> - <form method=post action="/label?id={{ .Container.Id }}"> + <form method=post action="label?id={{ .Container.Id }}"> <input type=submit value="Vytisknout štítek"> </form> - <form method=post action="/?id={{ .Container.Id }}&remove"> + <form method=post action="container?id={{ .Container.Id }}&remove"> <input type=submit value="Odstranit"> </form> </header> -<form method=post action="/?id={{ .Container.Id }}"> +<form method=post action="container?id={{ .Container.Id }}"> <textarea name=description rows=5> {{ .Container.Description }} </textarea> @@ -66,7 +66,7 @@ <header> <h2>Nový obal</h2> </header> -<form method=post action="/"> +<form method=post action="container"> <textarea name=description rows=5 placeholder="Popis obalu nebo jeho obsahu"></textarea> <footer> @@ -94,15 +94,15 @@ {{ range .Children }} <section> <header> - <h3><a href="/?id={{ .Id }}">{{ .Id }}</a> + <h3><a href="container?id={{ .Id }}">{{ .Id }}</a> {{ range .Path }} - <small>« <a href="/?id={{ . }}">{{ . }}</a></small> + <small>« <a href="container?id={{ . }}">{{ . }}</a></small> {{ end }} </h3> - <form method=post action="/label?id={{ .Id }}"> + <form method=post action="label?id={{ .Id }}"> <input type=submit value="Vytisknout štítek"> </form> - <form method=post action="/?id={{ .Id }}&remove"> + <form method=post action="container?id={{ .Id }}&remove"> <input type=submit value="Odstranit"> </form> </header> @@ -112,7 +112,7 @@ {{ if .Children }} <p> {{ range .Children }} -<a href="/?id={{ .Id }}">{{ .Id }}</a> +<a href="container?id={{ .Id }}">{{ .Id }}</a> {{ end }} {{ end }} </section> diff --git a/cmd/sklad/main.go b/cmd/sklad/main.go index 5dc2174..5b68e00 100644 --- a/cmd/sklad/main.go +++ b/cmd/sklad/main.go @@ -9,6 +9,7 @@ import ( "net/http" "net/url" "os" + "path" "path/filepath" "time" @@ -25,24 +26,10 @@ func executeTemplate(name string, w io.Writer, data interface{}) { } } -func wrap(inner func(http.ResponseWriter, *http.Request)) func( - http.ResponseWriter, *http.Request) { - return func(w http.ResponseWriter, r *http.Request) { - if err := r.ParseForm(); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - if r.Method == http.MethodGet { - w.Header().Set("Cache-Control", "no-store") - } - inner(w, r) - } -} - func handleLogin(w http.ResponseWriter, r *http.Request) { redirect := r.FormValue("redirect") if redirect == "" { - redirect = "/" + redirect = "container" } session := sessionGet(w, r) @@ -81,7 +68,7 @@ func handleLogout(w http.ResponseWriter, r *http.Request) { session := r.Context().Value(sessionContextKey{}).(*Session) session.LoggedIn = false - http.Redirect(w, r, "/", http.StatusSeeOther) + http.Redirect(w, r, "login", http.StatusSeeOther) } func handleContainerPost(r *http.Request) error { @@ -315,6 +302,37 @@ func handleLabel(w http.ResponseWriter, r *http.Request) { executeTemplate("label.tmpl", w, ¶ms) } +func handle(w http.ResponseWriter, r *http.Request) { + if err := r.ParseForm(); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + if r.Method == http.MethodGet { + w.Header().Set("Cache-Control", "no-store") + } + + switch _, base := path.Split(r.URL.Path); base { + case "login": + handleLogin(w, r) + case "logout": + sessionWrap(handleLogout)(w, r) + + case "container": + sessionWrap(handleContainer)(w, r) + case "series": + sessionWrap(handleSeries)(w, r) + case "search": + sessionWrap(handleSearch)(w, r) + case "label": + sessionWrap(handleLabel)(w, r) + + case "": + http.Redirect(w, r, "container", http.StatusSeeOther) + default: + http.NotFound(w, r) + } +} + func main() { // Randomize the RNG for session string generation. rand.Seed(time.Now().UnixNano()) @@ -340,13 +358,6 @@ func main() { templates[name] = template.Must(template.ParseFiles("base.tmpl", name)) } - http.HandleFunc("/login", wrap(handleLogin)) - http.HandleFunc("/logout", sessionWrap(wrap(handleLogout))) - - http.HandleFunc("/", sessionWrap(wrap(handleContainer))) - http.HandleFunc("/series", sessionWrap(wrap(handleSeries))) - http.HandleFunc("/search", sessionWrap(wrap(handleSearch))) - http.HandleFunc("/label", sessionWrap(wrap(handleLabel))) - + http.HandleFunc("/", handle) log.Fatalln(http.ListenAndServe(address, nil)) } diff --git a/cmd/sklad/search.tmpl b/cmd/sklad/search.tmpl index cf704cf..9fef455 100644 --- a/cmd/sklad/search.tmpl +++ b/cmd/sklad/search.tmpl @@ -8,7 +8,7 @@ {{ range .Series }} <section> <header> - <h3><a href="/series?prefix={{ .Prefix }}">{{ .Prefix }}</a></h3> + <h3><a href="series?prefix={{ .Prefix }}">{{ .Prefix }}</a></h3> <p>{{ .Description }} </header> </section> @@ -21,9 +21,9 @@ {{ range .Containers }} <section> <header> - <h3><a href="/?id={{ .Id }}">{{ .Id }}</a> + <h3><a href="container?id={{ .Id }}">{{ .Id }}</a> {{ range .Path }} - <small>« <a href="/?id={{ . }}">{{ . }}</a></small> + <small>« <a href="container?id={{ . }}">{{ . }}</a></small> {{ end }} </h3> </header> diff --git a/cmd/sklad/series.tmpl b/cmd/sklad/series.tmpl index 0e31e0f..fbc0e91 100644 --- a/cmd/sklad/series.tmpl +++ b/cmd/sklad/series.tmpl @@ -24,7 +24,7 @@ {{ else }} <section> -<form method=post action="/series"> +<form method=post action="series"> <header> <h3>Nová řada</h3> <input type=text name=prefix placeholder="Prefix řady"> @@ -38,7 +38,7 @@ {{ range .AllSeries }} <section> <header> - <h3><a href="/series?prefix={{ .Prefix }}">{{ .Prefix }}</a></h3> + <h3><a href="series?prefix={{ .Prefix }}">{{ .Prefix }}</a></h3> {{ with $count := len .Containers }} {{ if eq $count 1 }} <p>{{ $count }} obal @@ -48,11 +48,11 @@ <p>{{ $count }} obalů {{ end }} {{ end }} - <form method=post action="/series?prefix={{ .Prefix }}"> + <form method=post action="series?prefix={{ .Prefix }}"> <input type=text name=description value="{{ .Description }}" ><input type=submit value="Uložit"> </form> - <form method=post action="/series?prefix={{ .Prefix }}&remove"> + <form method=post action="series?prefix={{ .Prefix }}&remove"> <input type=submit value="Odstranit"> </form> </header> diff --git a/cmd/sklad/session.go b/cmd/sklad/session.go index 02fe0b0..23681a2 100644 --- a/cmd/sklad/session.go +++ b/cmd/sklad/session.go @@ -50,7 +50,7 @@ func sessionWrap(inner func(http.ResponseWriter, *http.Request)) func( // though I don't expect any substantial improvements of anything. w.Header().Set("Cache-Control", "no-store") - redirect := "/login" + redirect := "login" if r.RequestURI != "/" && r.Method == http.MethodGet { redirect += "?redirect=" + url.QueryEscape(r.RequestURI) } |