Browse Source

Update StyleSheet implementation

pull/12/head
Trevor Slocum 2 months ago
parent
commit
3500533ecf
  1. 15
      CONFIGURATION.md
  2. 12
      config.go
  3. 2
      go.mod
  4. 4
      go.sum
  5. 2
      main.go
  6. 35
      serve_https.go
  7. 3
      server.go

15
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$

12
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)
}
}
}

2
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
)

4
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=

2
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 == "" {

35
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)

3
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
}

Loading…
Cancel
Save