parent
7c67df0f1d
commit
0c36391bb2
67
main.go
67
main.go
|
|
@ -9,6 +9,7 @@ listing file.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
@ -16,13 +17,16 @@ import (
|
||||||
"local/gziphttp"
|
"local/gziphttp"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
ENDPOINT_UPLOAD = "__upload__"
|
ENDPOINT_UPLOAD = "__upload__"
|
||||||
|
ENDPOINT_DELETE = "__delete__"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
@ -48,7 +52,7 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func handler(d string) http.HandlerFunc {
|
func handler(d string) http.HandlerFunc {
|
||||||
return gzip(endpoints(fserve(d)))
|
return gzip(endpoints(withDel(fserve(d))))
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeMeta(w http.ResponseWriter) {
|
func writeMeta(w http.ResponseWriter) {
|
||||||
|
|
@ -90,6 +94,10 @@ func endpoints(foo http.HandlerFunc) http.HandlerFunc {
|
||||||
if err := upload(w, r); err != nil {
|
if err := upload(w, r); err != nil {
|
||||||
fmt.Fprintln(w, err.Error())
|
fmt.Fprintln(w, err.Error())
|
||||||
}
|
}
|
||||||
|
} else if isDeleted(r) {
|
||||||
|
if err := del(w, r); err != nil {
|
||||||
|
fmt.Fprintln(w, err.Error())
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
foo(w, r)
|
foo(w, r)
|
||||||
}
|
}
|
||||||
|
|
@ -100,10 +108,51 @@ func isUploaded(r *http.Request) bool {
|
||||||
return path.Base(r.URL.Path) == ENDPOINT_UPLOAD
|
return path.Base(r.URL.Path) == ENDPOINT_UPLOAD
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isDeleted(r *http.Request) bool {
|
||||||
|
return path.Base(r.URL.Path) == ENDPOINT_DELETE
|
||||||
|
}
|
||||||
|
|
||||||
func isDir(r *http.Request) bool {
|
func isDir(r *http.Request) bool {
|
||||||
d := toRealPath(r.URL.Path)
|
d := toRealPath(r.URL.Path)
|
||||||
fi, err := os.Stat(d)
|
fi, err := os.Stat(d)
|
||||||
return err == nil && fi.IsDir()
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if !fi.IsDir() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if _, err := os.Stat(path.Join(d, "index.html")); err == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func withDel(foo http.HandlerFunc) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if !isDir(r) {
|
||||||
|
foo(w, r)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Fprintln(w, `<a href=".."><input type="button" style="padding: .15em 4em .35em 4em" value=".."/></a>`+"\n")
|
||||||
|
w2 := httptest.NewRecorder()
|
||||||
|
foo(w2, r)
|
||||||
|
b := bytes.Split(w2.Body.Bytes(), []byte("\n"))
|
||||||
|
buff := bytes.NewBuffer(nil)
|
||||||
|
for i := range b {
|
||||||
|
if bytes.Contains(b[i], []byte("<a href=")) {
|
||||||
|
re := regexp.MustCompile(`href="[^"]*"`)
|
||||||
|
match := re.Find(b[i])
|
||||||
|
if len(match) > 0 {
|
||||||
|
match = bytes.Split(match, []byte(`href="`))[1]
|
||||||
|
match = match[:len(match)-1]
|
||||||
|
b[i] = []byte(fmt.Sprintf(`<a href="%s/%s"><input type="button" value="❌" style="padding: .40em 1em .10em 1em; margin-right: .5em"/></a> %s`, match, ENDPOINT_DELETE, b[i]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buff.Write(b[i])
|
||||||
|
buff.Write([]byte("\n"))
|
||||||
|
}
|
||||||
|
io.Copy(w, buff)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func fserve(d string) http.HandlerFunc {
|
func fserve(d string) http.HandlerFunc {
|
||||||
|
|
@ -134,6 +183,20 @@ func upload(w http.ResponseWriter, r *http.Request) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func del(w http.ResponseWriter, r *http.Request) error {
|
||||||
|
p := toRealPath(path.Dir(r.URL.Path))
|
||||||
|
_, err := os.Stat(p)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = os.Remove(p)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
http.Redirect(w, r, path.Dir(path.Dir(r.URL.Path))+"/", http.StatusSeeOther)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func toRealPath(p string) string {
|
func toRealPath(p string) string {
|
||||||
d := path.Join(fs.Get("d").GetString())
|
d := path.Join(fs.Get("d").GetString())
|
||||||
return path.Join(d, p)
|
return path.Join(d, p)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue