func()

in router/core/header_rule_engine.go [362:465]


func (h *HeaderPropagation) applyRequestRule(ctx RequestContext, request *http.Request, rule *config.RequestHeaderRule) {
	if rule.Operation == config.HeaderRuleOperationSet {
		if rule.ValueFrom != nil && rule.ValueFrom.ContextField != "" {
			val := getCustomDynamicAttributeValue(rule.ValueFrom, getRequestContext(request.Context()), nil)
			value := fmt.Sprintf("%v", val)
			if value != "" {
				request.Header.Set(rule.Name, value)
			}
			return
		}

		request.Header.Set(rule.Name, rule.Value)
		return
	}

	if rule.Operation != config.HeaderRuleOperationPropagate {
		return
	}

	/**
	 *	Rename the header before propagating and delete the original
	 */

	if rule.Rename != "" && rule.Named != "" {
		// Ignore the rule when the target header is in the ignored list
		if slices.Contains(ignoredHeaders, rule.Rename) {
			return
		}

		value := ctx.Request().Header.Get(rule.Named)
		if value != "" {
			request.Header.Set(rule.Rename, ctx.Request().Header.Get(rule.Named))
			request.Header.Del(rule.Named)
			return
		} else if rule.Default != "" {
			request.Header.Set(rule.Rename, rule.Default)
			request.Header.Del(rule.Named)
			return
		}

		return
	}

	/**
	 *	Propagate the header as is
	 */

	if rule.Named != "" {
		if slices.Contains(ignoredHeaders, rule.Named) {
			return
		}

		values := ctx.Request().Header.Values(rule.Named)
		if len(values) > 0 {
			request.Header[http.CanonicalHeaderKey(rule.Named)] = values
		} else if rule.Default != "" {
			request.Header.Set(rule.Named, rule.Default)
		}

		return
	}

	/**
	 * Matching based on regex
	 */

	if regex, ok := h.regex[rule.Matching]; ok {
		for name := range ctx.Request().Header {
			// Headers are case-insensitive, but Go canonicalize them
			// Issue: https://github.com/golang/go/issues/37834
			if regex.MatchString(name) {

				/**
				 *	Rename the header before propagating and delete the original
				 */
				if rule.Rename != "" && rule.Named == "" {

					if slices.Contains(ignoredHeaders, rule.Rename) {
						continue
					}

					value := ctx.Request().Header.Get(name)
					if value != "" {
						request.Header.Set(rule.Rename, ctx.Request().Header.Get(name))
						request.Header.Del(name)
					} else if rule.Default != "" {
						request.Header.Set(rule.Rename, rule.Default)
						request.Header.Del(name)
					}

					continue
				}

				/**
				 *	Propagate the header as is
				 */
				if slices.Contains(ignoredHeaders, name) {
					continue
				}
				request.Header.Set(name, ctx.Request().Header.Get(name))
			}
		}
	}
}