@@ -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 }
0 commit comments