Skip to content

Commit a4f7241

Browse files
committed
yet another simplehttpserver
0 parents  commit a4f7241

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

simplehttpserver.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"flag"
6+
"fmt"
7+
"log"
8+
"net/http"
9+
"net/http/httputil"
10+
)
11+
12+
type Options struct {
13+
ListenAddress string
14+
Folder string
15+
Verbose bool
16+
}
17+
18+
var options Options
19+
20+
func main() {
21+
22+
flag.StringVar(&options.ListenAddress, "listen", "0.0.0.0:8000", "Address:Port")
23+
flag.StringVar(&options.Folder, "path", ".", "Folder")
24+
flag.BoolVar(&options.Verbose, "v", false, "Verbose")
25+
flag.Parse()
26+
27+
if flag.NArg() > 0 && options.Folder == "." {
28+
options.Folder = flag.Args()[0]
29+
}
30+
31+
log.Printf("Serving %s on http://%s/...", options.Folder, options.ListenAddress)
32+
fmt.Println(http.ListenAndServe(options.ListenAddress, Log(http.FileServer(http.Dir(options.Folder)))))
33+
}
34+
35+
func Log(handler http.Handler) http.Handler {
36+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
37+
fullRequest, _ := httputil.DumpRequest(r, true)
38+
lrw := NewLoggingResponseWriter(w)
39+
handler.ServeHTTP(lrw, r)
40+
41+
if options.Verbose {
42+
headers := new(bytes.Buffer)
43+
lrw.Header().Write(headers)
44+
log.Printf("\nRemote Address: %s\n%s\n%s %d %s\n%s\n%s\n", r.RemoteAddr, string(fullRequest), r.Proto, lrw.statusCode, http.StatusText(lrw.statusCode), headers.String(), string(lrw.Data))
45+
} else {
46+
log.Printf("%s \"%s %s %s\" %d %d", r.RemoteAddr, r.Method, r.URL, r.Proto, lrw.statusCode, len(lrw.Data))
47+
}
48+
})
49+
}
50+
51+
type loggingResponseWriter struct {
52+
http.ResponseWriter
53+
statusCode int
54+
Data []byte
55+
}
56+
57+
func NewLoggingResponseWriter(w http.ResponseWriter) *loggingResponseWriter {
58+
// WriteHeader(int) is not called if our response implicitly returns 200 OK, so
59+
// we default to that status code.
60+
return &loggingResponseWriter{w, http.StatusOK, []byte{}}
61+
}
62+
63+
func (lrw *loggingResponseWriter) Write(data []byte) (int, error) {
64+
lrw.Data = append(lrw.Data, data...)
65+
return lrw.ResponseWriter.Write(data)
66+
}
67+
68+
func (lrw *loggingResponseWriter) Header() http.Header {
69+
return lrw.ResponseWriter.Header()
70+
}
71+
72+
func (lrw *loggingResponseWriter) WriteHeader(code int) {
73+
lrw.statusCode = code
74+
lrw.ResponseWriter.WriteHeader(code)
75+
}

0 commit comments

Comments
 (0)