72
|
1 // Taken from https://github.com/fogleman/serve and repurposed as a library
|
|
2 package aya
|
|
3
|
|
4 import (
|
|
5 "fmt"
|
|
6 "log"
|
|
7 "net/http"
|
|
8 )
|
|
9
|
|
10 // ResponseWriter wraps http.ResponseWriter to capture the HTTP status code
|
|
11 type ResponseWriter struct {
|
|
12 http.ResponseWriter
|
|
13 StatusCode int
|
|
14 }
|
|
15
|
|
16 func (w *ResponseWriter) WriteHeader(statusCode int) {
|
|
17 w.StatusCode = statusCode
|
|
18 w.ResponseWriter.WriteHeader(statusCode)
|
|
19 }
|
|
20
|
|
21 // Handler wraps http.Handler to log served files
|
|
22 type Handler struct {
|
|
23 http.Handler
|
|
24 }
|
|
25
|
|
26 func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
27 rw := &ResponseWriter{w, 0}
|
|
28 h.Handler.ServeHTTP(rw, r)
|
|
29 log.Println(r.RemoteAddr, r.Method, rw.StatusCode, r.URL)
|
|
30 }
|
|
31
|
77
|
32 // This function is called by the `aya serve` subcommand
|
|
33 func HttpServe(Dir string, Port int) {
|
72
|
34 handler := &Handler{http.FileServer(http.Dir(Dir))}
|
|
35 http.Handle("/", handler)
|
77
|
36 addr := fmt.Sprintf(":%d", Port)
|
72
|
37 log.Printf("Listening on %s\n", addr)
|
|
38 log.Fatal(http.ListenAndServe(addr, nil))
|
|
39 }
|