git.sophuwu.com > cdn   
              221
            
             package main

import (
	"fmt"
	"io/fs"

	"html/template"
	"io"
	"net/http"
	"os"
	"path/filepath"
	"strings"
)

type DirEntry struct {
	Name string
	Size string
	Url  string
	mod  int64
}

func Si(d int64) string {
	f := float64(d)
	i := 0
	for f > 1024 {
		f /= 1024
		i++
	}
	s := fmt.Sprintf("%.2f", f)
	s = strings.TrimRight(s, ".0")
	return fmt.Sprintf("%s %cB", s, " KMGTPEZY"[i])
}

type TemplateData struct {
	Path  string
	Dirs  []DirEntry
	Items []DirEntry
}

func (t *TemplateData) add(a DirEntry, size int64, dir bool) {
	if dir {

		t.Dirs = append(t.Dirs, a)
	} else {
		a.Size = Si(size)
		t.Items = append(t.Items, a)
	}
}
func (t *TemplateData) sortNewest() {
	for _, tt := range []*[]DirEntry{&t.Items, &t.Dirs} {
		for i := 0; i < len(*tt); i++ {
			for j := i + 1; j < len(*tt); j++ {
				if (*tt)[i].mod < (*tt)[j].mod {
					(*tt)[i], (*tt)[j] = (*tt)[j], (*tt)[i]
				}
			}
		}
	}
}

var Temp *template.Template

var HttpCodes = map[int]string{
	404: "Not Found",
	500: "Internal Server Error",
	403: "Forbidden",
	401: "Unauthorized",
	400: "Bad Request",
	200: "OK",
}

func FillError(w io.Writer, err error, code int) bool {
	if err == nil {
		return false
	}
	_ = Temp.ExecuteTemplate(w, "index", map[string]string{
		"Error": fmt.Sprintf("%d: %s", code, HttpCodes[code]),
	})
	return true
}

func customFileServer(root http.Dir) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		upath := r.URL.Path
		f, err := root.Open(upath)
		if FillError(w, err, 404) {
			return
		}
		defer f.Close()
		var fi fs.FileInfo
		fi, err = f.Stat()
		if FillError(w, err, 500) {
			return
		}
		if fi.IsDir() {
			var fi []fs.FileInfo
			fi, err = f.Readdir(0)
			if FillError(w, err, 500) {
				return
			}
			t := TemplateData{Path: upath, Dirs: []DirEntry{}, Items: []DirEntry{}}
			for _, d := range fi {
				t.add(DirEntry{
					Name: d.Name(),
					Url:  filepath.Join(upath, d.Name()),
					mod:  d.ModTime().Unix(),
				}, d.Size(), d.IsDir())
			}
			t.sortNewest()
			Temp.ExecuteTemplate(w, "index", t)
			return
		}
		http.FileServer(root).ServeHTTP(w, r)
	})
}

func main() {
	// Fs := os.DirFS(Config.HTTPDir)

	http.Handle("/", customFileServer(http.Dir(Config.HTTPDir)))
	// http.Handle("/", http.StripPrefix("/", FileServer(http.Dir(Config.HTTPDir))))

	http.ListenAndServe(Config.Listen, nil)

}

var Config struct {
	HTTPDir string
	Listen  string
}

func init() {
	Temp, _ = template.New("index").Parse(embedHtml)

	httpdir := os.Getenv("HTTP_DIR")
	if httpdir == "" {
		httpdir = "."
	}
	Config.HTTPDir, _ = filepath.Abs(httpdir)

	Config.Listen = os.Getenv("ADDR")
	if Config.Listen == "" {
		Config.Listen = "127.0.0.1"
	}
	Config.Listen += ":"
	n := len(Config.Listen)
	Config.Listen += os.Getenv("PORT")
	if len(Config.Listen) == n {
		Config.Listen += "8844"
	}

}

var embedHtml = `{{ define "index" }}
<!DOCTYPE html>
<html>
<head>
{{ if .Path }}
<title>{{ .Path }}</title>
{{ else }}
{{ if .Upload }}
<title>Upload</title>
{{ else }}
<title>Error</title>
{{ end }}
{{ end }}
<style>
:root {--bord: #ccc;--fg: #fff;}
body {width: calc(100% - 2ch);margin: auto auto auto auto ;max-width: 800px;background: #262833;color: var(--fg);font-family: sans-serif;}
.trees {width: 100%;display: flex;flex-direction: column;padding: 0;margin: auto auto;border: 1px solid var(--bord);border-radius: 1ch;overflow: hidden;}
.trees a {display: contents;text-decoration: none;}
.filelabel {padding: 8px;font-size: 1rem;width: auto;margin: 0;display: grid;grid-template-columns: auto auto;grid-gap: 1ch;justify-content: space-between;align-items: center;border-radius: 0;background: transparent;}
.trees > a > *  {border-bottom: 1px solid var(--bord);background: #1c1e26;}
.trees > a > *:hover {background: #2c2e46;}
.trees > a:last-child > *  {border-bottom: none;}
a {color: var(--fg);text-decoration: none;}
.filelabel > :last-child {text-align: right;}
@font-face {
    font-family: "sophuwuicons";
    src: url("data:font/ttf;base64,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AH4AgACBAOwA7gC6B3VuaTAwMDAHdW5pMDAwMQd1bmkwMDAyB3VuaTAwMDMHdW5pMDAwNAd1bmkwMDA1B3VuaTAwMDYHdW5pMDAwNwd1bmkwMDA4B3VuaTAwMDkHdW5pMDAwQQd1bmkwMDBCB3VuaTAwMEMHdW5pMDAwRAd1bmkwMDBFB3VuaTAwMEYHdW5pMDAxMAd1bmkwMDExB3VuaTAwMTIHdW5pMDAxMwd1bmkwMDE0B3VuaTAwMTUHdW5pMDAxNgd1bmkwMDE3B3VuaTAwMTgHdW5pMDAxOQd1bmkwMDFBB3VuaTAwMUIHdW5pMDAxQwd1bmkwMDFEB3VuaTAwMUUHdW5pMDAxRgd1bmkwMDdGB3VuaTAwODAHdW5pMDA4MQd1bmkwMDgyB3VuaTAwODMHdW5pMDA4NAd1bmkwMDg1B3VuaTAwODYHdW5pMDA4Nwd1bmkwMDg4B3VuaTAwODkHdW5pMDA4QQd1bmkwMDhCB3VuaTAwOEMHdW5pMDA4RAd1bmkwMDhFB3VuaTAwOEYHdW5pMDA5MAd1bmkwMDkxB3VuaTAwOTIHdW5pMDA5Mwd1bmkwMDk0B3VuaTAwOTUHdW5pMDA5Ngd1bmkwMDk3B3VuaTAwOTgHdW5pMDA5OQd1bmkwMDlBB3VuaTAwOUIHdW5pMDA5Qwd1bmkwMDlEB3VuaTAwOUUHdW5pMDA5Rgd1bmkwMEEwB3VuaTAwQUQHdW5pMDBCMgd1bmkwMEIzB3VuaTAwQjkAAAAB//8AAgAAAAEAAAAA4p8rRgAAAADjXf2mAAAAAOQFcDk=") format("truetype");
}
.icon {
  font-family: "sophuwuicons";
  font-size: inherit;
  font-weight: normal !important;
  font-style: normal;
}
</style>
</head>
<body>
{{ if .Path }}
<h1>Index of: {{ .Path }}</h1>
<div class="trees">
<a href=".."><div class="filelabel"><span><b class="icon">F</b>&nbsp;..</span><span></span></div></a>
{{ range .Dirs }}
<a href="{{ .Url }}"><div class="filelabel"><span><b class="icon">f</b>&nbsp;{{ .Name }}</span><span></span></div></a>
{{ end }}
{{ range .Items }}
<a href="{{ .Url }}"><div class="filelabel"><span><b class="icon">f</b>&nbsp;{{ .Name }}</span><span>{{ .Size }}</span></div></a>
{{ end }}
</div>
{{ else }}
{{ if .Error }}
<h1>{{ .Error }}</h1>
{{ else }}
{{ if .Upload }}
<h1>Upload</h1>
<form class="trees" enctype="multipart/form-data" action="{{ .Upload }}" method="post">
	<div class="filelabel"><span>Path:</span><input type="text" name="path" /></div>
	<div class="filelabel"><span>File:</span><input type="file" name="myFile" /></div>
	<div class="filelabel"><span>Username:</span><input type="text" name="username" /></div>
	<div class="filelabel"><span>Password:</span><input type="password" name="password" /></div>
	<div class="filelabel"><span>OTP:</span><input type="text" name="otp" /></div>
	<div class="filelabel"><span></span><input type="submit" value="Upload" /></div>
</form>
{{ end }}
{{ end }}
{{ end }}
</body>
</html>
{{ end }}`