diff --git a/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapper.java b/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapper.java index bc0fb76d319eb1c17c1c3a80fb62cdeb133dbcf1..307ae02d74b130c826ea91b9150f0134563bfe8e 100644 --- a/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapper.java +++ b/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapper.java @@ -54,7 +54,7 @@ public class IFrameDeliveryMapper implements Mapper { private static final String DEFAULT_CONTENT_TYPE = "text/html"; private static final String XHTML_EXTENSION = "xhtml"; private static final String XHTML_CONTENT_TYPE = "application/xhtml+xml"; - private static final Pattern PATTERN_ENCTYPE = Pattern.compile("<meta.*charset=([^\"\']*)[\"\']", Pattern.CASE_INSENSITIVE); + private static final Pattern PATTERN_ENCTYPE = Pattern.compile("<meta[^>]*charset=[\"\']?([A-Za-z0-9.:\\-_]*)", Pattern.CASE_INSENSITIVE); private static final Pattern PATTERN_XML_ENCTYPE = Pattern.compile("<\\?xml.*encoding=[\"\']([^\"\']*)[\"\']", Pattern.CASE_INSENSITIVE); private static final Pattern PATTERN_CONTTYPE = Pattern.compile("<meta.*content-type\"?\\s*content\\s*=\\s*[\"]?+(.+?)([\"]?+\\s*/>)", Pattern.CASE_INSENSITIVE); private static final Pattern PATTERN_DOCTYPE = Pattern.compile("<!DOCTYPE\\s*html\\s*PUBLIC\\s*[\"\']\\s*-//W3C//DTD\\s*(.+?)(//EN)", Pattern.CASE_INSENSITIVE); @@ -515,7 +515,7 @@ public class IFrameDeliveryMapper implements Mapper { // use found char set String htmlcharset = m.group(1); //if longer than 50 the regexp did fail - if (htmlcharset.length() < 50 ) { + if (htmlcharset.length() < 50 && htmlcharset.length() != 0) { return htmlcharset; } } diff --git a/src/test/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapperTest.java b/src/test/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapperTest.java index d311994714787029542994ba354471c3dce97a8c..28b41cee5331e1b5ca7d50ddb04ededf3e5d2e10 100644 --- a/src/test/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapperTest.java +++ b/src/test/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapperTest.java @@ -38,5 +38,30 @@ public class IFrameDeliveryMapperTest { String encoding2 = mapper.guessEncoding("<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>"); Assert.assertEquals("UTF-8", encoding2); + + // capital / lowercase mixed + String encoding3 = mapper.guessEncoding("<meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\">"); + Assert.assertEquals("utf-8", encoding3); + + // short charset rules often used in html5 apps + String encoding4 = mapper.guessEncoding("<meta charset=\"utf-8\">"); + Assert.assertEquals("utf-8", encoding4); + + String encoding5 = mapper.guessEncoding("<meta charset='utf-8'>"); + Assert.assertEquals("utf-8", encoding5); + + String encoding6 = mapper.guessEncoding("<meta charset=utf-8>"); + Assert.assertEquals("utf-8", encoding6); + + String encoding7 = mapper.guessEncoding("<meta charset=utf-8/>"); + Assert.assertEquals("utf-8", encoding7); + + String encoding8 = mapper.guessEncoding("<meta charset=utf-8 />"); + Assert.assertEquals("utf-8", encoding8); + + // wrong stuff + String encoding9 = mapper.guessEncoding("<meta gugus='asdf'><dings charset='utf-8' />"); + Assert.assertNull(encoding9); + } }