aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPřemysl Janouch <p@janouch.name>2019-04-15 03:16:19 +0200
committerPřemysl Janouch <p@janouch.name>2019-04-15 03:45:41 +0200
commit5b7113905ecdb1646ead78a05b1e10c5ebee9b6f (patch)
tree0ed701ab97df72295fb7b06c539f7cdd0d519fc9
parentdc0536c011d2a74dc49f66eceeac26d63e1b6fd0 (diff)
downloadsklad-5b7113905ecdb1646ead78a05b1e10c5ebee9b6f.tar.gz
sklad-5b7113905ecdb1646ead78a05b1e10c5ebee9b6f.tar.xz
sklad-5b7113905ecdb1646ead78a05b1e10c5ebee9b6f.zip
sklad: support running under a prefix
-rw-r--r--cmd/sklad/base.tmpl8
-rw-r--r--cmd/sklad/container.tmpl20
-rw-r--r--cmd/sklad/main.go59
-rw-r--r--cmd/sklad/search.tmpl6
-rw-r--r--cmd/sklad/series.tmpl8
-rw-r--r--cmd/sklad/session.go2
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>&laquo; <a href="/?id={{ . }}">{{ . }}</a></small>
+ <small>&laquo; <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 }}&amp;remove">
+ <form method=post action="container?id={{ .Container.Id }}&amp;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>&laquo; <a href="/?id={{ . }}">{{ . }}</a></small>
+ <small>&laquo; <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 }}&amp;remove">
+ <form method=post action="container?id={{ .Id }}&amp;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, &params)
}
+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>&laquo; <a href="/?id={{ . }}">{{ . }}</a></small>
+ <small>&laquo; <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 }}&amp;remove">
+ <form method=post action="series?prefix={{ .Prefix }}&amp;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)
}