From 8604340a0e161247a7684aca4fdf2454b63a5592 Mon Sep 17 00:00:00 2001 From: Aristarkh Zagorodnikov Date: Sun, 10 Feb 2019 23:49:22 +0300 Subject: [PATCH] Improve path/uri handling (#82) * Improve file path special characters handling * More specific tests * Optimize EnhancedStackTrace.TryGetFullPath to prevent exceptions being thrown and the immediately re-caught --- src/Ben.Demystifier/EnhancedStackTrace.cs | 12 ++---------- .../EnhancedStackTraceTests.cs | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/Ben.Demystifier/EnhancedStackTrace.cs b/src/Ben.Demystifier/EnhancedStackTrace.cs index d93b014..02c063a 100644 --- a/src/Ben.Demystifier/EnhancedStackTrace.cs +++ b/src/Ben.Demystifier/EnhancedStackTrace.cs @@ -129,18 +129,10 @@ namespace System.Diagnostics /// public static string TryGetFullPath(string filePath) { - try + if (Uri.TryCreate(filePath, UriKind.Absolute, out var uri) && uri.IsFile) { - var uri = new Uri(filePath); - if (uri.IsFile) - { - return uri.AbsolutePath; - } - - return uri.ToString(); + return Uri.UnescapeDataString(uri.AbsolutePath); } - catch (ArgumentException) { } - catch (UriFormatException) { } return filePath; } diff --git a/test/Ben.Demystifier.Test/EnhancedStackTraceTests.cs b/test/Ben.Demystifier.Test/EnhancedStackTraceTests.cs index a045af2..b03675d 100644 --- a/test/Ben.Demystifier.Test/EnhancedStackTraceTests.cs +++ b/test/Ben.Demystifier.Test/EnhancedStackTraceTests.cs @@ -21,6 +21,21 @@ namespace Ben.Demystifier.Test Assert.Equal(expected, NormalizePath(converted)); } + [Theory] + [InlineData(@"file://Sources\My 100%.Done+Solution\Foo`1.cs", @"/My 100%.Done+Solution/Foo`1.cs", false)] + [InlineData(@"d:\Public Files+50%.Done\Src\Foo`1.cs", @"d:/Public Files+50%.Done/Src/Foo`1.cs", false)] + [InlineData(@"\.\Public Files+50%.Done\Src\Foo`1.cs", @"/./Public Files+50%.Done/Src/Foo`1.cs", true)] + public void SpecialPathCharactersAreHandledCorrectly(string original, string expected, bool normalize) + { + var converted = EnhancedStackTrace.TryGetFullPath(original); + if (normalize) + { + converted = NormalizePath(converted); + } + + Assert.Equal(expected, converted); + } + // Used in tests to avoid platform-specific issues. private static string NormalizePath(string path) => path.Replace("\\", "/");