aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Hanley <felix@userspace.com.au>2020-02-24 03:15:55 +0000
committerFelix Hanley <felix@userspace.com.au>2020-02-24 03:15:55 +0000
commitd6869c3f614257c2c96a5e9066158a8c9ac4cd06 (patch)
treecc08ba067bcca71a396247f4326ebfdbc0d3994c
parent788eff6c299f47adf6526946aad7bb63fffcb49f (diff)
downloadsws-d6869c3f614257c2c96a5e9066158a8c9ac4cd06.tar.gz
sws-d6869c3f614257c2c96a5e9066158a8c9ac4cd06.tar.bz2
Add Etag to counter
-rw-r--r--Makefile14
-rw-r--r--cmd/server/hits.go26
-rw-r--r--cmd/server/main.go14
-rw-r--r--counter/sws.js6
-rw-r--r--go.mod2
-rw-r--r--go.sum33
-rw-r--r--templates/example.tmpl3
7 files changed, 75 insertions, 23 deletions
diff --git a/Makefile b/Makefile
index bbdfd65..4e8f321 100644
--- a/Makefile
+++ b/Makefile
@@ -23,18 +23,14 @@ cmd/server/static.go: $(STATIC)
cmd/server/templates.go: $(TMPL)
go generate ./templates >$@
-cmd/server/counter.go: counter/sws.min.js
- @printf "package main\n\nconst counter = \`" >$@
- @cat $< >>$@
- @printf "\`\n" >>$@
-
-# cmd/server/counter.go: counter/sws.min.js
-# go generate ./counter >$@
-
-
cmd/server/migrations.go: $(SQL)
go generate ./sql >$@
+cmd/server/counter.go: counter/sws.min.js
+ printf "package main\n\nconst counter = \`" >$@
+ cat $< >>$@
+ printf "\`\n" >>$@
+
%.min.js: %.js node_modules
yarn run -s uglifyjs -c -m -o $@ $<
diff --git a/cmd/server/hits.go b/cmd/server/hits.go
index 992528b..482b272 100644
--- a/cmd/server/hits.go
+++ b/cmd/server/hits.go
@@ -1,10 +1,14 @@
package main
import (
+ "bytes"
+ "crypto/sha1"
"encoding/base64"
+ "fmt"
"io"
"net/http"
"strings"
+ "text/template"
"src.userspace.com.au/sws"
)
@@ -55,12 +59,30 @@ func handleHitCounter(db sws.CounterStore) http.HandlerFunc {
}
func handleCounter(addr string) http.HandlerFunc {
+ tmpl, err := template.New("counter").Parse(counter)
+ if err != nil || tmpl == nil {
+ panic(err)
+ }
+ data := map[string]string{"endpoint": endpoint}
+ var buf bytes.Buffer
+ if err := tmpl.Execute(&buf, data); err != nil {
+ panic(err)
+ }
+ etag := fmt.Sprintf(`"%x"`, sha1.Sum(buf.Bytes()))
+
return func(w http.ResponseWriter, r *http.Request) {
+ if match := r.Header.Get("If-None-Match"); match != "" {
+ if strings.Contains(match, etag) {
+ w.WriteHeader(http.StatusNotModified)
+ return
+ }
+ }
// TODO restrict to site sites
w.Header().Set("Access-Control-Allow-Origin", "*")
+ w.Header().Set("Etag", etag)
w.Header().Set("Content-Type", "application/javascript")
- reader := strings.NewReader(counter)
- if _, err := io.Copy(w, reader); err != nil {
+
+ if _, err := io.Copy(w, &buf); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
diff --git a/cmd/server/main.go b/cmd/server/main.go
index 7f62f11..edf0af3 100644
--- a/cmd/server/main.go
+++ b/cmd/server/main.go
@@ -22,7 +22,12 @@ import (
"src.userspace.com.au/templates"
)
-var Version string
+var (
+ Version string
+ log, debug sws.Logger
+)
+
+const endpoint = "//stats.userspace.com.au/sws.gif"
// Flags
var (
@@ -32,8 +37,6 @@ var (
noMigrate *bool
)
-var log, debug sws.Logger
-
func init() {
verbose = boolFlag("verbose", "v", false, "VERBOSE", "enable verbose output")
addr = stringFlag("listen", "l", "localhost:5000", "LISTEN", "listen address")
@@ -111,8 +114,11 @@ func main() {
renderer := templates.NewRenderer(tmpls)
r := chi.NewRouter()
- r.Use(middleware.RequestID)
r.Use(middleware.RealIP)
+ r.Use(middleware.RequestID)
+ r.Use(middleware.RequestID)
+ compressor := middleware.NewCompressor(5, "text/html", "text/css")
+ r.Use(compressor.Handler())
if *verbose {
r.Use(middleware.Logger)
}
diff --git a/counter/sws.js b/counter/sws.js
index 56a283e..8c4223d 100644
--- a/counter/sws.js
+++ b/counter/sws.js
@@ -6,12 +6,12 @@ var n = w.navigator
var esc = encodeURIComponent
var me = d.currentScript
-var _sws = w._sws || {noauto: false}
+var _sws = w._sws || {noauto: false, local: false}
_sws.d = _sws.d || me.src
_sws.site = _sws.site || me.dataset.site
function count (p, obj) {
- if (l.hostname.match(/(localhost$|^127\.|^10\.|^172\.16\.|^192\.168\.)/))
+ if (!_sws.local && l.hostname.match(/(localhost$|^127\.|^10\.|^172\.16\.|^192\.168\.)/))
return
if ('visibilityState' in d && d.visibilityState === 'prerender')
return
@@ -46,7 +46,7 @@ var viewPort = (w.innerWidth || de.clientWidth || d.body.clientWidth) + 'x' +
ready(function () {
if (!_sws.noauto) {
var ep = new URL(_sws.d)
- count(ep.protocol+'//'+ep.host+'/sws.gif', {
+ count('{{ .endpoint }}', {
i: _sws.site,
s: l.protocol,
h: l.host,
diff --git a/go.mod b/go.mod
index a458165..e3cf3a8 100644
--- a/go.mod
+++ b/go.mod
@@ -22,4 +22,6 @@ require (
src.userspace.com.au/templates v0.0.0-20200220030259-5089e411d858
)
+replace src.userspace.com.au/templates => ../templates
+
go 1.13
diff --git a/go.sum b/go.sum
index 28822c3..5045aae 100644
--- a/go.sum
+++ b/go.sum
@@ -1,11 +1,20 @@
+github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg=
+github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
+github.com/antchfx/htmlquery v1.0.0/go.mod h1:MS9yksVSQXls00iXkiMqXr0J+umL/AmxXKuP28SUJM8=
+github.com/antchfx/xmlquery v1.0.0/go.mod h1:/+CnyD/DzHRnv2eRxrVbieRU/FIF6N0C+7oTtyUtCKk=
+github.com/antchfx/xpath v1.0.0/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
github.com/blend/go-sdk v2.0.0+incompatible h1:FL9X/of4ZYO5D2JJNI4vHrbXPfuSDbUa7h8JP9+E92w=
github.com/blend/go-sdk v2.0.0+incompatible/go.mod h1:3GUb0YsHFNTJ6hsJTpzdmCUl05o8HisKjx5OAlzYKdw=
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-chi/chi v4.0.3+incompatible h1:gakN3pDJnzZN5jqFV2TEdF66rTfKeITyR8qu6ekICEY=
github.com/go-chi/chi v4.0.3+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
+github.com/gocolly/colly/v2 v2.0.1/go.mod h1:ePrRZlJcLTU2C/f8pJzXfkdBtBDHL5hOaKLcBoiJcq8=
github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
@@ -15,8 +24,10 @@ github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGU
github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
github.com/jackc/pgx v3.6.2+incompatible h1:2zP5OD7kiyR3xzRYMhOcXVvkDZsImVXfj+yIyTQf3/o=
github.com/jackc/pgx v3.6.2+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
+github.com/jawher/mow.cli v1.1.0/go.mod h1:aNaQlc7ozF3vw6IJ2dHjp2ZFiA4ozMIYY6PyuRJwlUg=
github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA=
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
+github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak=
github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
@@ -26,35 +37,49 @@ github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJK
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mssola/user_agent v0.5.1 h1:sJUCUozh+j7c0dR2zMIUX5aJjoY/TNo/gXiNujoH5oY=
github.com/mssola/user_agent v0.5.1/go.mod h1:TTPno8LPY3wAIEKRpAtkdMT0f8SE24pLRGPahjCH4uw=
+github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852/go.mod h1:eqOVx5Vwu4gd2mmMZvVZsgIqNSaW3xxRThUJ0k/TPk4=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
github.com/shopspring/decimal v0.0.0-20200105231215-408a2507e114 h1:Pm6R878vxWWWR+Sa3ppsLce/Zq+JNTs6aVvRu13jv9A=
github.com/shopspring/decimal v0.0.0-20200105231215-408a2507e114/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/speps/go-hashids v2.0.0+incompatible h1:kSfxGfESueJKTx0mpER9Y/1XHl+FVQjtCqRyYcviFbw=
github.com/speps/go-hashids v2.0.0+incompatible/go.mod h1:P7hqPzMdnZOfyIk+xrlG1QaSMw+gCBdHKsBDnhpaZvc=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/temoto/robotstxt v1.1.1/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo=
+github.com/velebak/colly-sqlite3-storage v0.0.0-20190425160637-c76683d5163d/go.mod h1:+bhXpKXsxEKgCb9gcKEHSQr6XtqlcIoklUyeZMGS4Fw=
github.com/wcharczuk/go-chart v2.0.1+incompatible h1:0pz39ZAycJFF7ju/1mepnk26RLVLBCWz1STcD3doU0A=
github.com/wcharczuk/go-chart v2.0.1+incompatible/go.mod h1:PF5tmL4EIx/7Wf+hEkpCqYi5He4u90sw+0+6FhrryuE=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6 h1:Sy5bstxEqwwbYs6n0/pBuxKENqOeZUgD45Gp3Q3pqLg=
golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg=
golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0Ola2caSKcY69NUBZrRQ=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
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-20200220013354-f1c51c0fe1a2 h1:0nPxJSdpZh+ikLLtDWX7GldlwcbCX8p9jWYSgRiUcz4=
-src.userspace.com.au/templates v0.0.0-20200220013354-f1c51c0fe1a2/go.mod h1:lB6Vdw9R/8jR8CzvPxfQ8ryBwpNDni1fCdeRjj90gxA=
-src.userspace.com.au/templates v0.0.0-20200220030259-5089e411d858 h1:fDaFR7z+dgvUspJ8Xk2HLnKA6MKEFXWd7xAsoy1gPfA=
-src.userspace.com.au/templates v0.0.0-20200220030259-5089e411d858/go.mod h1:lB6Vdw9R/8jR8CzvPxfQ8ryBwpNDni1fCdeRjj90gxA=
diff --git a/templates/example.tmpl b/templates/example.tmpl
index e2a3e7d..ef628ee 100644
--- a/templates/example.tmpl
+++ b/templates/example.tmpl
@@ -3,8 +3,9 @@
<html>
<head>
<meta charset="utf-8">
- <script async src="http://localhost:5000/sws.js" data-sws="http://localhost:5000/sws.gif" data-site="1"></script>
<title>This is the title</title>
+ <script>_sws = { local: true }</script>
+ <script async src="http://localhost:5000/sws.js" data-sws="http://localhost:5000/sws.gif" data-site="1"></script>
<noscript>
<img src="http://localhost:5000/sws.gif" />
</noscript>