in api/internal/filter/schema.go [178:242]
func SchemaCheck() gin.HandlerFunc {
return func(c *gin.Context) {
pathPrefix := "/apisix/admin/"
resource := strings.TrimPrefix(c.Request.URL.Path, pathPrefix)
idx := strings.LastIndex(resource, "/")
if idx > 1 {
resource = resource[:idx]
}
method := strings.ToUpper(c.Request.Method)
if method != "PUT" && method != "POST" {
c.Next()
return
}
schemaKey, ok := resources[resource]
if !ok {
c.Next()
return
}
reqBody, err := c.GetRawData()
if err != nil {
log.Errorf("read request body failed: %s", err)
c.AbortWithStatusJSON(http.StatusBadRequest, consts.ErrInvalidRequest)
return
}
// set default value
reqBody, err = handleDefaultValue(resource, reqBody)
if err != nil {
errMsg := err.Error()
c.AbortWithStatusJSON(http.StatusBadRequest, consts.InvalidParam(errMsg))
log.Error(errMsg)
return
}
// other filter need it
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(reqBody))
validator, err := store.NewAPISIXSchemaValidator("main." + schemaKey)
if err != nil {
errMsg := err.Error()
c.AbortWithStatusJSON(http.StatusBadRequest, consts.InvalidParam(errMsg))
log.Error(errMsg)
return
}
reqBody, err = handleSpecialField(resource, reqBody)
if err != nil {
errMsg := err.Error()
c.AbortWithStatusJSON(http.StatusBadRequest, consts.InvalidParam(errMsg))
log.Error(errMsg)
return
}
if err := validator.Validate(reqBody); err != nil {
errMsg := err.Error()
c.AbortWithStatusJSON(http.StatusBadRequest, consts.InvalidParam(errMsg))
log.Warn(errMsg)
return
}
c.Next()
}
}