diff --git a/cmd/files.go b/cmd/files.go
index 68715de..d06f803 100644
--- a/cmd/files.go
+++ b/cmd/files.go
@@ -18,8 +18,13 @@ func getFiles(path string) ([]string, error) {
if info.IsDir() && p != path {
return filepath.SkipDir
} else {
- paths = append(paths, p)
+ absolutePath, err := filepath.Abs(p)
+ if err != nil {
+ return err
+ }
+ paths = append(paths, absolutePath)
}
+
return err
})
if err != nil {
@@ -34,7 +39,11 @@ func getFilesRecursive(path string) ([]string, error) {
err := filepath.WalkDir(path, func(p string, info os.DirEntry, err error) error {
if !info.IsDir() {
- paths = append(paths, p)
+ absolutePath, err := filepath.Abs(p)
+ if err != nil {
+ return err
+ }
+ paths = append(paths, absolutePath)
}
return err
})
@@ -54,12 +63,14 @@ func getFileList(args []string) ([]string, error) {
if err != nil {
return nil, err
}
+
fileList = append(fileList, f...)
} else {
f, err := getFiles(args[i])
if err != nil {
return nil, err
}
+
fileList = append(fileList, f...)
}
}
@@ -68,10 +79,25 @@ func getFileList(args []string) ([]string, error) {
}
func pickFile(fileList []string) (string, string) {
- rand.Seed(time.Now().Unix())
+ rand.Seed(time.Now().UnixMicro())
filePath := fileList[rand.Intn(len(fileList))]
fileName := filepath.Base(filePath)
- return filePath, fileName
+ return fileName, filePath
+}
+
+func normalizePaths(args []string) []string {
+ var paths []string
+
+ for i := 0; i < len(args); i++ {
+ absolutePath, err := filepath.Abs(args[i])
+ if err != nil {
+ panic(err)
+ }
+
+ paths = append(paths, absolutePath)
+ }
+
+ return paths
}
diff --git a/cmd/web.go b/cmd/web.go
index d9edba4..564d063 100644
--- a/cmd/web.go
+++ b/cmd/web.go
@@ -9,15 +9,18 @@ import (
"io"
"log"
"net/http"
+ "net/url"
"os"
"strconv"
- "strings"
)
-func generateHeader() string {
- htmlHeader := `
+func generateHeader(fileName string) string {
+ htmlHeader := `
- OUI Lookup
+
+ `
+ htmlHeader += fileName
+ htmlHeader += `
`
@@ -32,39 +35,26 @@ func generateFooter() string {
return htmlFooter
}
-func generatePageRaw(w http.ResponseWriter, output []string) {
- w.Header().Add("Content-Type", "text/plain")
-
- for i := 0; i < len(output); i++ {
- if Verbose {
- fmt.Println(output[i])
- }
-
- _, err := io.WriteString(w, output[i]+"\n")
- if err != nil {
- fmt.Println(err)
- }
+func generatePageHtml(w http.ResponseWriter, paths []string, output []string) {
+ fileList, err := getFileList(paths)
+ if err != nil {
+ panic(err)
}
-}
-func generatePageHtml(w http.ResponseWriter, output []string) {
+ fileName, filePath := pickFile(fileList)
+
w.Header().Add("Content-Type", "text/html")
- _, err := io.WriteString(w, generateHeader())
+ _, err = io.WriteString(w, generateHeader(fileName))
if err != nil {
fmt.Println(err)
}
- for i := 0; i < len(output); i++ {
- if Verbose {
- fmt.Println(output[i])
- }
-
- _, err = io.WriteString(w, " "+output[i]+"
\n")
- if err != nil {
- fmt.Println(err)
- }
- }
+ htmlBody := `
+`
+ _, err = io.WriteString(w, htmlBody)
_, err = io.WriteString(w, generateFooter())
if err != nil {
@@ -72,74 +62,37 @@ func generatePageHtml(w http.ResponseWriter, output []string) {
}
}
-func generatePageHelp(r *http.Request, w http.ResponseWriter) {
- w.Header().Add("Content-Type", "text/html")
-
- _, err := io.WriteString(w, generateHeader())
- if err != nil {
- fmt.Println(err)
- }
-
- exampleHtmlUrl := fmt.Sprintf("http://%v/7C:0E:CE:FE:FE:FE,10:FE:ED:AB:AB:AB", r.Host)
- exampleRawUrl := fmt.Sprintf("http://%v/raw/7C:0E:CE:FE:FE:FE,10:FE:ED:AB:AB:AB", r.Host)
- exampleJsonUrl := fmt.Sprintf("http://%v/json/7C:0E:CE:FE:FE:FE,10:FE:ED:AB:AB:AB", r.Host)
-
- help := fmt.Sprintf(" Provide one or more MAC addresses, separated by commas.
\n For example: %v", exampleHtmlUrl, exampleHtmlUrl)
- help += fmt.Sprintf("
\n Also supports plain text responses.
\n For example: %v", exampleRawUrl, exampleRawUrl)
- help += fmt.Sprintf("
\n And JSON responses, of course.
\n For example: %v", exampleJsonUrl, exampleJsonUrl)
-
- _, err = io.WriteString(w, help)
- if err != nil {
- fmt.Println(err)
- }
-
- _, err = io.WriteString(w, generateFooter())
- if err != nil {
- fmt.Println(err)
- }
-}
-
-func servePageHandler() http.HandlerFunc {
+func servePageHandler(paths []string) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
- var ouis []string
-
- oui := r.RequestURI
-
- if oui == "" {
- generatePageHelp(r, w)
-
- return
- }
-
- args := strings.Split(oui, ",")
- for i := 0; i < len(args); i++ {
- ouis = append(ouis, args[i])
- }
-
var output []string
- generatePageHtml(w, output)
+ request := r.RequestURI
+
+ if r.RequestURI == "/" {
+ generatePageHtml(w, paths, output)
+ } else {
+ f, err := url.QueryUnescape(request)
+ if err != nil {
+ log.Fatal(err)
+ return
+ }
+ buf, err := os.ReadFile(f)
+ if err != nil {
+ panic(err)
+ }
+ w.Write(buf)
+ }
}
}
func doNothing(http.ResponseWriter, *http.Request) {}
func ServePage(args []string) {
-
- fileList, err := getFileList(args)
- if err != nil {
- panic(err)
- }
-
- fileName, filePath := pickFile(fileList)
- fmt.Println(fileName)
- fmt.Println(filePath)
-
- os.Exit(0)
-
defer HandleExit()
- http.HandleFunc("/", servePageHandler())
+ paths := normalizePaths(args)
+
+ http.HandleFunc("/", servePageHandler(paths))
http.HandleFunc("/favicon.ico", doNothing)
port := strconv.Itoa(Port)