@@ -14,6 +14,7 @@ type Server struct {
1414 ctx context.Context
1515 e endpoint.Endpoint
1616 before []RequestFunc
17+ after []ResponseFunc
1718 dec DecodeRequestFunc
1819 logger log.Logger
1920}
@@ -44,28 +45,38 @@ func ServerBefore(before ...RequestFunc) ServerOption {
4445 return func (s * Server ) { s .before = before }
4546}
4647
48+ // ServerAfter functions are executed on the HTTP response writer after the
49+ // endpoint is invoked, but before anything is written to the client.
50+ func ServerAfter (after ... ResponseFunc ) ServerOption {
51+ return func (s * Server ) { s .after = append (s .after , after ... ) }
52+ }
53+
4754func (s Server ) ServeHTTP (w http.ResponseWriter , r * http.Request ) {
4855 ctx := s .ctx
4956
5057 for _ , f := range s .before {
5158 ctx = f (ctx , r )
5259 }
5360
54- req , err := s .dec (ctx , r )
61+ request , err := s .dec (ctx , r )
5562 if err != nil {
5663 s .logger .Log ("err" , err )
5764 s .errorEncoder (ctx , err , w )
5865 return
5966 }
6067
61- p , err := s .e (ctx , req )
68+ response , err := s .e (ctx , request )
6269 if err != nil {
6370 s .logger .Log ("err" , err )
6471 s .errorEncoder (ctx , err , w )
6572 return
6673 }
6774
68- s .encodeResponse (ctx , w , graphql .Do (p .(graphql.Params )))
75+ for _ , f := range s .after {
76+ ctx = f (ctx , w )
77+ }
78+
79+ s .encodeResponse (ctx , w , graphql .Do (response .(graphql.Params )))
6980}
7081
7182func (s Server ) errorEncoder (_ context.Context , err error , w http.ResponseWriter ) {
0 commit comments