| @@ -56,6 +56,12 @@ func Group(path string) *Server { | |||
| 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. | |||
| func Use(module func(http.Handler) http.Handler) { | |||
| Default.Use(module) | |||
| @@ -2,7 +2,9 @@ package rex | |||
| import ( | |||
| "fmt" | |||
| "log" | |||
| "net/http" | |||
| "path/filepath" | |||
| "reflect" | |||
| "runtime" | |||
| "time" | |||
| @@ -18,10 +20,11 @@ type Server struct { | |||
| } | |||
| func New() *Server { | |||
| return &Server{ | |||
| self := &Server{ | |||
| middleware: new(middleware), | |||
| mux: mux.NewRouter().StrictSlash(true), | |||
| } | |||
| return self | |||
| } | |||
| // build constructs all server/subservers along with their middleware modules chain. | |||
| @@ -123,6 +126,17 @@ func (self *Server) Name(r *http.Request) (name string) { | |||
| 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. | |||
| func (self *Server) Use(module func(http.Handler) http.Handler) { | |||
| self.middleware.stack = append(self.middleware.stack, module) | |||
| @@ -4,6 +4,8 @@ import ( | |||
| "io" | |||
| "net/http" | |||
| "net/http/httptest" | |||
| "os" | |||
| "path" | |||
| "testing" | |||
| . "github.com/smartystreets/goconvey/convey" | |||
| @@ -152,6 +154,33 @@ func TestGroup(t *testing.T) { | |||
| }) | |||
| } | |||
| 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) { | |||
| app := New() | |||
| app.Get("/", func(w http.ResponseWriter, r *http.Request) { | |||