package api import ( "encoding/json" "net" "regexp" "strings" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" pkgAuditCommon "dev.azure.com/schwarzit/schwarzit.stackit-public/audit-go.git/pkg/audit/common" ) var objectTypeIdPattern = regexp.MustCompile(".*/(projects|folders|organizations)/([0-9a-fA-F-]{36})(?:/.*)?") // GetCalledServiceNameFromRequest extracts the called service name from subdomain name func GetCalledServiceNameFromRequest(request *pkgAuditCommon.ApiRequest, fallbackName string) string { if request == nil { return fallbackName } var calledServiceName = fallbackName host := request.Host ip := net.ParseIP(host) if ip == nil && !strings.Contains(host, "localhost") { dotIdx := strings.Index(host, ".") if dotIdx != -1 { calledServiceName = host[0:dotIdx] } } return calledServiceName } func GetObjectIdAndTypeFromUrlPath(path string) ( string, *pkgAuditCommon.ObjectType, error, ) { // Extract object id and type from request url objectTypeIdMatches := objectTypeIdPattern.FindStringSubmatch(path) if len(objectTypeIdMatches) > 0 { objectType := pkgAuditCommon.ObjectTypeFromPluralString(objectTypeIdMatches[1]) err := objectType.IsSupportedType() if err != nil { return "", nil, err } objectId := objectTypeIdMatches[2] return objectId, &objectType, nil } return "", nil, nil } // ResponseBodyToBytes converts a JSON or Protobuf response into a byte array func ResponseBodyToBytes(response any) ([]byte, error) { if response == nil { return nil, nil } responseBytes, isBytes := response.([]byte) if isBytes { return responseBytes, nil } responseProtoMessage, isProtoMessage := response.(proto.Message) if isProtoMessage { responseJson, err := protojson.Marshal(responseProtoMessage) if err != nil { return nil, err } return responseJson, nil } responseJson, err := json.Marshal(response) if err != nil { return nil, err } return responseJson, nil } func ToArrayMap(input map[string]string) map[string][]string { output := map[string][]string{} for key, value := range input { output[key] = []string{value} } return output }