Mercurial Hosting > luan
changeset 1023:27f3dc761452
MimeTypes uses StringCache
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 01 Nov 2016 03:44:46 -0600 |
parents | 3718afd99988 |
children | be50ffc0ad5c |
files | src/org/eclipse/jetty/http/MimeTypes.java src/org/eclipse/jetty/http/encoding.properties src/org/eclipse/jetty/io/StringCache.java src/org/eclipse/jetty/server/AbstractHttpConnection.java src/org/eclipse/jetty/server/Response.java src/org/eclipse/jetty/server/handler/ResourceHandler.java |
diffstat | 6 files changed, 116 insertions(+), 159 deletions(-) [+] |
line wrap: on
line diff
--- a/src/org/eclipse/jetty/http/MimeTypes.java Tue Nov 01 01:04:46 2016 -0600 +++ b/src/org/eclipse/jetty/http/MimeTypes.java Tue Nov 01 03:44:46 2016 -0600 @@ -26,18 +26,13 @@ import java.util.ResourceBundle; import org.eclipse.jetty.io.Buffer; -import org.eclipse.jetty.io.BufferCache; -import org.eclipse.jetty.io.BufferCache.CachedBuffer; +import org.eclipse.jetty.io.StringCache; import org.eclipse.jetty.util.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/* ------------------------------------------------------------ */ -/** - * - */ -public class MimeTypes +public final class MimeTypes { private static final Logger LOG = LoggerFactory.getLogger(MimeTypes.class); @@ -70,13 +65,13 @@ TEXT_JSON__UTF_8="text/json; charset=UTF-8"; private final static int - FORM_ENCODED_ORDINAL=1, + FORM_ENCODED_ORDINAL=1, MESSAGE_HTTP_ORDINAL=2, MULTIPART_BYTERANGES_ORDINAL=3, TEXT_HTML_ORDINAL=4, - TEXT_PLAIN_ORDINAL=5, - TEXT_XML_ORDINAL=6, + TEXT_PLAIN_ORDINAL=5, + TEXT_XML_ORDINAL=6, TEXT_JSON_ORDINAL=7, TEXT_HTML_8859_1_ORDINAL=8, @@ -90,41 +85,39 @@ private static int __index=15; - public final static BufferCache CACHE = new BufferCache(); + public final static StringCache CACHE = new StringCache(); - public final static CachedBuffer - FORM_ENCODED_BUFFER=CACHE.add(FORM_ENCODED,FORM_ENCODED_ORDINAL), - MESSAGE_HTTP_BUFFER=CACHE.add(MESSAGE_HTTP, MESSAGE_HTTP_ORDINAL), - MULTIPART_BYTERANGES_BUFFER=CACHE.add(MULTIPART_BYTERANGES,MULTIPART_BYTERANGES_ORDINAL), + public final static byte[] + FORM_ENCODED_BYTES=CACHE.add(FORM_ENCODED,FORM_ENCODED_ORDINAL), + MESSAGE_HTTP_BYTES=CACHE.add(MESSAGE_HTTP, MESSAGE_HTTP_ORDINAL), + MULTIPART_BYTERANGES_BYTES=CACHE.add(MULTIPART_BYTERANGES,MULTIPART_BYTERANGES_ORDINAL), - TEXT_HTML_BUFFER=CACHE.add(TEXT_HTML,TEXT_HTML_ORDINAL), - TEXT_PLAIN_BUFFER=CACHE.add(TEXT_PLAIN,TEXT_PLAIN_ORDINAL), - TEXT_XML_BUFFER=CACHE.add(TEXT_XML,TEXT_XML_ORDINAL), - TEXT_JSON_BUFFER=CACHE.add(TEXT_JSON,TEXT_JSON_ORDINAL), + TEXT_HTML_BYTES=CACHE.add(TEXT_HTML,TEXT_HTML_ORDINAL), + TEXT_PLAIN_BYTES=CACHE.add(TEXT_PLAIN,TEXT_PLAIN_ORDINAL), + TEXT_XML_BYTES=CACHE.add(TEXT_XML,TEXT_XML_ORDINAL), + TEXT_JSON_BYTES=CACHE.add(TEXT_JSON,TEXT_JSON_ORDINAL), - TEXT_HTML_8859_1_BUFFER=CACHE.add(TEXT_HTML_8859_1,TEXT_HTML_8859_1_ORDINAL), - TEXT_PLAIN_8859_1_BUFFER=CACHE.add(TEXT_PLAIN_8859_1,TEXT_PLAIN_8859_1_ORDINAL), - TEXT_XML_8859_1_BUFFER=CACHE.add(TEXT_XML_8859_1,TEXT_XML_8859_1_ORDINAL), + TEXT_HTML_8859_1_BYTES=CACHE.add(TEXT_HTML_8859_1,TEXT_HTML_8859_1_ORDINAL), + TEXT_PLAIN_8859_1_BYTES=CACHE.add(TEXT_PLAIN_8859_1,TEXT_PLAIN_8859_1_ORDINAL), + TEXT_XML_8859_1_BYTES=CACHE.add(TEXT_XML_8859_1,TEXT_XML_8859_1_ORDINAL), - TEXT_HTML_UTF_8_BUFFER=CACHE.add(TEXT_HTML_UTF_8,TEXT_HTML_UTF_8_ORDINAL), - TEXT_PLAIN_UTF_8_BUFFER=CACHE.add(TEXT_PLAIN_UTF_8,TEXT_PLAIN_UTF_8_ORDINAL), - TEXT_XML_UTF_8_BUFFER=CACHE.add(TEXT_XML_UTF_8,TEXT_XML_UTF_8_ORDINAL), - TEXT_JSON_UTF_8_BUFFER=CACHE.add(TEXT_JSON_UTF_8,TEXT_JSON_UTF_8_ORDINAL), + TEXT_HTML_UTF_8_BYTES=CACHE.add(TEXT_HTML_UTF_8,TEXT_HTML_UTF_8_ORDINAL), + TEXT_PLAIN_UTF_8_BYTES=CACHE.add(TEXT_PLAIN_UTF_8,TEXT_PLAIN_UTF_8_ORDINAL), + TEXT_XML_UTF_8_BYTES=CACHE.add(TEXT_XML_UTF_8,TEXT_XML_UTF_8_ORDINAL), + TEXT_JSON_UTF_8_BYTES=CACHE.add(TEXT_JSON_UTF_8,TEXT_JSON_UTF_8_ORDINAL), - TEXT_HTML__8859_1_BUFFER=CACHE.add(TEXT_HTML__8859_1,TEXT_HTML_8859_1_ORDINAL), - TEXT_PLAIN__8859_1_BUFFER=CACHE.add(TEXT_PLAIN__8859_1,TEXT_PLAIN_8859_1_ORDINAL), - TEXT_XML__8859_1_BUFFER=CACHE.add(TEXT_XML__8859_1,TEXT_XML_8859_1_ORDINAL), + TEXT_HTML__8859_1_BYTES=CACHE.add(TEXT_HTML__8859_1,TEXT_HTML_8859_1_ORDINAL), + TEXT_PLAIN__8859_1_BYTES=CACHE.add(TEXT_PLAIN__8859_1,TEXT_PLAIN_8859_1_ORDINAL), + TEXT_XML__8859_1_BYTES=CACHE.add(TEXT_XML__8859_1,TEXT_XML_8859_1_ORDINAL), - TEXT_HTML__UTF_8_BUFFER=CACHE.add(TEXT_HTML__UTF_8,TEXT_HTML_UTF_8_ORDINAL), - TEXT_PLAIN__UTF_8_BUFFER=CACHE.add(TEXT_PLAIN__UTF_8,TEXT_PLAIN_UTF_8_ORDINAL), - TEXT_XML__UTF_8_BUFFER=CACHE.add(TEXT_XML__UTF_8,TEXT_XML_UTF_8_ORDINAL), - TEXT_JSON__UTF_8_BUFFER=CACHE.add(TEXT_JSON__UTF_8,TEXT_JSON_UTF_8_ORDINAL); + TEXT_HTML__UTF_8_BYTES=CACHE.add(TEXT_HTML__UTF_8,TEXT_HTML_UTF_8_ORDINAL), + TEXT_PLAIN__UTF_8_BYTES=CACHE.add(TEXT_PLAIN__UTF_8,TEXT_PLAIN_UTF_8_ORDINAL), + TEXT_XML__UTF_8_BYTES=CACHE.add(TEXT_XML__UTF_8,TEXT_XML_UTF_8_ORDINAL), + TEXT_JSON__UTF_8_BYTES=CACHE.add(TEXT_JSON__UTF_8,TEXT_JSON_UTF_8_ORDINAL); - /* ------------------------------------------------------------ */ - /* ------------------------------------------------------------ */ - private final static Map __dftMimeMap = new HashMap(); - private final static Map __encodings = new HashMap(); + private final static Map<String,String> __dftMimeMap = new HashMap<String,String>(); + private final static Map<String,String> __encodings = new HashMap<String,String>(); static { try @@ -135,7 +128,8 @@ { String ext = (String)i.nextElement(); String m = mime.getString(ext); - __dftMimeMap.put(StringUtil.asciiToLowerCase(ext),normalizeMimeType(m)); +// __dftMimeMap.put(ext.toLowerCase(),normalizeMimeType(m)); + __dftMimeMap.put(ext.toLowerCase(),m); } } catch(MissingResourceException e) @@ -144,23 +138,12 @@ LOG.debug("",e); } - try - { - ResourceBundle encoding = ResourceBundle.getBundle("org/eclipse/jetty/http/encoding"); - Enumeration i = encoding.getKeys(); - while(i.hasMoreElements()) - { - Buffer type = normalizeMimeType((String)i.nextElement()); - __encodings.put(type,encoding.getString(type.toString())); - } - } - catch(MissingResourceException e) - { - LOG.warn(e.toString()); - LOG.debug("",e); - } + __encodings.put("text/html","ISO-8859-1"); + __encodings.put("text/plain","ISO-8859-1"); + __encodings.put("text/xml","UTF-8"); + __encodings.put("text/json","UTF-8"); - +/* TEXT_HTML_BUFFER.setAssociate("ISO-8859-1",TEXT_HTML_8859_1_BUFFER); TEXT_HTML_BUFFER.setAssociate("ISO_8859_1",TEXT_HTML_8859_1_BUFFER); TEXT_HTML_BUFFER.setAssociate("iso-8859-1",TEXT_HTML_8859_1_BUFFER); @@ -187,56 +170,54 @@ TEXT_JSON_BUFFER.setAssociate("UTF8",TEXT_JSON_UTF_8_BUFFER); TEXT_JSON_BUFFER.setAssociate("utf8",TEXT_JSON_UTF_8_BUFFER); TEXT_JSON_BUFFER.setAssociate("utf-8",TEXT_JSON_UTF_8_BUFFER); +*/ + } + + // replace setAssociate() + + private static final Map<String,String> association = new HashMap<String,String>(); + + private static String key(String type,String charEncoding) { + return (type+'~'+charEncoding).toLowerCase(); + } + + private static void setAssociate(String type,String charEncoding,String result) { + association.put( key(type,charEncoding), result ); + } + + public static String getAssociate(String type,String charEncoding) { + return association.get( key(type,charEncoding) ); + } + + static { + setAssociate(TEXT_HTML,"ISO-8859-1",TEXT_HTML_8859_1); + setAssociate(TEXT_HTML,"ISO_8859_1",TEXT_HTML_8859_1); + setAssociate(TEXT_PLAIN,"ISO-8859-1",TEXT_PLAIN_8859_1); + setAssociate(TEXT_PLAIN,"ISO_8859_1",TEXT_PLAIN_8859_1); + setAssociate(TEXT_XML,"ISO-8859-1",TEXT_XML_8859_1); + setAssociate(TEXT_XML,"ISO_8859_1",TEXT_XML_8859_1); + + setAssociate(TEXT_HTML,"UTF-8",TEXT_HTML_UTF_8); + setAssociate(TEXT_HTML,"UTF8",TEXT_HTML_UTF_8); + setAssociate(TEXT_PLAIN,"UTF-8",TEXT_PLAIN_UTF_8); + setAssociate(TEXT_PLAIN,"UTF8",TEXT_PLAIN_UTF_8); + setAssociate(TEXT_XML,"UTF-8",TEXT_XML_UTF_8); + setAssociate(TEXT_XML,"UTF8",TEXT_XML_UTF_8); + setAssociate(TEXT_JSON,"UTF-8",TEXT_JSON_UTF_8); + setAssociate(TEXT_JSON,"UTF8",TEXT_JSON_UTF_8); } - /* ------------------------------------------------------------ */ - private Map _mimeMap; /* ------------------------------------------------------------ */ - /** Constructor. - */ - public MimeTypes() - { - } - - /* ------------------------------------------------------------ */ - public synchronized Map getMimeMap() - { - return _mimeMap; - } - - /* ------------------------------------------------------------ */ - /** - * @param mimeMap A Map of file extension to mime-type. - */ - public void setMimeMap(Map mimeMap) - { - if (mimeMap==null) - { - _mimeMap=null; - return; - } - - Map m=new HashMap(); - Iterator i=mimeMap.entrySet().iterator(); - while (i.hasNext()) - { - Map.Entry entry = (Map.Entry)i.next(); - m.put(entry.getKey(),normalizeMimeType(entry.getValue().toString())); - } - _mimeMap=m; - } - - /* ------------------------------------------------------------ */ /** Get the MIME type by filename extension. * @param filename A file name * @return MIME type matching the longest dot extension of the * file name. */ - public Buffer getMimeByExtension(String filename) + public String getMimeByExtension(String filename) { - Buffer type=null; + String type=null; if (filename!=null) { @@ -248,75 +229,51 @@ if (i<0 || i>=filename.length()) break; - String ext=StringUtil.asciiToLowerCase(filename.substring(i+1)); - if (_mimeMap!=null) - type = (Buffer)_mimeMap.get(ext); - if (type==null) - type=(Buffer)__dftMimeMap.get(ext); + String ext = filename.substring(i+1).toLowerCase(); + type = __dftMimeMap.get(ext); } } if (type==null) { - if (_mimeMap!=null) - type=(Buffer)_mimeMap.get("*"); - if (type==null) - type=(Buffer)__dftMimeMap.get("*"); + type = __dftMimeMap.get("*"); } return type; } - - /* ------------------------------------------------------------ */ - /** Set a mime mapping - * @param extension - * @param type - */ - public void addMimeMapping(String extension,String type) - { - if (_mimeMap==null) - _mimeMap=new HashMap(); - - _mimeMap.put(StringUtil.asciiToLowerCase(extension),normalizeMimeType(type)); - } - - /* ------------------------------------------------------------ */ +/* private static synchronized Buffer normalizeMimeType(String type) { - Buffer b =CACHE.get(type); + Buffer b = CACHE.get(type); if (b==null) - b=CACHE.add(type,__index++); + b = CACHE.add(type,__index++); return b; } - - /* ------------------------------------------------------------ */ - public static String getCharsetFromContentType(Buffer value) +*/ + public static String getCharsetFromContentType(String value) { - if (value instanceof CachedBuffer) + switch(CACHE.getOrdinal(value)) { - switch(((CachedBuffer)value).getOrdinal()) - { - case TEXT_HTML_8859_1_ORDINAL: - case TEXT_PLAIN_8859_1_ORDINAL: - case TEXT_XML_8859_1_ORDINAL: - return StringUtil.__ISO_8859_1; + case TEXT_HTML_8859_1_ORDINAL: + case TEXT_PLAIN_8859_1_ORDINAL: + case TEXT_XML_8859_1_ORDINAL: + return StringUtil.__ISO_8859_1; - case TEXT_HTML_UTF_8_ORDINAL: - case TEXT_PLAIN_UTF_8_ORDINAL: - case TEXT_XML_UTF_8_ORDINAL: - case TEXT_JSON_UTF_8_ORDINAL: - return StringUtil.__UTF8; - } + case TEXT_HTML_UTF_8_ORDINAL: + case TEXT_PLAIN_UTF_8_ORDINAL: + case TEXT_XML_UTF_8_ORDINAL: + case TEXT_JSON_UTF_8_ORDINAL: + return StringUtil.__UTF8; } - int i=value.getIndex(); - int end=value.putIndex(); + int i = 0; + int end = value.length(); int state=0; int start=0; boolean quote=false; for (;i<end;i++) { - byte b = value.peek(i); + char b = value.charAt(i); if (quote && state!=10) { @@ -364,13 +321,13 @@ case 10: if (!quote && (';'==b || ' '==b )|| (quote && '"'==b )) - return CACHE.lookup(value.peek(start,i-start)).toString(StringUtil.__UTF8); + return value.substring(start,i); } } if (state==10) - return CACHE.lookup(value.peek(start,i-start)).toString(StringUtil.__UTF8); + return value.substring(start,i); - return (String)__encodings.get(value); + return __encodings.get(value.toLowerCase()); } }
--- a/src/org/eclipse/jetty/http/encoding.properties Tue Nov 01 01:04:46 2016 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -text/html = ISO-8859-1 -text/plain = ISO-8859-1 -text/xml = UTF-8 -text/json = UTF-8
--- a/src/org/eclipse/jetty/io/StringCache.java Tue Nov 01 01:04:46 2016 -0600 +++ b/src/org/eclipse/jetty/io/StringCache.java Tue Nov 01 03:44:46 2016 -0600 @@ -30,6 +30,11 @@ return stringToOrdinal.containsKey(value.toLowerCase()); } + public String get(String value) + { + return stringMap.get(value.toLowerCase()); + } + public String getBest(String key) { key = key.toLowerCase(); String rtn = stringMap.get(key);
--- a/src/org/eclipse/jetty/server/AbstractHttpConnection.java Tue Nov 01 01:04:46 2016 -0600 +++ b/src/org/eclipse/jetty/server/AbstractHttpConnection.java Tue Nov 01 03:44:46 2016 -0600 @@ -552,7 +552,7 @@ case HttpHeaders.CONTENT_TYPE_ORDINAL: // value = MimeTypes.CACHE.lookup(value); - _charset=MimeTypes.getCharsetFromContentType(new ByteArrayBuffer(value)); + _charset = MimeTypes.getCharsetFromContentType(value); break; }
--- a/src/org/eclipse/jetty/server/Response.java Tue Nov 01 01:04:46 2016 -0600 +++ b/src/org/eclipse/jetty/server/Response.java Tue Nov 01 03:44:46 2016 -0600 @@ -42,7 +42,6 @@ import org.eclipse.jetty.http.HttpURI; import org.eclipse.jetty.http.HttpVersions; import org.eclipse.jetty.http.MimeTypes; -import org.eclipse.jetty.io.BufferCache.CachedBuffer; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.util.ByteArrayISO8859Writer; import org.eclipse.jetty.util.QuotedStringTokenizer; @@ -84,7 +83,7 @@ private String _reason; private Locale _locale; private String _mimeType; - private CachedBuffer _cachedMimeType; + private String _cachedMimeType; private String _characterEncoding; private boolean _explicitEncoding; private String _contentType; @@ -481,7 +480,7 @@ { _characterEncoding=null; if (_cachedMimeType!=null) - _contentType = _cachedMimeType.toString(); + _contentType = _cachedMimeType; else if (_mimeType!=null) _contentType = _mimeType; else @@ -505,10 +504,10 @@ _contentType=null; if(_cachedMimeType!=null) { - CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); + String content_type = MimeTypes.getAssociate(_cachedMimeType,_characterEncoding); if (content_type!=null) { - _contentType = content_type.toString(); + _contentType = content_type; _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); } } @@ -620,10 +619,10 @@ { if (_cachedMimeType!=null) { - CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); + String content_type = MimeTypes.getAssociate(_cachedMimeType,_characterEncoding); if (content_type!=null) { - _contentType=content_type.toString(); + _contentType=content_type; _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); } else @@ -657,10 +656,10 @@ if (_cachedMimeType!=null) { - CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); + String content_type = MimeTypes.getAssociate(_cachedMimeType,_characterEncoding); if (content_type!=null) { - _contentType=content_type.toString(); + _contentType=content_type; _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); } else @@ -704,10 +703,10 @@ { if (_cachedMimeType!=null) { - CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); + String content_type = MimeTypes.getAssociate(_cachedMimeType,_characterEncoding); if (content_type!=null) { - _contentType=content_type.toString(); + _contentType=content_type; _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); } else
--- a/src/org/eclipse/jetty/server/handler/ResourceHandler.java Tue Nov 01 01:04:46 2016 -0600 +++ b/src/org/eclipse/jetty/server/handler/ResourceHandler.java Tue Nov 01 03:44:46 2016 -0600 @@ -385,12 +385,12 @@ } } - Buffer mime=_mimeTypes.getMimeByExtension(resource.toString()); + String mime = _mimeTypes.getMimeByExtension(resource.toString()); if (mime==null) mime=_mimeTypes.getMimeByExtension(request.getPathInfo()); // set the headers - doResponseHeaders(response,resource,mime!=null?mime.toString():null); + doResponseHeaders(response,resource,mime); response.setDateHeader(HttpHeaders.LAST_MODIFIED,last_modified); if(skipContentBody)