diff --git a/Context.go b/Context.go index 26e5942..c87e5cc 100644 --- a/Context.go +++ b/Context.go @@ -16,6 +16,7 @@ type Context interface { File(string) error Get(string) string Next() error + Redirect(int, string) error Request() Request Response() Response Status(int) Context @@ -94,6 +95,13 @@ func (ctx *ctx) Response() Response { return &ctx.response } +// Redirect sets the Location header and writes the headers with the given status code. +func (ctx *ctx) Redirect(code int, url string) error { + ctx.Response().SetHeader("Location", url) + ctx.Status(code) + return nil +} + // Status sets the HTTP status of the response. func (ctx *ctx) Status(status int) Context { ctx.response.WriteHeader(status) diff --git a/Server_test.go b/Server_test.go index 0d5b4b3..18d317f 100644 --- a/Server_test.go +++ b/Server_test.go @@ -60,6 +60,10 @@ func TestRouter(t *testing.T) { return ctx.Request().Context().Err() }) + s.Get("/redirect", func(ctx server.Context) error { + return ctx.Redirect(http.StatusTemporaryRedirect, "/") + }) + s.Get("/request/data", func(ctx server.Context) error { request := ctx.Request() method := request.Method() @@ -124,6 +128,7 @@ func TestRouter(t *testing.T) { {Method: "GET", URL: "/request/header", Body: "", Status: http.StatusOK, Response: ""}, {Method: "GET", URL: "/response/header", Body: "", Status: http.StatusOK, Response: "text/plain"}, {Method: "GET", URL: "/reader", Body: "", Status: http.StatusOK, Response: "Hello"}, + {Method: "GET", URL: "/redirect", Body: "", Status: http.StatusTemporaryRedirect, Response: ""}, {Method: "GET", URL: "/string", Body: "", Status: http.StatusOK, Response: "Hello"}, {Method: "GET", URL: "/scheme", Body: "", Status: http.StatusOK, Response: "http"}, {Method: "GET", URL: "/write", Body: "", Status: http.StatusOK, Response: "Hello"},