浏览代码

Merge branch 'redirect' of https://github.com/alexandernyquist/gin into develop

Manu Mtz-Almeida 11 年之前
父节点
当前提交
ceec1b6443
共有 3 个文件被更改,包括 33 次插入4 次删除
  1. 11 1
      README.md
  2. 9 0
      context.go
  3. 13 3
      render/render.go

+ 11 - 1
README.md

@@ -251,7 +251,7 @@ func main() {
 }
 ```
 
-#### XML, and JSON rendering
+#### XML and JSON rendering
 
 ```go
 func main() {
@@ -320,6 +320,16 @@ func main() {
 }
 ```
 
+#### Redirects
+
+Issuing a HTTP redirect is easy:
+
+```r.GET("/test", func(c *gin.Context) {
+	c.Redirect(301, "http://www.google.com/")
+})
+
+Both internal and external locations are supported.
+```
 
 #### Custom Middlewares
 

+ 9 - 0
context.go

@@ -247,6 +247,15 @@ func (c *Context) String(code int, format string, values ...interface{}) {
 	c.Render(code, render.Plain, format, values)
 }
 
+// Returns a HTTP redirect to the specific location.
+func (c *Context) Redirect(code int, location string) {
+	if code >= 300 && code <= 308 {
+		c.Render(code, render.Redirect, location)
+	} else {
+		panic(fmt.Sprintf("Cannot send a redirect with status code %d", code))
+	}
+}
+
 // Writes some data into the body stream and updates the HTTP code.
 func (c *Context) Data(code int, contentType string, data []byte) {
 	if len(contentType) > 0 {

+ 13 - 3
render/render.go

@@ -22,6 +22,9 @@ type (
 	// Plain text
 	plainRender struct{}
 
+	// Redirects
+	redirectRender struct{}
+
 	// form binding
 	HTMLRender struct {
 		Template *template.Template
@@ -29,9 +32,10 @@ type (
 )
 
 var (
-	JSON  = jsonRender{}
-	XML   = xmlRender{}
-	Plain = plainRender{}
+	JSON     = jsonRender{}
+	XML      = xmlRender{}
+	Plain    = plainRender{}
+	Redirect = redirectRender{}
 )
 
 func writeHeader(w http.ResponseWriter, code int, contentType string) {
@@ -45,6 +49,12 @@ func (_ jsonRender) Render(w http.ResponseWriter, code int, data ...interface{})
 	return encoder.Encode(data[0])
 }
 
+func (_ redirectRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
+	w.Header().Set("Location", data[0].(string))
+	w.WriteHeader(code)
+	return nil
+}
+
 func (_ xmlRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
 	writeHeader(w, code, "application/xml")
 	encoder := xml.NewEncoder(w)