aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Hanley <felix@userspace.com.au>2020-02-14 09:24:29 +0000
committerFelix Hanley <felix@userspace.com.au>2020-02-14 09:24:29 +0000
commitbd8968313b3145828822bdd7e12a6e5aa2896c15 (patch)
tree198868c13e1e21d5cea665f87d3f3cb58d432072
parent729c39874d906a6312b878046ca24458af4b6a8b (diff)
downloadsws-bd8968313b3145828822bdd7e12a6e5aa2896c15.tar.gz
sws-bd8968313b3145828822bdd7e12a6e5aa2896c15.tar.bz2
Fix template loading order
-rw-r--r--cmd/server/db.go35
-rw-r--r--cmd/server/handlers.go20
-rw-r--r--cmd/server/hits.go4
-rw-r--r--cmd/server/main.go48
-rw-r--r--go.mod4
-rw-r--r--go.sum2
-rw-r--r--templates/example.tmpl24
-rw-r--r--templates/gen.go2
-rw-r--r--templates/home.tmpl8
-rw-r--r--templates/partials/navMain.tmpl8
-rw-r--r--templates/partials/navService.tmpl5
-rw-r--r--templates/partials/pageFoot.tmpl4
-rw-r--r--templates/partials/pageHead.tmpl9
-rw-r--r--user_agent.go9
14 files changed, 117 insertions, 65 deletions
diff --git a/cmd/server/db.go b/cmd/server/db.go
new file mode 100644
index 0000000..8fc262c
--- /dev/null
+++ b/cmd/server/db.go
@@ -0,0 +1,35 @@
+package main
+
+import (
+ "database/sql"
+ "fmt"
+
+ "src.userspace.com.au/go-migrate"
+)
+
+func migrateDatabase(driver, dsn string) (int64, error) {
+ var version int64
+ db, err := sql.Open(driver, dsn)
+ if err != nil {
+ return version, err
+ }
+ defer db.Close()
+
+ // Load migrations from generated file
+ ms, err := decodeMigrations(driver)
+ if err != nil {
+ return 0, err
+ }
+ debug("found", len(ms), "migrations for driver", driver)
+ migrator, err := migrate.NewStringMigrator(db, ms)
+ if err != nil {
+ return version, fmt.Errorf("failed to initialise: %w", err)
+ }
+
+ err = migrator.Migrate()
+ if err != nil {
+ return version, fmt.Errorf("failed to migrate: %w", err)
+ }
+
+ return migrator.Version()
+}
diff --git a/cmd/server/handlers.go b/cmd/server/handlers.go
index 7ec8b24..de3bfa3 100644
--- a/cmd/server/handlers.go
+++ b/cmd/server/handlers.go
@@ -5,28 +5,16 @@ import (
"net/http"
)
-func handleIndex() http.HandlerFunc {
- tmplHome := loadTemplateMust("home")
- tmplNav := loadTemplateMust("partials/navMain")
- tmplLayout := loadTemplateMust("layout")
- tmpl := template.Must(template.New("layout").Parse(string(tmplLayout)))
- _ = template.Must(tmpl.Parse(string(tmplHome)))
- _ = template.Must(tmpl.Parse(string(tmplNav)))
- debug(tmpl)
-
+func handleIndex(tmpls *template.Template) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html")
- tmpl.Execute(w, nil)
+ tmpls.ExecuteTemplate(w, "home", nil)
}
}
-func handleExample() http.HandlerFunc {
+func handleExample(tmpls *template.Template) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html")
- b, err := loadTemplate("example")
- if err != nil {
- panic(err)
- }
- w.Write(b)
+ tmpls.ExecuteTemplate(w, "example", nil)
}
}
diff --git a/cmd/server/hits.go b/cmd/server/hits.go
index 64bab3b..b64efea 100644
--- a/cmd/server/hits.go
+++ b/cmd/server/hits.go
@@ -45,6 +45,8 @@ func handleHitCounter(db sws.CounterStore) http.HandlerFunc {
//http.Error(w, err.Error(), http.StatusInternalServerError)
//return
}
+ // TODO restrict to site domains
+ w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Content-Type", "image/gif")
w.Write(gifBytes)
log("hit", hit)
@@ -54,6 +56,8 @@ func handleHitCounter(db sws.CounterStore) http.HandlerFunc {
func handleCounter(addr string) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
+ // TODO restrict to site domains
+ w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Content-Type", "application/javascript")
reader := strings.NewReader(counter)
if _, err := io.Copy(w, reader); err != nil {
diff --git a/cmd/server/main.go b/cmd/server/main.go
index 2c3ab4f..44fee32 100644
--- a/cmd/server/main.go
+++ b/cmd/server/main.go
@@ -2,9 +2,9 @@ package main
import (
"context"
- "database/sql"
"flag"
"fmt"
+ "html/template"
"net/http"
"os"
"strconv"
@@ -16,7 +16,6 @@ import (
_ "github.com/jackc/pgx/stdlib"
"github.com/jmoiron/sqlx"
_ "github.com/mattn/go-sqlite3"
- "src.userspace.com.au/go-migrate"
"src.userspace.com.au/sws"
"src.userspace.com.au/sws/store"
)
@@ -74,12 +73,12 @@ func main() {
db, err := sqlx.Open(driver, *dsn)
if err != nil {
- fmt.Println(err)
+ log(err)
os.Exit(1)
}
defer db.Close()
if err := db.Ping(); err != nil {
- fmt.Println(err)
+ log(err)
os.Exit(1)
}
var st sws.Store
@@ -89,6 +88,15 @@ func main() {
st = store.NewSqlite3Store(db)
}
+ tmpls := template.Must(loadTemplateHTML([]string{
+ "home",
+ "example",
+ "partials/navMain",
+ "partials/pageHead",
+ "partials/pageFoot",
+ }, nil))
+ debug(tmpls.DefinedTemplates())
+
r := chi.NewRouter()
r.Use(middleware.RequestID)
r.Use(middleware.RealIP)
@@ -119,10 +127,10 @@ func main() {
})
})
})
- r.Get("/", handleIndex())
+ r.Get("/", handleIndex(tmpls))
// Example
- r.Get("/test.html", handleExample())
+ r.Get("/test.html", handleExample(tmpls))
log("listening at", *addr)
http.ListenAndServe(*addr, r)
@@ -154,31 +162,3 @@ func getDomainCtx(db sws.DomainStore) func(http.Handler) http.Handler {
// })
// }
// }
-
-func migrateDatabase(driver, dsn string) (int64, error) {
- db, err := sql.Open(driver, dsn)
- if err != nil {
- fmt.Println(err)
- os.Exit(1)
- }
- defer db.Close()
-
- var version int64
- // Load migrations from generated file
- ms, err := decodeMigrations(driver)
- if err != nil {
- return 0, err
- }
- debug("found", len(ms), "migrations for driver", driver)
- migrator, err := migrate.NewStringMigrator(db, ms)
- if err != nil {
- return version, fmt.Errorf("failed to initialise: %w", err)
- }
-
- err = migrator.Migrate()
- if err != nil {
- return version, fmt.Errorf("failed to migrate: %w", err)
- }
-
- return migrator.Version()
-}
diff --git a/go.mod b/go.mod
index cd629af..ef97b34 100644
--- a/go.mod
+++ b/go.mod
@@ -20,9 +20,7 @@ require (
google.golang.org/appengine v1.6.5 // indirect
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
src.userspace.com.au/go-migrate v0.0.0-20200208102934-cf11cf76db3f
- src.userspace.com.au/templates v0.0.0-20200213053211-f58212f65bbd
+ src.userspace.com.au/templates v0.0.0-20200214092258-6bc0451a1d45
)
-replace src.userspace.com.au/templates => ../templates
-
go 1.13
diff --git a/go.sum b/go.sum
index 2e8a4c1..8cf7f2a 100644
--- a/go.sum
+++ b/go.sum
@@ -52,3 +52,5 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogR
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
src.userspace.com.au/go-migrate v0.0.0-20200208102934-cf11cf76db3f h1:Vdn/5kMeLXWfkXF/wm9lioSBASBn02aA5DeVjLAYjLM=
src.userspace.com.au/go-migrate v0.0.0-20200208102934-cf11cf76db3f/go.mod h1:QaSWOcvGubR8TBPs8XgLN67muYgAKnmIgHAaQk5ZR1c=
+src.userspace.com.au/templates v0.0.0-20200214092258-6bc0451a1d45 h1:Zvc9Sw4WpR/4JEtQT0J29YeccKxUld+8kmqUFKf0CvQ=
+src.userspace.com.au/templates v0.0.0-20200214092258-6bc0451a1d45/go.mod h1:lB6Vdw9R/8jR8CzvPxfQ8ryBwpNDni1fCdeRjj90gxA=
diff --git a/templates/example.tmpl b/templates/example.tmpl
index 13dd609..72b1450 100644
--- a/templates/example.tmpl
+++ b/templates/example.tmpl
@@ -1,14 +1,16 @@
+{{ define "example" }}
<!doctype html>
<html>
- <head>
- <meta charset="utf-8">
- <script async src="http://localhost:5000/sws.js" data-sws="http://localhost:5000/sws.gif"></script>
- <title>This is the title</title>
- <noscript>
- <img src="http://localhost:5000/sws.gif" />
- </noscript>
- </head>
- <body>
- <a href="?referred">test</a>
- </body>
+ <head>
+ <meta charset="utf-8">
+ <script async src="http://localhost:5000/sws.js" data-sws="http://localhost:5000/sws.gif"></script>
+ <title>This is the title</title>
+ <noscript>
+ <img src="http://localhost:5000/sws.gif" />
+ </noscript>
+ </head>
+ <body>
+ <a href="?referred">test</a>
+ </body>
</html>
+{{ end }}
diff --git a/templates/gen.go b/templates/gen.go
index fb0faf7..81811a9 100644
--- a/templates/gen.go
+++ b/templates/gen.go
@@ -9,7 +9,7 @@ import (
)
func main() {
- tmpl := templates.Must(templates.New())
+ tmpl := templates.Must(templates.New(templates.EnableHTMLTemplates()))
if _, err := tmpl.WriteTo(os.Stdout); err != nil {
panic(err)
}
diff --git a/templates/home.tmpl b/templates/home.tmpl
new file mode 100644
index 0000000..d95845a
--- /dev/null
+++ b/templates/home.tmpl
@@ -0,0 +1,8 @@
+{{ define "home" }}
+ {{ template "pageHead" }}
+ {{ template "navMain" }}
+ <main>
+ home page
+ </main>
+ {{ template "pageFoot" }}
+{{ end }}
diff --git a/templates/partials/navMain.tmpl b/templates/partials/navMain.tmpl
new file mode 100644
index 0000000..e74f015
--- /dev/null
+++ b/templates/partials/navMain.tmpl
@@ -0,0 +1,8 @@
+{{ define "navMain" }}
+<nav>
+ <a href="/">Home</a>
+ <a href="/sites">Sites</a>
+ <a href="/sites/new">New site</a>
+ <a href="/logout">Logout</a>
+</nav>
+{{ end }}
diff --git a/templates/partials/navService.tmpl b/templates/partials/navService.tmpl
new file mode 100644
index 0000000..66ef680
--- /dev/null
+++ b/templates/partials/navService.tmpl
@@ -0,0 +1,5 @@
+{{ define "navService" }}
+<nav>
+ <a href="">Stats</a>
+</nav>
+{{ end }}
diff --git a/templates/partials/pageFoot.tmpl b/templates/partials/pageFoot.tmpl
new file mode 100644
index 0000000..d054b3d
--- /dev/null
+++ b/templates/partials/pageFoot.tmpl
@@ -0,0 +1,4 @@
+{{ define "pageFoot" }}
+ </body>
+</html>
+{{ end }}
diff --git a/templates/partials/pageHead.tmpl b/templates/partials/pageHead.tmpl
new file mode 100644
index 0000000..e44295d
--- /dev/null
+++ b/templates/partials/pageHead.tmpl
@@ -0,0 +1,9 @@
+{{ define "pageHead" }}
+<!DOCTYPE html>
+<html lang="en-au">
+ <head>
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Simple Web Stats</title>
+ </head>
+ <body>
+{{ end }}
diff --git a/user_agent.go b/user_agent.go
index cbb831b..19973b3 100644
--- a/user_agent.go
+++ b/user_agent.go
@@ -4,15 +4,24 @@ import (
"crypto/sha1"
"fmt"
"net/http"
+ "regexp"
"time"
)
+var botRegex = regexp.MustCompile("(?i)(bot|crawler|sp(i|y)der|search|worm|fetch|nutch)")
+var botFromSiteRegexp = regexp.MustCompile("http[s]?://.+\\.\\w+")
+
type UserAgent struct {
Hash string `json:"hash"`
Name string `json:"name"`
LastSeenAt time.Time `json:"last_seen_at"`
}
+func (ua UserAgent) Bot() bool {
+ // TODO a little naive ATM
+ return botRegex.MatchString(ua.Name) || botFromSiteRegexp.MatchString(ua.Name)
+}
+
func UserAgentHash(s string) string {
return fmt.Sprintf("%x", sha1.Sum([]byte(s)))
}