From 088fb135631ad5a7df289451c87d7e14f284d4dd Mon Sep 17 00:00:00 2001 From: JoannaaKL Date: Mon, 30 Oct 2023 10:51:38 +0000 Subject: [PATCH] Add StringEscapingUtil that will be used in many places --- src/Runner.Common/Util/StringEscapingUtil.cs | 47 ++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/Runner.Common/Util/StringEscapingUtil.cs diff --git a/src/Runner.Common/Util/StringEscapingUtil.cs b/src/Runner.Common/Util/StringEscapingUtil.cs new file mode 100644 index 000000000..c49aa2513 --- /dev/null +++ b/src/Runner.Common/Util/StringEscapingUtil.cs @@ -0,0 +1,47 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using GitHub.Runner.Sdk; +using GitHub.Runner.Common; + +namespace GitHub.Runner.Common.Util +{ + public static class StrigEscapingUtil + { + + private static readonly EscapeMapping[] _escapeDataMappings = new[] + { + new EscapeMapping(token: "\r", replacement: "%0D"), + new EscapeMapping(token: "\n", replacement: "%0A"), + new EscapeMapping(token: "%", replacement: "%25"), + }; + public static string UnescapeData(string escaped) + { + if (string.IsNullOrEmpty(escaped)) + { + return string.Empty; + } + + string unescaped = escaped; + foreach (EscapeMapping mapping in _escapeDataMappings) + { + unescaped = unescaped.Replace(mapping.Replacement, mapping.Token); + } + + return unescaped; + } + private sealed class EscapeMapping + { + public string Replacement { get; } + public string Token { get; } + + public EscapeMapping(string token, string replacement) + { + ArgUtil.NotNullOrEmpty(token, nameof(token)); + ArgUtil.NotNullOrEmpty(replacement, nameof(replacement)); + Token = token; + Replacement = replacement; + } + } + } +}