52 lines
1.4 KiB
Plaintext
52 lines
1.4 KiB
Plaintext
|
// +build OMIT
|
||
|
package server
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"bytes"
|
||
|
"io"
|
||
|
"net/http"
|
||
|
|
||
|
"github.com/influxdata/chronograf"
|
||
|
)
|
||
|
|
||
|
// URLPrefixer is a wrapper for an http.Handler that will prefix all occurrences of a relative URL with the configured Prefix
|
||
|
type URLPrefixer struct {
|
||
|
Prefix string // the prefix to be appended after any detected Attrs
|
||
|
Next http.Handler // the http.Handler which will generate the content to be modified by this handler
|
||
|
Attrs [][]byte // a list of attrs that should have their URLs prefixed. For example `src="` or `href="` would be valid
|
||
|
}
|
||
|
|
||
|
func (up *URLPrefixer) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
|
||
|
...
|
||
|
// Read next handler's response byte by byte
|
||
|
src := bufio.NewScanner(nextRead)
|
||
|
src.Split(bufio.ScanBytes)
|
||
|
for {
|
||
|
window := buf.Bytes()
|
||
|
if matchlen, match := up.match(window, up.Attrs...); matchlen != 0 {
|
||
|
buf.Next(matchlen) // advance to the relative URL
|
||
|
for i := 0; i < matchlen; i++ {
|
||
|
src.Scan()
|
||
|
buf.Write(src.Bytes())
|
||
|
}
|
||
|
rw.Write(match) // add the src attr to the output
|
||
|
io.WriteString(rw, up.Prefix) // write the prefix
|
||
|
} else {...}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func NewDefaultURLPrefixer(prefix string, next http.Handler) *URLPrefixer {
|
||
|
return &URLPrefixer{
|
||
|
Prefix: prefix,
|
||
|
Next: next,
|
||
|
Logger: lg,
|
||
|
Attrs: [][]byte{
|
||
|
[]byte(`src="`),
|
||
|
[]byte(`href="`),
|
||
|
[]byte(`url(`),
|
||
|
[]byte(`data-basepath="`), // for forwarding basepath to frontend
|
||
|
},
|
||
|
}
|
||
|
}
|