// Copyright (C) 2022 Marius Schellenberger package srv import ( "bytes" "encoding/xml" "net/http" "sort" ) type dirContents struct { AllPaths []string `xml:"a"` Dirs []string `xml:"-"` Files []string `xml:"-"` } type statusInterceptor struct { w http.ResponseWriter status int } 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 } return s.status } type responseInterceptor struct { buf bytes.Buffer w http.ResponseWriter status int } 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 { return } for _, p := range dir.AllPaths { if p[len(p)-1] == '/' { dir.Dirs = append(dir.Dirs, p) } else { dir.Files = append(dir.Files, p) } } sort.Strings(dir.Dirs) sort.Strings(dir.Files) return }