// BindValidRequest binds a params object to a request but only when the request is valid // if the request is not valid an error will be returned func (c *Context) BindValidRequest(request *http.Request, route *MatchedRoute, binder RequestBinder) error { var res []error // check and validate content type, select consumer if httpkit.CanHaveBody(request.Method) { ct, _, err := httpkit.ContentType(request.Header) if err != nil { res = append(res, err) } else { if err := validateContentType(route.Consumes, ct); err != nil { res = append(res, err) } route.Consumer = route.Consumers[ct] } } // check and validate the response format if len(res) == 0 { if str := httputil.NegotiateContentType(request, route.Produces, ""); str == "" { res = append(res, errors.InvalidResponseFormat(request.Header.Get(httpkit.HeaderAccept), route.Produces)) } } // now bind the request with the provided binder // it's assumed the binder will also validate the request and return an error if the // request is invalid if binder != nil && len(res) == 0 { if err := binder.BindRequest(request, route); err != nil { res = append(res, err) } } if len(res) > 0 { return errors.CompositeValidationError(res...) } return nil }
func (v *validation) responseFormat() { if str := v.context.ResponseFormat(v.request, v.route.Produces); str == "" { v.result = append(v.result, errors.InvalidResponseFormat(v.request.Header.Get(httpkit.HeaderAccept), v.route.Produces)) } }