--- old/src/java.base/share/classes/sun/net/www/MimeTable.java 2019-01-28 17:02:47.832590771 -0800 +++ new/src/java.base/share/classes/sun/net/www/MimeTable.java 2019-01-28 17:02:47.484590857 -0800 @@ -30,6 +30,7 @@ import java.net.FileNameMap; import java.util.Hashtable; import java.util.Enumeration; +import java.util.Locale; import java.util.Properties; import java.util.StringTokenizer; @@ -167,24 +168,35 @@ * with it. Parses general file names, and URLs. */ public MimeEntry findByFileName(String fname) { - String ext = ""; - - int i = fname.lastIndexOf('#'); + String ext = getExtension(fname); + return findByExt(ext); + } - if (i > 0) { - fname = fname.substring(0, i - 1); + private static String getExtension(String fname) { + int fragmentIndex = fname.lastIndexOf('#'); + if (fragmentIndex < 0) { + fragmentIndex = fname.length(); } - i = fname.lastIndexOf('.'); - // REMIND: OS specific delimters appear here - i = Math.max(i, fname.lastIndexOf('/')); - i = Math.max(i, fname.lastIndexOf('?')); + int queryIndex = fname.lastIndexOf('?', fragmentIndex); + if (queryIndex < 0) { + queryIndex = fragmentIndex; + } - if (i != -1 && fname.charAt(i) == '.') { - ext = fname.substring(i).toLowerCase(); + int slashIndex = fname.lastIndexOf('/', queryIndex); + if (slashIndex < 0) { + slashIndex = 0; } + fname = fname.substring(slashIndex, queryIndex); - return findByExt(ext); + int dotIndex = fname.lastIndexOf('.', queryIndex); + String result; + if (dotIndex >= 0) { + result = fname.substring(dotIndex); // include the '.' + } else { + result = ""; // or: result = "." + fname + } + return result.toLowerCase(Locale.ROOT); } /**