package fetcher import ( "encoding/base64" "fmt" "net/http" "net/url" "strings" ) type AuthenticationConfiguration struct { AuthenticationType string AuthenticationValue string } func ApplyAuthentication(request *http.Request, authenticationConfig AuthenticationConfiguration) error { switch authenticationConfig.AuthenticationType { case "bearer": request.Header.Set("Authorization", "Bearer "+authenticationConfig.AuthenticationValue) case "basic": encodedCredentials := base64.StdEncoding.EncodeToString([]byte(authenticationConfig.AuthenticationValue)) request.Header.Set("Authorization", "Basic "+encodedCredentials) case "query_param": parts := strings.SplitN(authenticationConfig.AuthenticationValue, "=", 2) if len(parts) != 2 { return fmt.Errorf("query_param credential must be in format 'param_name=value', got: %s", authenticationConfig.AuthenticationValue) } existingURL, parseError := url.Parse(request.URL.String()) if parseError != nil { return fmt.Errorf("failed to parse request URL for query param authentication: %w", parseError) } queryParameters := existingURL.Query() queryParameters.Set(parts[0], parts[1]) existingURL.RawQuery = queryParameters.Encode() request.URL = existingURL case "": return nil default: return fmt.Errorf("unsupported authentication type: %s", authenticationConfig.AuthenticationType) } return nil }