diff --git a/CONFIGURATION.md b/CONFIGURATION.md index e9ae1af..0470cab 100644 --- a/CONFIGURATION.md +++ b/CONFIGURATION.md @@ -91,18 +91,19 @@ certbot certonly --config-dir /home/www/certs \ Provide the path to the certificate file at `certs/live/$DOMAIN/fullchain.pem` and the private key file at `certs/live/$DOMAIN/privkey.pem` to twins. -## DisableHTTPS +### StyleSheet + +Provide the path to a style sheet to serve instead of the default style sheet. + +This option only applies when serving HTTPS connections. + +### DisableHTTPS Pages are also available via HTTPS on the same port by default. Set this option to `true` to disable this feature. Pages are converted automatically by [gmitohtml](https://code.rocketnine.space/tslocum/gmitohtml). -## StyleSheet - -Specify a custom CSS stylesheet file if you want to override the default. This only -affects the `HTTPS` protocol (obviously). - ### DisableSize The size of the response body is included in the media type header by default. @@ -245,7 +246,7 @@ hosts: gemini.rocks: cert: /srv/gemini.rocks/data/cert.crt key: /srv/gemini.rocks/data/cert.key - stylesheet: /srv/gemini.rocks/styles.css # Custom CSS stylesheet + stylesheet: /srv/gemini.rocks/style.css paths: - path: ^/.*\.php$ diff --git a/config.go b/config.go index 7f20b18..17b7d24 100644 --- a/config.go +++ b/config.go @@ -70,6 +70,7 @@ type hostConfig struct { StyleSheet string cert *tls.Certificate + css []byte } type serverConfig struct { @@ -87,8 +88,6 @@ type serverConfig struct { const cacheUnset = -1965 -var customCSS = make(map[string][]byte) - var config *serverConfig func readconfig(configPath string) error { @@ -219,13 +218,12 @@ func readconfig(configPath string) error { if host.StyleSheet != "" { _, err := os.Stat(host.StyleSheet) if os.IsNotExist(err) { - log.Printf("custom stylesheet '%v' not found, ignore it.", host.StyleSheet) + log.Printf("error: stylesheet '%s' not found", host.StyleSheet) } else { - cssBytes, err := ioutil.ReadFile(host.StyleSheet) + host.css, err = ioutil.ReadFile(host.StyleSheet) if err != nil { - log.Printf("problems with stylesheet '%v': %v", host.StyleSheet, err.Error()) - } else { - customCSS[hostname] = cssBytes + host.css = nil + log.Printf("error: failed to read stylesheet %s: %s", host.StyleSheet, err) } } } diff --git a/go.mod b/go.mod index cbffa67..117fed0 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,6 @@ require ( github.com/h2non/filetype v1.1.1 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/yookoala/gofast v0.6.0 - golang.org/x/tools v0.1.2 // indirect + golang.org/x/tools v0.1.4 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b ) diff --git a/go.sum b/go.sum index d8fc5a6..4a94dd4 100644 --- a/go.sum +++ b/go.sum @@ -41,8 +41,8 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200908211811-12e1bf57a112/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.1.2 h1:kRBLX7v7Af8W7Gdbbc908OJcdgtK8bOz9Uaj8/F1ACA= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4 h1:cVngSRcfgyZCzys3KYOpCFa+4dqX/Oub9tAq00ttGVs= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/main.go b/main.go index a513c94..2fa25a3 100644 --- a/main.go +++ b/main.go @@ -14,12 +14,14 @@ func init() { } var quiet bool +var debug bool func main() { log.SetFlags(0) configFile := flag.String("config", "", "path to configuration file") flag.BoolVar(&quiet, "quiet", false, "do not print access log") + flag.BoolVar(&debug, "debug", false, "print debug information") flag.Parse() if *configFile == "" { diff --git a/serve_https.go b/serve_https.go index b4c09cc..e75e6aa 100644 --- a/serve_https.go +++ b/serve_https.go @@ -30,24 +30,6 @@ func serveHTTPS(w http.ResponseWriter, r *http.Request) (int, int64, string) { status := http.StatusTemporaryRedirect http.Redirect(w, r, u.String(), status) return status, -1, "" - } else if r.URL.Path == "/assets/style.css" { - status := http.StatusOK - w.Header().Set("Content-Type", cssType) - w.WriteHeader(status) - - if r.Method == "HEAD" { - return status, 0, "" - } - - // Do we have a custom CSS file? If so, we use this instead. - if css, found := customCSS[r.URL.Hostname()]; found { - w.Write(css) - return status, int64(len(css)), "" - } - - // Default CSS - w.Write(cssBytes) - return status, int64(len(cssBytes)), "" } pathBytes := []byte(r.URL.Path) @@ -57,6 +39,23 @@ func serveHTTPS(w http.ResponseWriter, r *http.Request) (int, int64, string) { } if host, ok := config.Hosts[r.URL.Hostname()]; ok { + if strings.HasSuffix(r.URL.Path, "/assets/style.css") { + status := http.StatusOK + w.Header().Set("Content-Type", cssType) + w.WriteHeader(status) + + if r.Method == "HEAD" { + return status, 0, "" + } + + if host.css != nil { + w.Write(host.css) + } else { + w.Write(cssBytes) + } + return status, int64(len(cssBytes)), "" + } + for _, serve := range host.Paths { matchedRegexp := serve.r != nil && serve.r.Match(pathBytes) matchedPrefix := serve.r == nil && strings.HasPrefix(r.URL.Path, serve.Path) diff --git a/server.go b/server.go index 109fa84..363b0f0 100644 --- a/server.go +++ b/server.go @@ -351,6 +351,9 @@ func handleConn(c *tls.Conn) { if err == io.EOF { break } else if err != nil || n != 1 { + if debug { + log.Printf("error: failed to read client: %s", err) + } return }