return Default.Group(path) | return Default.Group(path) | ||||
} | } | ||||
// FileServer registers a handler to serve HTTP (GET|HEAD) requests | |||||
// with the contents of file system under the given directory. | |||||
func FileServer(prefix, dir string) { | |||||
Default.FileServer(prefix, dir) | |||||
} | |||||
// Use appends middleware module into the serving list, modules will be served in FIFO order. | // Use appends middleware module into the serving list, modules will be served in FIFO order. | ||||
func Use(module func(http.Handler) http.Handler) { | func Use(module func(http.Handler) http.Handler) { | ||||
Default.Use(module) | Default.Use(module) |
import ( | import ( | ||||
"fmt" | "fmt" | ||||
"log" | |||||
"net/http" | "net/http" | ||||
"path/filepath" | |||||
"reflect" | "reflect" | ||||
"runtime" | "runtime" | ||||
"time" | "time" | ||||
} | } | ||||
func New() *Server { | func New() *Server { | ||||
return &Server{ | |||||
self := &Server{ | |||||
middleware: new(middleware), | middleware: new(middleware), | ||||
mux: mux.NewRouter().StrictSlash(true), | mux: mux.NewRouter().StrictSlash(true), | ||||
} | } | ||||
return self | |||||
} | } | ||||
// build constructs all server/subservers along with their middleware modules chain. | // build constructs all server/subservers along with their middleware modules chain. | ||||
return name | return name | ||||
} | } | ||||
// FileServer registers a handler to serve HTTP (GET|HEAD) requests | |||||
// with the contents of file system under the given directory. | |||||
func (self *Server) FileServer(prefix, dir string) { | |||||
if abs, err := filepath.Abs(dir); err == nil { | |||||
fs := http.StripPrefix(prefix, http.FileServer(http.Dir(abs))) | |||||
self.mux.PathPrefix(prefix).Handler(fs) | |||||
} else { | |||||
log.Fatalf("Failed to setup file server: %v", err) | |||||
} | |||||
} | |||||
// Use add the middleware module into the stack chain. | // Use add the middleware module into the stack chain. | ||||
func (self *Server) Use(module func(http.Handler) http.Handler) { | func (self *Server) Use(module func(http.Handler) http.Handler) { | ||||
self.middleware.stack = append(self.middleware.stack, module) | self.middleware.stack = append(self.middleware.stack, module) |
"io" | "io" | ||||
"net/http" | "net/http" | ||||
"net/http/httptest" | "net/http/httptest" | ||||
"os" | |||||
"path" | |||||
"testing" | "testing" | ||||
. "github.com/smartystreets/goconvey/convey" | . "github.com/smartystreets/goconvey/convey" | ||||
}) | }) | ||||
} | } | ||||
func TestFileServer(t *testing.T) { | |||||
Convey("rex.FileServer", t, func() { | |||||
var ( | |||||
prefix = "/assets/" | |||||
filename = "logo.png" | |||||
) | |||||
tempdir := os.TempDir() | |||||
filepath := path.Join(tempdir, filename) | |||||
os.Create(filepath) | |||||
defer os.Remove(filepath) | |||||
app := New() | |||||
app.FileServer(prefix, tempdir) | |||||
request, _ := http.NewRequest("GET", path.Join(prefix, filename), nil) | |||||
response := httptest.NewRecorder() | |||||
app.ServeHTTP(response, request) | |||||
So(response.Code, ShouldEqual, http.StatusOK) | |||||
filename = "index.html" | |||||
request, _ = http.NewRequest("HEAD", prefix, nil) | |||||
response = httptest.NewRecorder() | |||||
app.ServeHTTP(response, request) | |||||
So(response.Code, ShouldEqual, http.StatusOK) | |||||
}) | |||||
} | |||||
func TestUse(t *testing.T) { | func TestUse(t *testing.T) { | ||||
app := New() | app := New() | ||||
app.Get("/", func(w http.ResponseWriter, r *http.Request) { | app.Get("/", func(w http.ResponseWriter, r *http.Request) { |