From b13ff70a2d2fa1870fc2109f7ce89f93eb801d5b Mon Sep 17 00:00:00 2001 From: ston1th Date: Sun, 13 Mar 2022 20:36:15 +0100 Subject: [PATCH] added redirect anchors --- Makefile | 2 +- pkg/srv/interceptor.go | 43 ++++++++++++++++++++++++++++++++++-------- pkg/srv/srv.go | 13 ++++++------- pkg/srv/templates.go | 4 ++-- 4 files changed, 44 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 4c21e7e..77def40 100644 --- a/Makefile +++ b/Makefile @@ -37,7 +37,7 @@ govet: $(CC) vet ./... misspell: - $(GOPATH)/bin/misspell cmd/* pkg/* Makefile README.md sri.sh + $(GOPATH)/bin/misspell cmd/* pkg/* Makefile README.md staticcheck: $(GOPATH)/bin/staticcheck ./... diff --git a/pkg/srv/interceptor.go b/pkg/srv/interceptor.go index 27f5442..bfa7581 100644 --- a/pkg/srv/interceptor.go +++ b/pkg/srv/interceptor.go @@ -7,14 +7,9 @@ import ( "encoding/xml" "net/http" "sort" + "strings" ) -type dirContents struct { - AllPaths []string `xml:"a"` - Dirs []string `xml:"-"` - Files []string `xml:"-"` -} - type statusInterceptor struct { w http.ResponseWriter status int @@ -23,13 +18,16 @@ type statusInterceptor struct { func (s *statusInterceptor) Header() http.Header { return s.w.Header() } + func (s *statusInterceptor) Write(p []byte) (int, error) { return s.w.Write(p) } + func (s *statusInterceptor) WriteHeader(statusCode int) { s.w.WriteHeader(statusCode) s.status = statusCode } + func (s *statusInterceptor) Status() int { if s.status == 0 { return http.StatusOK @@ -37,6 +35,23 @@ func (s *statusInterceptor) Status() int { return s.status } +type dirContents struct { + AllPaths []string `xml:"a"` + Dirs []string `xml:"-"` + Files files `xml:"-"` +} + +type file struct { + Name string + Anchor string +} + +type files []file + +func (f files) Len() int { return len(f) } +func (f files) Less(i, j int) bool { return f[i].Name < f[j].Name } +func (f files) Swap(i, j int) { f[i], f[j] = f[j], f[i] } + type responseInterceptor struct { buf bytes.Buffer w http.ResponseWriter @@ -46,18 +61,22 @@ type responseInterceptor struct { func (r *responseInterceptor) Header() http.Header { return r.w.Header() } + func (r *responseInterceptor) Write(p []byte) (int, error) { return r.buf.Write(p) } + func (r *responseInterceptor) WriteHeader(statusCode int) { r.status = statusCode } + func (r *responseInterceptor) Status() int { if r.status == 0 { return http.StatusOK } return r.status } + func (r *responseInterceptor) GetPaths() (dir dirContents, err error) { err = xml.Unmarshal(r.buf.Bytes(), &dir) if err != nil { @@ -67,10 +86,18 @@ func (r *responseInterceptor) GetPaths() (dir dirContents, err error) { if p[len(p)-1] == '/' { dir.Dirs = append(dir.Dirs, p) } else { - dir.Files = append(dir.Files, p) + dir.Files = append(dir.Files, file{Name: p, Anchor: anchor(p)}) } } sort.Strings(dir.Dirs) - sort.Strings(dir.Files) + sort.Sort(dir.Files) return } + +func anchor(s string) string { + if i := strings.LastIndex(s, "/"); i > 0 && i+1 < len(s) { + s = s[i+1:] + } + s = strings.ReplaceAll(s, " ", "_") + return strings.ToLower(s) +} diff --git a/pkg/srv/srv.go b/pkg/srv/srv.go index 948ed61..41c5169 100644 --- a/pkg/srv/srv.go +++ b/pkg/srv/srv.go @@ -37,9 +37,10 @@ func (fs *FileServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } fs.log.Info("access", - "uri", r.RequestURI, + "client", r.RemoteAddr, "method", r.Method, "status", s.Status(), + "uri", r.RequestURI, ) }() upath := r.URL.Path @@ -65,13 +66,11 @@ func (fs *FileServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { if !d.IsDir() { if r.FormValue("p") == "t" { fs.fs.Preload(p) - idx := strings.LastIndex(p, "/") - if idx > 0 { - p = p[:idx] - } else { - p = "/" + rdir := "/" + if i := strings.LastIndex(p, "/"); i > 0 { + rdir = p[:i] } - http.Redirect(w, r, p, http.StatusFound) + http.Redirect(w, r, rdir+"#"+anchor(p), http.StatusFound) return } if r.FormValue("n") == "t" { diff --git a/pkg/srv/templates.go b/pkg/srv/templates.go index 37cbee1..7daf277 100644 --- a/pkg/srv/templates.go +++ b/pkg/srv/templates.go @@ -28,8 +28,8 @@ var ( {{$s}} {{end -}} {{range $s := .Files -}} - {{$s}} - [v] [n] [p] + {{$s.Name}} + [v] [n] [p] {{end -}}