func handleSpecialField()

in api/internal/filter/schema.go [110:157]


func handleSpecialField(resource string, reqBody []byte) ([]byte, error) {
	var bodyMap map[string]interface{}
	err := json.Unmarshal(reqBody, &bodyMap)
	if err != nil {
		return reqBody, fmt.Errorf("read request body failed: %s", err)
	}
	if _, ok := bodyMap["create_time"]; ok {
		return reqBody, errors.New("we don't accept create_time from client")
	}
	if _, ok := bodyMap["update_time"]; ok {
		return reqBody, errors.New("we don't accept update_time from client")
	}

	// remove script, because it's a map, and need to be parsed into lua code
	if resource == "routes" {
		var route map[string]interface{}
		err := json.Unmarshal(reqBody, &route)
		if err != nil {
			return nil, fmt.Errorf("read request body failed: %s", err)
		}
		if _, ok := route["script"]; ok {
			delete(route, "script")
			reqBody, err = json.Marshal(route)
			if err != nil {
				return nil, fmt.Errorf("read request body failed: %s", err)
			}
		}
	}

	// SSL does not need to pass sni, we need to parse the SSL to get sni
	if resource == "ssl" {
		var ssl map[string]interface{}
		err := json.Unmarshal(reqBody, &ssl)
		if err != nil {
			return nil, fmt.Errorf("read request body failed: %s", err)
		}
		ssl["snis"], err = parseCert(ssl["cert"].(string), ssl["key"].(string))
		if err != nil {
			return nil, fmt.Errorf("SSL parse failed: %s", err)
		}
		reqBody, err = json.Marshal(ssl)
		if err != nil {
			return nil, fmt.Errorf("read request body failed: %s", err)
		}
	}

	return reqBody, nil
}