@@ -113,7 +113,9 @@ PropagationTags fromHeaderValue(PTagsFactory tagsFactory, String value) {
113113 false ,
114114 W3CPTagsCodec ::isAllowedKeyChar );
115115 if (tagKeyEndsAt < 0 || tagKeyEndsAt >= ddMemberValueEnd ) {
116- tagPos = skipMalformedElement (value , tagPos , ddMemberValueEnd );
116+ int nextTagPos = skipMalformedElement (value , tagPos , ddMemberValueEnd );
117+ maxUnknownSize += (nextTagPos - tagPos ); // still relay malformed elements
118+ tagPos = nextTagPos ;
117119 continue ;
118120 }
119121 int tagValuePos = tagKeyEndsAt + 1 ;
@@ -126,7 +128,9 @@ PropagationTags fromHeaderValue(PTagsFactory tagsFactory, String value) {
126128 true ,
127129 W3CPTagsCodec ::isAllowedValueChar );
128130 if (tagValueEndsAt < 0 || tagValueEndsAt > ddMemberValueEnd ) {
129- tagPos = skipMalformedElement (value , tagValuePos , ddMemberValueEnd );
131+ int nextTagPos = skipMalformedElement (value , tagValuePos , ddMemberValueEnd );
132+ maxUnknownSize += (nextTagPos - tagPos ); // still relay malformed elements
133+ tagPos = nextTagPos ;
130134 continue ;
131135 }
132136 int nextTagPos = tagValueEndsAt + 1 ;
@@ -658,33 +662,24 @@ private static int cleanUpAndAppendUnknown(StringBuilder sb, W3CPTags w3CPTags,
658662 }
659663 okSize = size ;
660664 int elementEnd = original .indexOf (ELEMENT_SEPARATOR , elementStart );
661- if (elementEnd < 0 ) {
665+ if (elementEnd < 0 || elementEnd > w3CPTags . ddMemberValueEnd ) {
662666 elementEnd = w3CPTags .ddMemberValueEnd ;
663667 }
664668 if (!original .startsWith (Encoding .W3C .getPrefix (), elementStart )) {
665- int tagKeyEndsAt =
666- validateCharsUntilSeparatorOrEnd (
667- original ,
668- elementStart ,
669- elementEnd ,
670- KEY_VALUE_SEPARATOR ,
671- false ,
672- W3CPTagsCodec ::isAllowedKeyChar );
673- if (tagKeyEndsAt > elementStart && tagKeyEndsAt < elementEnd ) {
674- char first = original .charAt (elementStart );
675- // ignore known o:, s:, and p: elements because we always add them back in appendPrefix
676- if ((first != 'o' && first != 's' && first != 'p' ) || tagKeyEndsAt - elementStart != 1 ) {
677- if (sb .length () > EMPTY_SIZE ) {
678- sb .append (ELEMENT_SEPARATOR );
679- size ++;
680- }
681- int end = elementEnd ;
682- if (end == w3CPTags .ddMemberValueEnd ) {
683- end = stripTrailingOWC (original , elementStart , end );
684- }
685- sb .append (original , elementStart , end );
686- size += (end - elementStart );
669+ char first = original .charAt (elementStart );
670+ int keySize = original .indexOf (KEY_VALUE_SEPARATOR , elementStart ) - elementStart ;
671+ // ignore known o:, s:, and p: elements because we always add them back in appendPrefix
672+ if ((first != 'o' && first != 's' && first != 'p' ) || keySize != 1 ) {
673+ if (sb .length () > EMPTY_SIZE ) {
674+ sb .append (ELEMENT_SEPARATOR );
675+ size ++;
676+ }
677+ int end = elementEnd ;
678+ if (end == w3CPTags .ddMemberValueEnd ) {
679+ end = stripTrailingOWC (original , elementStart , end );
687680 }
681+ sb .append (original , elementStart , end );
682+ size += (end - elementStart );
688683 }
689684 }
690685 elementStart = elementEnd + 1 ;
0 commit comments