@@ -2,6 +2,7 @@ package openapi3filter
2
2
3
3
import (
4
4
"bytes"
5
+ "context"
5
6
"io"
6
7
"log"
7
8
"net/http"
@@ -19,10 +20,10 @@ type Validator struct {
19
20
}
20
21
21
22
// ErrFunc handles errors that may occur during validation.
22
- type ErrFunc func (w http.ResponseWriter , status int , code ErrCode , err error )
23
+ type ErrFunc func (ctx context. Context , w http.ResponseWriter , status int , code ErrCode , err error )
23
24
24
25
// LogFunc handles log messages that may occur during validation.
25
- type LogFunc func (message string , err error )
26
+ type LogFunc func (ctx context. Context , message string , err error )
26
27
27
28
// ErrCode is used for classification of different types of errors that may
28
29
// occur during validation. These may be used to write an appropriate response
@@ -61,10 +62,10 @@ func (e ErrCode) responseText() string {
61
62
func NewValidator (router routers.Router , options ... ValidatorOption ) * Validator {
62
63
v := & Validator {
63
64
router : router ,
64
- errFunc : func (w http.ResponseWriter , status int , code ErrCode , _ error ) {
65
+ errFunc : func (_ context. Context , w http.ResponseWriter , status int , code ErrCode , _ error ) {
65
66
http .Error (w , code .responseText (), status )
66
67
},
67
- logFunc : func (message string , err error ) {
68
+ logFunc : func (_ context. Context , message string , err error ) {
68
69
log .Printf ("%s: %v" , message , err )
69
70
},
70
71
}
@@ -117,10 +118,11 @@ func ValidationOptions(options Options) ValidatorOption {
117
118
// request and response validation.
118
119
func (v * Validator ) Middleware (h http.Handler ) http.Handler {
119
120
return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
121
+ ctx := r .Context ()
120
122
route , pathParams , err := v .router .FindRoute (r )
121
123
if err != nil {
122
- v .logFunc ("validation error: failed to find route for " + r .URL .String (), err )
123
- v .errFunc (w , http .StatusNotFound , ErrCodeCannotFindRoute , err )
124
+ v .logFunc (ctx , "validation error: failed to find route for " + r .URL .String (), err )
125
+ v .errFunc (ctx , w , http .StatusNotFound , ErrCodeCannotFindRoute , err )
124
126
return
125
127
}
126
128
requestValidationInput := & RequestValidationInput {
@@ -129,9 +131,9 @@ func (v *Validator) Middleware(h http.Handler) http.Handler {
129
131
Route : route ,
130
132
Options : & v .options ,
131
133
}
132
- if err = ValidateRequest (r . Context () , requestValidationInput ); err != nil {
133
- v .logFunc ("invalid request" , err )
134
- v .errFunc (w , http .StatusBadRequest , ErrCodeRequestInvalid , err )
134
+ if err = ValidateRequest (ctx , requestValidationInput ); err != nil {
135
+ v .logFunc (ctx , "invalid request" , err )
136
+ v .errFunc (ctx , w , http .StatusBadRequest , ErrCodeRequestInvalid , err )
135
137
return
136
138
}
137
139
@@ -144,22 +146,22 @@ func (v *Validator) Middleware(h http.Handler) http.Handler {
144
146
145
147
h .ServeHTTP (wr , r )
146
148
147
- if err = ValidateResponse (r . Context () , & ResponseValidationInput {
149
+ if err = ValidateResponse (ctx , & ResponseValidationInput {
148
150
RequestValidationInput : requestValidationInput ,
149
151
Status : wr .statusCode (),
150
152
Header : wr .Header (),
151
153
Body : io .NopCloser (bytes .NewBuffer (wr .bodyContents ())),
152
154
Options : & v .options ,
153
155
}); err != nil {
154
- v .logFunc ("invalid response" , err )
156
+ v .logFunc (ctx , "invalid response" , err )
155
157
if v .strict {
156
- v .errFunc (w , http .StatusInternalServerError , ErrCodeResponseInvalid , err )
158
+ v .errFunc (ctx , w , http .StatusInternalServerError , ErrCodeResponseInvalid , err )
157
159
}
158
160
return
159
161
}
160
162
161
163
if err = wr .flushBodyContents (); err != nil {
162
- v .logFunc ("failed to write response" , err )
164
+ v .logFunc (ctx , "failed to write response" , err )
163
165
}
164
166
})
165
167
}
0 commit comments