Skip to content

Commit 9f1a6af

Browse files
authored
fix: Handle InvalidOperationException in StringsHelper.CleanUri() #2373 (#2374)
1 parent 4729dad commit 9f1a6af

File tree

5 files changed

+43
-11
lines changed

5 files changed

+43
-11
lines changed

src/Agent/NewRelic/Agent/Parsing/StringsHelper.cs

+12-5
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,18 @@ public static string CleanUri(Uri uri)
3030
if (!uri.IsAbsoluteUri)
3131
return CleanUri(uri.ToString());
3232

33-
return uri.GetComponents(
34-
UriComponents.Scheme |
35-
UriComponents.HostAndPort |
36-
UriComponents.Path,
37-
UriFormat.UriEscaped);
33+
try
34+
{
35+
return uri.GetComponents(
36+
UriComponents.Scheme |
37+
UriComponents.HostAndPort |
38+
UriComponents.Path,
39+
UriFormat.UriEscaped);
40+
}
41+
catch (InvalidOperationException) // can throw in .NET 6+ if the uri was created with UriCreationOptions.DangerousDisablePathAndQueryCanonicalization = true
42+
{
43+
return CleanUri(uri.ToString());
44+
}
3845
}
3946

4047
public static string FixDatabaseObjectName(string s)

tests/Agent/UnitTests/ParsingTests/ParsingTests.csproj

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
22
<PropertyGroup>
3-
<TargetFrameworks>net462</TargetFrameworks>
3+
<TargetFrameworks>net462;net8.0</TargetFrameworks>
44
<RootNamespace>ParsingTests</RootNamespace>
55
<AssemblyName>ParsingTests</AssemblyName>
6+
<TargetPlatformIdentifier>windows</TargetPlatformIdentifier>
67
<DebugType Condition="'$(TargetFramework)' != '' AND '$(TargetFramework)' != 'netcoreapp1.0'">Full</DebugType>
78
<RunSettingsFilePath>$(SolutionDir)test.runsettings</RunSettingsFilePath>
89
</PropertyGroup>
@@ -22,8 +23,9 @@
2223
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2324
</PackageReference>
2425
<PackageReference Include="JustMock" Version="2023.3.1122.188" />
26+
<PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
2527
</ItemGroup>
26-
<ItemGroup>
28+
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
2729
<Reference Include="System" />
2830
<Reference Include="System.Data" />
2931
<Reference Include="System.Data.OracleClient" />

tests/Agent/UnitTests/ParsingTests/SqlParserTests.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,7 @@ public void SqlParserTest_FixParameterizedSql_CorrectlyParsesParameters_Object_A
814814
});
815815
}
816816

817+
#if NETFRAMEWORK
817818
[TestCaseSource(nameof(BinaryTestDatas))]
818819
public void SqlParserTest_FixParameterizedSql_DoesNotParse_Binary(string originalSql, string expectedSql, string sqlParameterName, object sqlParameterValue)
819820
{
@@ -834,6 +835,7 @@ public void SqlParserTest_FixParameterizedSql_DoesNotParse_Binary(string origina
834835
Assert.That(shouldGeneratePlan, Is.False, "FixParameterizedSql should return false if it is not parsing a statement");
835836
});
836837
}
838+
#endif
837839

838840
[TestCaseSource(nameof(CustomObjectTestDatas))]
839841
public void SqlParserTest_FixParameterizedSql_DoesNotParse_CustomObject(string originalSql, string expectedSql, string sqlParameterName, object sqlParameterValue)
@@ -856,6 +858,7 @@ public void SqlParserTest_FixParameterizedSql_DoesNotParse_CustomObject(string o
856858
});
857859
}
858860

861+
#if NETFRAMEWORK
859862
public static IEnumerable<TestCaseData> BinaryTestDatas
860863
{
861864
get
@@ -874,6 +877,7 @@ public static IEnumerable<TestCaseData> BinaryTestDatas
874877
ObjectToByteArray(new List<bool> { true, false }));
875878
}
876879
}
880+
#endif
877881

878882
public static IEnumerable<TestCaseData> CustomObjectTestDatas
879883
{
@@ -911,7 +915,7 @@ private string RandomString(int size)
911915
}
912916
return new string(buffer);
913917
}
914-
918+
#if NETFRAMEWORK
915919
private static byte[] ObjectToByteArray(object obj)
916920
{
917921
using (var ms = new MemoryStream())
@@ -921,5 +925,6 @@ private static byte[] ObjectToByteArray(object obj)
921925
return ms.ToArray();
922926
}
923927
}
928+
#endif
924929
}
925930
}

tests/Agent/UnitTests/ParsingTests/SqlWrapperHelperTests.cs

+6-3
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33

44
using System;
55
using System.Data;
6+
#if NETFRAMEWORK
67
using System.Data.OleDb;
78
using System.Data.OracleClient;
9+
#endif
810
using System.Data.SqlClient;
911
using NewRelic.Agent.Extensions.Providers.Wrapper;
1012
using NewRelic.Parsing;
@@ -17,6 +19,7 @@ public class SqlWrapperHelperTests
1719
{
1820
#region GetVendorName
1921

22+
#if NETFRAMEWORK
2023
[Test]
2124
[TestCase("SQL Server", ExpectedResult = DatastoreVendor.MSSQL)]
2225
[TestCase("MySql", ExpectedResult = DatastoreVendor.MySQL)]
@@ -33,7 +36,7 @@ public DatastoreVendor GetVendorName_ReturnsCorrectHost_IfOleDbConnectionProvide
3336

3437
return SqlWrapperHelper.GetVendorName(command);
3538
}
36-
39+
#endif
3740
[Test]
3841
[TestCase("SqlCommand", ExpectedResult = DatastoreVendor.MSSQL)]
3942
[TestCase("MySqlCommand", ExpectedResult = DatastoreVendor.MySQL)]
@@ -56,7 +59,7 @@ public void GetVendorName_ReturnsSqlServer_IfTypeNameIsNotProvidedAndCommandIsSq
5659

5760
Assert.That(datastoreName, Is.EqualTo(DatastoreVendor.MSSQL));
5861
}
59-
62+
#if NETFRAMEWORK
6063
[Test]
6164
public void GetVendorName_ReturnsOracle_IfTypeNameIsNotProvidedAndCommandIsOracleCommand()
6265
{
@@ -68,7 +71,7 @@ public void GetVendorName_ReturnsOracle_IfTypeNameIsNotProvidedAndCommandIsOracl
6871

6972
Assert.That(datastoreName, Is.EqualTo(DatastoreVendor.Oracle));
7073
}
71-
74+
#endif
7275
[Test]
7376
public void GetVendorName_ReturnsUnknown_IfCommandIsOfUnknownType()
7477
{

tests/Agent/UnitTests/ParsingTests/StringsHelperTest.cs

+15
Original file line numberDiff line numberDiff line change
@@ -133,5 +133,20 @@ public void validate_CleanUri_String_Version(string uri, string expected)
133133
var actual = StringsHelper.CleanUri(uri);
134134
Assert.That(actual, Is.EqualTo(expected));
135135
}
136+
137+
#if NET6_0_OR_GREATER
138+
[Test]
139+
public void validate_CleanUri_handles_invalidoperationexception()
140+
{
141+
var options = new UriCreationOptions
142+
{
143+
DangerousDisablePathAndQueryCanonicalization = true // only avaialable in .NET 6+
144+
};
145+
var uri = new Uri("http://www.example.com:8080/dir/?query=test", options);
146+
147+
var actual = StringsHelper.CleanUri(uri);
148+
Assert.That(actual, Is.EqualTo("http://www.example.com:8080/dir/"));
149+
}
150+
#endif
136151
}
137152
}

0 commit comments

Comments
 (0)