Last middleware should use the request passed by preceding middleware. (#965)

This is useful when preceding middleware reads httpRequest.Body to
perform some logic, and assigns a new ReadCloser to httpRequest.Body
(as body can be read only once).
This commit is contained in:
Srinidhi Chokkadi Puranik
2018-04-30 13:13:24 -07:00
committed by Reed Allman
parent 1124c014ec
commit e0b82519aa
2 changed files with 22 additions and 1 deletions

View File

@@ -93,7 +93,7 @@ func (s *Server) runMiddleware(c *gin.Context, ms []fnext.Middleware) {
c.Abort() c.Abort()
return return
} }
c.Request = c.Request.WithContext(ctx) c.Request = r.WithContext(ctx)
c.Next() c.Next()
}) })

View File

@@ -1,6 +1,7 @@
package server package server
import ( import (
"bytes"
"context" "context"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
@@ -110,6 +111,14 @@ func TestRootMiddleware(t *testing.T) {
}) })
}) })
srv.AddRootMiddleware(&middleWareStruct{"middle"}) srv.AddRootMiddleware(&middleWareStruct{"middle"})
srv.AddRootMiddlewareFunc(func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
t.Log("body reader log")
bodyBytes, _ := ioutil.ReadAll(r.Body)
r.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
next.ServeHTTP(w, r)
})
})
for i, test := range []struct { for i, test := range []struct {
path string path string
@@ -146,4 +155,16 @@ func TestRootMiddleware(t *testing.T) {
t.Fatal(i, "middleware didn't work correctly", string(result)) t.Fatal(i, "middleware didn't work correctly", string(result))
} }
} }
req, err := http.NewRequest("POST", "http://127.0.0.1:8080/v1/apps", strings.NewReader("{\"app\": {\"name\": \"myapp3\"}}"))
if err != nil {
t.Fatalf("Test: Could not create create app request")
}
t.Log("TESTING: Create myapp3 when a middleware reads the body")
_, rec := routerRequest2(t, srv.Router, req)
res, _ := ioutil.ReadAll(rec.Result().Body)
if !strings.Contains(string(res), "myapp3") {
t.Fatal("Middleware did not pass the request correctly to route handler")
}
} }