Skip to content

Commit 6e801d1

Browse files
paulomorgadoPaulo Morgado
authored andcommitted
Avoid generating unnecessary strings for comparison.
1 parent 9fb86ca commit 6e801d1

24 files changed

+382
-267
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Root Type="DevExpress.CodeRush.Foundation.CodePlaces.Options.FavoritesListContainer">
3+
<Options Language="Neutral">
4+
<Groups />
5+
</Options>
6+
</Root>

src/SIPSorcery.csproj

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,26 @@
2020
<PackageReference Include="Concentus" Version="2.2.2" />
2121
<PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
2222
<PackageReference Include="DnsClient" Version="1.8.0" />
23+
<PackageReference Include="Roslynator.Analyzers" Version="4.13.1">
24+
<PrivateAssets>all</PrivateAssets>
25+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
26+
</PackageReference>
27+
<PackageReference Include="Roslynator.CodeFixes" Version="4.13.1">
28+
<PrivateAssets>all</PrivateAssets>
29+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
30+
</PackageReference>
31+
<PackageReference Include="Roslynator.Refactorings" Version="4.13.1">
32+
<PrivateAssets>all</PrivateAssets>
33+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
34+
</PackageReference>
2335
<PackageReference Include="SIPSorcery.WebSocketSharp" Version="0.0.1" />
2436
<PackageReference Include="SIPSorceryMedia.Abstractions" Version="8.0.10" />
2537
<PackageReference Include="System.Net.Security" Version="4.3.2" />
2638
<PackageReference Include="System.Net.WebSockets.Client" Version="4.3.2" />
2739
</ItemGroup>
2840

2941
<PropertyGroup>
30-
<TargetFrameworks>netstandard2.0;netstandard2.1;netcoreapp3.1;net462;net5.0;net6.0;net8.0</TargetFrameworks>
42+
<TargetFrameworks>netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0;net6.0;net8.0</TargetFrameworks>
3143
<LangVersion>10.0</LangVersion>
3244
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
3345
<NoWarn>$(NoWarn);SYSLIB0050</NoWarn>

src/core/SIP/SIPConstants.cs

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -616,43 +616,69 @@ public static class SIPExtensionHeaders
616616
/// <returns>A list of extensions that were understood and a boolean indicating whether any unknown extensions were present.</returns>
617617
public static List<SIPExtensions> ParseSIPExtensions(string extensionList, out string unknownExtensions)
618618
{
619-
List<SIPExtensions> knownExtensions = new List<SIPExtensions>();
620-
unknownExtensions = null;
619+
List<SIPExtensions> knownExtensions = new();
620+
StringBuilder unknownBuilder = null;
621621

622-
if (String.IsNullOrEmpty(extensionList) == false)
622+
if (string.IsNullOrWhiteSpace(extensionList))
623623
{
624-
string[] extensions = extensionList.Trim().Split(',');
624+
unknownExtensions = null;
625+
return knownExtensions;
626+
}
627+
628+
ReadOnlySpan<char> remaining = extensionList.AsSpan();
629+
while (true)
630+
{
631+
int commaIndex = remaining.IndexOf(',');
632+
ReadOnlySpan<char> extension = commaIndex == -1 ? remaining.Trim() : remaining.Slice(0, commaIndex).Trim();
625633

626-
foreach (string extension in extensions)
634+
if (!extension.IsEmpty)
627635
{
628-
if (String.IsNullOrEmpty(extension) == false)
636+
SIPExtensions? parsedExtension = null;
637+
if (extension.Equals(PRACK.AsSpan(), StringComparison.OrdinalIgnoreCase))
638+
{
639+
parsedExtension = SIPExtensions.Prack;
640+
}
641+
else if (extension.Equals(NO_REFER_SUB.AsSpan(), StringComparison.OrdinalIgnoreCase))
642+
{
643+
parsedExtension = SIPExtensions.NoReferSub;
644+
}
645+
else if (extension.Equals(REPLACES.AsSpan(), StringComparison.OrdinalIgnoreCase))
646+
{
647+
parsedExtension = SIPExtensions.Replaces;
648+
}
649+
else if (extension.Equals(SIPREC.AsSpan(), StringComparison.OrdinalIgnoreCase))
650+
{
651+
parsedExtension = SIPExtensions.SipRec;
652+
}
653+
else if (extension.Equals(MULTIPLE_REFER.AsSpan(), StringComparison.OrdinalIgnoreCase))
654+
{
655+
parsedExtension = SIPExtensions.MultipleRefer;
656+
}
657+
658+
if (parsedExtension.HasValue)
659+
{
660+
knownExtensions.Add(parsedExtension.GetValueOrDefault());
661+
}
662+
else
629663
{
630-
string trimmedExtension = extension.Trim().ToLower();
631-
switch (trimmedExtension)
664+
unknownBuilder ??= new StringBuilder();
665+
if (unknownBuilder.Length > 0)
632666
{
633-
case PRACK:
634-
knownExtensions.Add(SIPExtensions.Prack);
635-
break;
636-
case NO_REFER_SUB:
637-
knownExtensions.Add(SIPExtensions.NoReferSub);
638-
break;
639-
case REPLACES:
640-
knownExtensions.Add(SIPExtensions.Replaces);
641-
break;
642-
case SIPREC:
643-
knownExtensions.Add(SIPExtensions.SipRec);
644-
break;
645-
case MULTIPLE_REFER:
646-
knownExtensions.Add(SIPExtensions.MultipleRefer);
647-
break;
648-
default:
649-
unknownExtensions += (unknownExtensions != null) ? $",{extension.Trim()}" : extension.Trim();
650-
break;
667+
unknownBuilder.Append(',');
651668
}
669+
unknownBuilder.Append(extension);
652670
}
653671
}
672+
673+
if (commaIndex == -1)
674+
{
675+
break;
676+
}
677+
678+
remaining = remaining.Slice(commaIndex + 1);
654679
}
655680

681+
unknownExtensions = unknownBuilder?.ToString();
656682
return knownExtensions;
657683
}
658684
}

src/core/SIP/SIPEndPoint.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,11 @@ public static SIPEndPoint ParseSIPEndPoint(string sipEndPointStr)
137137
return null;
138138
}
139139

140-
if (sipEndPointStr.ToLower().StartsWith("udp:") ||
141-
sipEndPointStr.ToLower().StartsWith("tcp:") ||
142-
sipEndPointStr.ToLower().StartsWith("tls:") ||
143-
sipEndPointStr.ToLower().StartsWith("ws:") ||
144-
sipEndPointStr.ToLower().StartsWith("wss:"))
140+
if (sipEndPointStr.StartsWith("udp:", StringComparison.OrdinalIgnoreCase) ||
141+
sipEndPointStr.StartsWith("tcp:", StringComparison.OrdinalIgnoreCase) ||
142+
sipEndPointStr.StartsWith("tls:", StringComparison.OrdinalIgnoreCase) ||
143+
sipEndPointStr.StartsWith("ws:", StringComparison.OrdinalIgnoreCase) ||
144+
sipEndPointStr.StartsWith("wss:", StringComparison.OrdinalIgnoreCase))
145145
{
146146
return ParseSerialisedSIPEndPoint(sipEndPointStr);
147147
}

0 commit comments

Comments
 (0)