代码:https://github.com/NIGHTFIGHTING/go_learning/tree/master/src/errhandling/filelistingserver
filelisting/handler.go
package filelisting
import (
"net/http"
"os"
"io/ioutil"
)
func HandleFileList(writer http.ResponseWriter,
request *http.Request) error {
path := request.URL.Path[len("/list/"):] // /list/fib.txt
file, err := os.Open(path)
if err != nil {
//panic(err)
//http.Error(writer,
// err.Error(),
//http.StatusInternalServerError)
return err
}
defer file.Close()
all, err := ioutil.ReadAll(file)
if err != nil {
//panic(err)
return err
}
writer.Write(all)
return nil
}
web.go
package main
import (
"net/http"
"os"
"errhandling/filelistingserver/filelisting"
"log"
)
type appHandler func(writer http.ResponseWriter,
request *http.Request) error
func errWrapper(
handler appHandler) func(
http.ResponseWriter,*http.Request) {
return func(writer http.ResponseWriter,
request *http.Request) {
err := handler(writer, request)
if err != nil {
log.Printf("Error handling request: %s",
err.Error())
code := http.StatusOK
switch {
case os.IsNotExist(err):
code = http.StatusNotFound
case os.IsPermission(err):
code = http.StatusForbidden
default:
code = http.StatusInternalServerError
}
// 错误都写在writer里
http.Error(writer,
http.StatusText(code),
code)
}
}
}
func main() {
//http.HandleFunc("/list/errhandling/filelistingserver/web.go",
http.HandleFunc("/",
errWrapper(filelisting.HandleFileList))
err := http.ListenAndServe(":8888", nil)
if err != nil {
panic(err)
}
}
go run web.go