func CreateRuntimeReleaseFromRequest()

in lambda/appctx/appctxutil.go [59:96]


func CreateRuntimeReleaseFromRequest(request *http.Request, runtimeRelease string) string {
	lambdaRuntimeFeaturesHeader := request.Header.Get("Lambda-Runtime-Features")

	// "(", ")" are not valid token characters, and potentially could invalidate runtime_release
	lambdaRuntimeFeaturesHeader = strings.ReplaceAll(lambdaRuntimeFeaturesHeader, "(", "")
	lambdaRuntimeFeaturesHeader = strings.ReplaceAll(lambdaRuntimeFeaturesHeader, ")", "")

	numberOfAppendedFeatures := 0
	// Available length is a maximum length available for runtime features (including delimiters). From maximal runtime
	// release length we subtract what we already have plus 3 additional bytes for a space and a pair of brackets for
	// list of runtime features that is added later.
	runtimeReleaseLength := len(runtimeRelease)
	if runtimeReleaseLength == 0 {
		runtimeReleaseLength = len("Unknown")
	}
	availableLength := MaxRuntimeReleaseLength - runtimeReleaseLength - 3
	var lambdaRuntimeFeatures []string

	for _, feature := range strings.Fields(lambdaRuntimeFeaturesHeader) {
		featureLength := len(feature)
		// If featureLength <= availableLength - numberOfAppendedFeatures
		// (where numberOfAppendedFeatures is equal to number of delimiters needed).
		if featureLength <= availableLength-numberOfAppendedFeatures {
			availableLength -= featureLength
			lambdaRuntimeFeatures = append(lambdaRuntimeFeatures, feature)
			numberOfAppendedFeatures++
		}
	}
	// Append valid features to runtime release.
	if len(lambdaRuntimeFeatures) > 0 {
		if runtimeRelease == "" {
			runtimeRelease = "Unknown"
		}
		runtimeRelease += " (" + strings.Join(lambdaRuntimeFeatures, " ") + ")"
	}

	return runtimeRelease
}