package main
import (
"net/http"
"os/exec"
"fmt"
"strings"
"io/ioutil"
)
type fileServer
struct {
}
func (f *fileServer) ServeHTTP(w http.ResponseWriter ,r *http.Request){
requestPath :=
"."+r.URL.Path
fmt.Printf(
"Get request%v\n",requestPath)
getTypeCmd := exec.Command(
"file",requestPath)
fileType,err := getTypeCmd.Output()
if err !=
nil {
w.Write([]
byte(fmt.Sprintf(
"Get %s error: %v",requestPath,err)))
}
if strings.Contains(
string(fileType[:]),
"directory") {
cmd := exec.Command(
"ls",requestPath)
fileListData ,err := cmd.Output()
if err !=
nil{
fmt.Printf(
"Get output of cmd ls error %v\n",err)
}
fileList := strings.Split(
string(fileListData[:]),
"\n")
fileListLink := GenLinkForFile(r.URL.Path,fileList)
w.Write([]
byte(fileListLink))
}
else {
fileData,err := ioutil.ReadFile(requestPath)
if err!=
nil {
w.Write([]
byte(fmt.Sprintf(
"Get file %s error: %v",requestPath,err)))
}
w.Write(fileData)
}
}
func GenLinkForFile(basePath
string,fileList []
string)
string {
var fileListLink
string =
`<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for `+basePath+
`</title>
<body>
<h2>Directory listing for `+basePath+
`</h2>
<hr>
<ul>
`
for i:
=0;i<
len(fileList);i++ {
if fileList[i] ==
"" {
continue
}
if basePath ==
"/" {
fileList[i] =
"<li><a href=\"" + basePath + fileList[i] +
"\">" + fileList[i] +
"</a>\n"
}
else {
fileList[i] =
"<li><a href=\"" + basePath +
`/` + fileList[i] +
"\">" + fileList[i] +
"</a>\n"
}
fileListLink = fileListLink + fileList[i]
}
fileListLink = fileListLink +
`</ul>
<hr>
</body>
</html>`
return fileListLink
}
func SimpleServer(){
http.Handle(
"/",&fileServer{})
err := http.ListenAndServe(
":8000",
nil)
if err !=
nil {
fmt.Printf(
"Listen 8000 error:%v\n",err)
}
}
func main () {
SimpleServer()
}
转载请注明原文地址: https://ju.6miu.com/read-17743.html