()
| 48 | } |
| 49 | |
| 50 | func OperationResolveMeta() gin.HandlerFunc { |
| 51 | return func(c *gin.Context) { |
| 52 | if c.GetHeader(headerNeedOperationResolve) != "1" { |
| 53 | c.Next() |
| 54 | return |
| 55 | } |
| 56 | |
| 57 | metaMap, err := loadOperationMeta() |
| 58 | if err != nil { |
| 59 | c.Next() |
| 60 | return |
| 61 | } |
| 62 | reqPath := strings.TrimPrefix(c.Request.URL.Path, "/api/v2") |
| 63 | meta, ok := metaMap[reqPath] |
| 64 | if !ok || len(meta.BeforeFunctions) == 0 { |
| 65 | c.Next() |
| 66 | return |
| 67 | } |
| 68 | |
| 69 | values := make(map[string]interface{}) |
| 70 | if len(meta.BodyKeys) > 0 { |
| 71 | body, err := io.ReadAll(c.Request.Body) |
| 72 | if err == nil { |
| 73 | c.Request.Body = io.NopCloser(bytes.NewBuffer(body)) |
| 74 | bodyMap := make(map[string]interface{}) |
| 75 | if strings.Contains(c.Request.Header.Get("Content-Type"), "multipart/form-data") { |
| 76 | bodyMap, _ = parseMultipart(body, c.Request.Header.Get("Content-Type")) |
| 77 | } else { |
| 78 | decoder := json.NewDecoder(bytes.NewReader(body)) |
| 79 | decoder.UseNumber() |
| 80 | _ = decoder.Decode(&bodyMap) |
| 81 | } |
| 82 | for _, key := range meta.BodyKeys { |
| 83 | if value, ok := bodyMap[key]; ok { |
| 84 | values[key] = value |
| 85 | } |
| 86 | } |
| 87 | } |
| 88 | } |
| 89 | |
| 90 | resolved, err := resolveOperationValues(reqPath, values, meta.BeforeFunctions) |
| 91 | if err == nil && len(resolved) > 0 { |
| 92 | if data, err := json.Marshal(resolved); err == nil { |
| 93 | c.Header(headerOperationResolved, base64.RawURLEncoding.EncodeToString(data)) |
| 94 | } |
| 95 | } |
| 96 | c.Next() |
| 97 | } |
| 98 | } |
| 99 | |
| 100 | func loadOperationMeta() (map[string]operationMeta, error) { |
| 101 | logMetaOnce.Do(func() { |
nothing calls this directly
no test coverage detected