@@ -484,18 +484,21 @@ private void doHttpStream(InputStream is, String httpContentType,
484484 */
485485 private String calculateRawEncoding (String bomEnc , String xmlGuessEnc ,
486486 String xmlEnc ) throws IOException {
487- String encoding ;
487+
488+ // BOM is Null
488489 if (bomEnc == null ) {
489490 if (xmlGuessEnc == null || xmlEnc == null ) {
490- encoding = (defaultEncoding == null ) ? UTF_8 : defaultEncoding ;
491- } else if (xmlEnc .equals (UTF_16 )
492- && (xmlGuessEnc .equals (UTF_16BE ) || xmlGuessEnc
493- .equals (UTF_16LE ))) {
494- encoding = xmlGuessEnc ;
495- } else {
496- encoding = xmlEnc ;
491+ return (defaultEncoding == null ? UTF_8 : defaultEncoding );
492+ }
493+ if (xmlEnc .equals (UTF_16 ) &&
494+ (xmlGuessEnc .equals (UTF_16BE ) || xmlGuessEnc .equals (UTF_16LE ))) {
495+ return xmlGuessEnc ;
497496 }
498- } else if (bomEnc .equals (UTF_8 )) {
497+ return xmlEnc ;
498+ }
499+
500+ // BOM is UTF-8
501+ if (bomEnc .equals (UTF_8 )) {
499502 if (xmlGuessEnc != null && !xmlGuessEnc .equals (UTF_8 )) {
500503 String msg = MessageFormat .format (RAW_EX_1 , new Object [] { bomEnc , xmlGuessEnc , xmlEnc });
501504 throw new XmlStreamReaderException (msg , bomEnc , xmlGuessEnc , xmlEnc );
@@ -504,23 +507,25 @@ private String calculateRawEncoding(String bomEnc, String xmlGuessEnc,
504507 String msg = MessageFormat .format (RAW_EX_1 , new Object [] { bomEnc , xmlGuessEnc , xmlEnc });
505508 throw new XmlStreamReaderException (msg , bomEnc , xmlGuessEnc , xmlEnc );
506509 }
507- encoding = UTF_8 ;
508- } else if (bomEnc .equals (UTF_16BE ) || bomEnc .equals (UTF_16LE )) {
510+ return bomEnc ;
511+ }
512+
513+ // BOM is UTF-16BE or UTF-16LE
514+ if (bomEnc .equals (UTF_16BE ) || bomEnc .equals (UTF_16LE )) {
509515 if (xmlGuessEnc != null && !xmlGuessEnc .equals (bomEnc )) {
510516 String msg = MessageFormat .format (RAW_EX_1 , new Object [] { bomEnc , xmlGuessEnc , xmlEnc });
511517 throw new IOException (msg );
512518 }
513- if (xmlEnc != null && !xmlEnc .equals (UTF_16 )
514- && !xmlEnc .equals (bomEnc )) {
519+ if (xmlEnc != null && !xmlEnc .equals (UTF_16 ) && !xmlEnc .equals (bomEnc )) {
515520 String msg = MessageFormat .format (RAW_EX_1 , new Object [] { bomEnc , xmlGuessEnc , xmlEnc });
516521 throw new XmlStreamReaderException (msg , bomEnc , xmlGuessEnc , xmlEnc );
517522 }
518- encoding = bomEnc ;
519- } else {
520- String msg = MessageFormat .format (RAW_EX_2 , new Object [] { bomEnc , xmlGuessEnc , xmlEnc });
521- throw new XmlStreamReaderException (msg , bomEnc , xmlGuessEnc , xmlEnc );
523+ return bomEnc ;
522524 }
523- return encoding ;
525+
526+ // BOM is something else
527+ String msg = MessageFormat .format (RAW_EX_2 , new Object [] { bomEnc , xmlGuessEnc , xmlEnc });
528+ throw new XmlStreamReaderException (msg , bomEnc , xmlGuessEnc , xmlEnc );
524529 }
525530
526531
@@ -539,42 +544,52 @@ private String calculateRawEncoding(String bomEnc, String xmlGuessEnc,
539544 private String calculateHttpEncoding (String httpContentType ,
540545 String bomEnc , String xmlGuessEnc , String xmlEnc ,
541546 boolean lenient ) throws IOException {
547+
548+ // Lenient and has XML encoding
549+ if (lenient && xmlEnc != null ) {
550+ return xmlEnc ;
551+ }
552+
553+ // Determine mime/encoding content types from HTTP Content Type
542554 String cTMime = getContentTypeMime (httpContentType );
543555 String cTEnc = getContentTypeEncoding (httpContentType );
544- String encoding ;
545- if (lenient & xmlEnc != null ) {
546- encoding = xmlEnc ;
547- } else {
548- boolean appXml = isAppXml (cTMime );
549- boolean textXml = isTextXml (cTMime );
550- if (appXml || textXml ) {
551- if (cTEnc == null ) {
552- if (appXml ) {
553- encoding = calculateRawEncoding (bomEnc , xmlGuessEnc , xmlEnc );
554- } else {
555- encoding = (defaultEncoding == null ) ? US_ASCII
556- : defaultEncoding ;
557- }
558- } else if (bomEnc != null
559- && (cTEnc .equals (UTF_16BE ) || cTEnc .equals (UTF_16LE ))) {
560- String msg = MessageFormat .format (HTTP_EX_1 , cTMime , cTEnc , bomEnc , xmlGuessEnc , xmlEnc );
561- throw new XmlStreamReaderException (msg , cTMime , cTEnc , bomEnc , xmlGuessEnc , xmlEnc );
562- } else if (cTEnc .equals (UTF_16 )) {
563- if (bomEnc != null && bomEnc .startsWith (UTF_16 )) {
564- encoding = bomEnc ;
565- } else {
566- String msg = MessageFormat .format (HTTP_EX_2 , cTMime , cTEnc , bomEnc , xmlGuessEnc , xmlEnc );
567- throw new XmlStreamReaderException (msg , cTMime , cTEnc , bomEnc , xmlGuessEnc , xmlEnc );
568- }
569- } else {
570- encoding = cTEnc ;
571- }
556+ boolean appXml = isAppXml (cTMime );
557+ boolean textXml = isTextXml (cTMime );
558+
559+ // Mime type NOT "application/xml" or "text/xml"
560+ if (!appXml && !textXml ) {
561+ String msg = MessageFormat .format (HTTP_EX_3 , cTMime , cTEnc , bomEnc , xmlGuessEnc , xmlEnc );
562+ throw new XmlStreamReaderException (msg , cTMime , cTEnc , bomEnc , xmlGuessEnc , xmlEnc );
563+ }
564+
565+ // No content type encoding
566+ if (cTEnc == null ) {
567+ if (appXml ) {
568+ return calculateRawEncoding (bomEnc , xmlGuessEnc , xmlEnc );
572569 } else {
573- String msg = MessageFormat .format (HTTP_EX_3 , cTMime , cTEnc , bomEnc , xmlGuessEnc , xmlEnc );
570+ return (defaultEncoding == null ) ? US_ASCII : defaultEncoding ;
571+ }
572+ }
573+
574+ // UTF-16BE or UTF-16LE content type encoding
575+ if (cTEnc .equals (UTF_16BE ) || cTEnc .equals (UTF_16LE )) {
576+ if (bomEnc != null ) {
577+ String msg = MessageFormat .format (HTTP_EX_1 , cTMime , cTEnc , bomEnc , xmlGuessEnc , xmlEnc );
574578 throw new XmlStreamReaderException (msg , cTMime , cTEnc , bomEnc , xmlGuessEnc , xmlEnc );
575579 }
580+ return cTEnc ;
576581 }
577- return encoding ;
582+
583+ // UTF-16 content type encoding
584+ if (cTEnc .equals (UTF_16 )) {
585+ if (bomEnc != null && bomEnc .startsWith (UTF_16 )) {
586+ return bomEnc ;
587+ }
588+ String msg = MessageFormat .format (HTTP_EX_2 , cTMime , cTEnc , bomEnc , xmlGuessEnc , xmlEnc );
589+ throw new XmlStreamReaderException (msg , cTMime , cTEnc , bomEnc , xmlGuessEnc , xmlEnc );
590+ }
591+
592+ return cTEnc ;
578593 }
579594
580595 /**
0 commit comments