diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java index 96b93f02860..bdd30fc7deb 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java @@ -634,6 +634,17 @@ public class HttpFields implements Iterable _names.put(header.toString(), field); } + /* ------------------------------------------------------------ */ + /** + * Remove a field. + * + * @param name + */ + public void remove(HttpHeader name) + { + remove(name.toString()); + } + /* ------------------------------------------------------------ */ /** * Remove a field. diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java index 6a3f81a39d9..908b634b016 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpGenerator.java @@ -19,6 +19,7 @@ import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; +import org.eclipse.jetty.http.HttpTokens.Content; /* ------------------------------------------------------------ */ /** @@ -36,29 +37,28 @@ public class HttpGenerator public enum Action { FLUSH, COMPLETE, PREPARE }; public enum State { START, COMMITTING, COMMITTING_COMPLETING, COMMITTED, COMPLETING, END }; public enum Result { NEED_CHUNK,NEED_HEADER,NEED_BUFFER,FLUSH,FLUSH_CONTENT,OK,SHUTDOWN_OUT}; - public enum Content { UNKNOWN_CONTENT,NO_CONTENT,EOF_CONTENT,CONTENT_LENGTH,CHUNKED_CONTENT,SELF_DEFINING_CONTENT }; - + // other statics public static final int CHUNK_SIZE = 12; - interface Info + public interface Info { HttpVersion getHttpVersion(); HttpFields getHttpFields(); - boolean isHead(); long getContentLength(); } - interface RequestInfo extends Info + public interface RequestInfo extends Info { String getMethod(); String getURI(); } - interface ResponseInfo extends Info + public interface ResponseInfo extends Info { int getStatus(); String getReason(); + boolean isHead(); } // data diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpHeader.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpHeader.java index 360b002c926..fd54d1caeb8 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpHeader.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpHeader.java @@ -147,6 +147,12 @@ public enum HttpHeader return _bytesColonSpace; } + /* ------------------------------------------------------------ */ + public boolean is(String s) + { + return _string.equalsIgnoreCase(s); + } + /* ------------------------------------------------------------ */ @Override public String toString() diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java index 82b4e5aa1e2..5e30dc17407 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java @@ -21,7 +21,7 @@ import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; -import org.eclipse.jetty.http.HttpGenerator.Content; +import org.eclipse.jetty.http.HttpTokens.Content; public class HttpParser { diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpScheme.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpScheme.java index b0292a114f4..7588c4e42ad 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpScheme.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpScheme.java @@ -51,11 +51,18 @@ public enum HttpScheme { return _buffer.asReadOnlyBuffer(); } - + + /* ------------------------------------------------------------ */ + public boolean is(String s) + { + return _string.equalsIgnoreCase(s); + } + /* ------------------------------------------------------------ */ @Override public String toString() { return _string; } + } diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpTokens.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpTokens.java index 6f38abec5e1..698f4fa3f3f 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpTokens.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpTokens.java @@ -28,5 +28,7 @@ public interface HttpTokens static final byte TAB= 0x09; + public enum Content { UNKNOWN_CONTENT,NO_CONTENT,EOF_CONTENT,CONTENT_LENGTH,CHUNKED_CONTENT,SELF_DEFINING_CONTENT } } + diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/MimeTypes.java b/jetty-http/src/main/java/org/eclipse/jetty/http/MimeTypes.java index 71f304f3a7d..74097e4a020 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/MimeTypes.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/MimeTypes.java @@ -69,7 +69,13 @@ public class MimeTypes { return _buffer.asReadOnlyBuffer(); } - + + /* ------------------------------------------------------------ */ + public boolean is(String s) + { + return _string.equalsIgnoreCase(s); + } + /* ------------------------------------------------------------ */ @Override public String toString() diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java index 7e7d6c6d708..65c2151e7f9 100644 --- a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java +++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java @@ -55,12 +55,6 @@ public class HttpGeneratorClientTest return _fields; } - @Override - public boolean isHead() - { - return false; - } - @Override public long getContentLength() { diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractHttpConnection.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractHttpConnection.java index 55edf5145bb..c4b2f614b69 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractHttpConnection.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractHttpConnection.java @@ -16,6 +16,8 @@ package org.eclipse.jetty.server; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; +import java.nio.ByteBuffer; + import javax.servlet.DispatcherType; import javax.servlet.ServletInputStream; import javax.servlet.ServletOutputStream; diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpServerConnection.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpServerConnection.java index fbeac6236ca..aa1bdbc106c 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpServerConnection.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpServerConnection.java @@ -95,7 +95,6 @@ public abstract class HttpServerConnection extends AbstractConnection protected final Connector _connector; protected final Server _server; - protected final HttpURI _uri; protected final HttpFields _requestFields; protected final Request _request; diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java index aa96154a667..4bd2dd65651 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java @@ -64,12 +64,11 @@ import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.http.HttpURI; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.http.MimeTypes; +import org.eclipse.jetty.http.HttpGenerator; import org.eclipse.jetty.io.EndPoint; -import org.eclipse.jetty.io.nio.DirectNIOBuffer; -import org.eclipse.jetty.io.nio.NIOBuffer; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.ContextHandler.Context; import org.eclipse.jetty.util.Attributes; @@ -115,7 +114,7 @@ import org.eclipse.jetty.util.log.Logger; * * */ -public class Request implements HttpServletRequest +public class Request implements HttpServletRequest, HttpGenerator.RequestInfo { public static final String __MULTIPART_CONFIG_ELEMENT = "org.eclipse.multipartConfig"; private static final Logger LOG = Log.getLogger(Request.class); @@ -154,7 +153,7 @@ public class Request implements HttpServletRequest private boolean _paramsExtracted; private String _pathInfo; private int _port; - private String _protocol = HttpVersion.HTTP_1_1; + private String _protocol = HttpVersion.HTTP_1_1.toString(); private String _queryEncoding; private String _queryString; private BufferedReader _reader; @@ -250,7 +249,7 @@ public class Request implements HttpServletRequest { content_type = HttpFields.valueParameters(content_type,null); - if (MimeTypes.FORM_ENCODED.equalsIgnoreCase(content_type) && _inputState == __NONE + if (MimeTypes.Type.FORM_ENCODED.is(content_type) && _inputState == __NONE && (HttpMethod.POST.equals(getMethod()) || HttpMethod.PUT.equals(getMethod()))) { int content_length = getContentLength(); @@ -419,9 +418,10 @@ public class Request implements HttpServletRequest */ public int getContentLength() { - return (int)_connection.getRequestFields().getLongField(HttpHeader.CONTENT_LENGTH_BUFFER); + return (int)_connection.getRequestFields().getLongField(HttpHeader.CONTENT_LENGTH.toString()); } + /* ------------------------------------------------------------ */ public long getContentRead() { if (_connection == null || _connection.getParser() == null) @@ -436,7 +436,7 @@ public class Request implements HttpServletRequest */ public String getContentType() { - return _connection.getRequestFields().getStringField(HttpHeader.CONTENT_TYPE_BUFFER); + return _connection.getRequestFields().getStringField(HttpHeader.CONTENT_TYPE); } /* ------------------------------------------------------------ */ @@ -468,7 +468,7 @@ public class Request implements HttpServletRequest _cookiesExtracted = true; - Enumeration enm = _connection.getRequestFields().getValues(HttpHeader.COOKIE_BUFFER); + Enumeration enm = _connection.getRequestFields().getValues(HttpHeader.COOKIE.toString()); // Handle no cookies if (enm != null) @@ -576,7 +576,7 @@ public class Request implements HttpServletRequest */ public Locale getLocale() { - Enumeration enm = _connection.getRequestFields().getValues(HttpHeader.ACCEPT_LANGUAGE,HttpFields.__separators); + Enumeration enm = _connection.getRequestFields().getValues(HttpHeader.ACCEPT_LANGUAGE.toString(),HttpFields.__separators); // handle no locale if (enm == null || !enm.hasMoreElements()) @@ -613,7 +613,7 @@ public class Request implements HttpServletRequest public Enumeration getLocales() { - Enumeration enm = _connection.getRequestFields().getValues(HttpHeader.ACCEPT_LANGUAGE,HttpFields.__separators); + Enumeration enm = _connection.getRequestFields().getValues(HttpHeader.ACCEPT_LANGUAGE.toString(),HttpFields.__separators); // handle no locale if (enm == null || !enm.hasMoreElements()) @@ -1020,22 +1020,22 @@ public class Request implements HttpServletRequest return _serverName; // Return host from header field - ByteBuffer hostPort = _connection.getRequestFields().get(HttpHeader.HOST_BUFFER); + String hostPort = _connection.getRequestFields().getStringField(HttpHeader.HOST); if (hostPort != null) { - loop: for (int i = hostPort.putIndex(); i-- > hostPort.getIndex();) + loop: for (int i = hostPort.length(); i-- > 0;) { - char ch = (char)(0xff & hostPort.peek(i)); + char ch = (char)(0xff & hostPort.charAt(i)); switch (ch) { case ']': break loop; case ':': - _serverName = BufferUtil.to8859_1_String(hostPort.peek(hostPort.getIndex(),i - hostPort.getIndex())); + _serverName = hostPort.substring(0,i); try { - _port = BufferUtil.toInt(hostPort.peek(i + 1,hostPort.putIndex() - i - 1)); + _port = StringUtil.toInt(hostPort.substring(i+1)); } catch (NumberFormatException e) { @@ -1052,9 +1052,10 @@ public class Request implements HttpServletRequest return _serverName; } } + if (_serverName == null || _port < 0) { - _serverName = BufferUtil.to8859_1_String(hostPort); + _serverName = hostPort; _port = 0; } @@ -1404,7 +1405,7 @@ public class Request implements HttpServletRequest _method = null; _pathInfo = null; _port = 0; - _protocol = HttpVersion.HTTP_1_1; + _protocol = HttpVersion.HTTP_1_1.toString(); _queryEncoding = null; _queryString = null; _requestedSessionId = null; @@ -1515,8 +1516,7 @@ public class Request implements HttpServletRequest final ByteBuffer byteBuffer = (ByteBuffer)value; synchronized (byteBuffer) { - NIOBuffer buffer = byteBuffer.isDirect()?new DirectNIOBuffer(byteBuffer,true):new IndirectNIOBuffer(byteBuffer,true); - ((AbstractHttpConnection.Output)getServletResponse().getOutputStream()).sendResponse(buffer); + ((AbstractHttpConnection.Output)getServletResponse().getOutputStream()).sendResponse(byteBuffer); } } catch (IOException e) @@ -1627,7 +1627,7 @@ public class Request implements HttpServletRequest */ public void setContentType(String contentType) { - _connection.getRequestFields().put(HttpHeader.CONTENT_TYPE_BUFFER,contentType); + _connection.getRequestFields().put(HttpHeader.CONTENT_TYPE,contentType); } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java index 2741ae59b77..8d79f6d11b7 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java @@ -35,7 +35,6 @@ import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.http.HttpURI; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.http.MimeTypes; -import org.eclipse.jetty.io.BufferCache.CachedBuffer; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.ErrorHandler; import org.eclipse.jetty.util.ByteArrayISO8859Writer; @@ -78,7 +77,6 @@ public class Response implements HttpServletResponse private String _reason; private Locale _locale; private String _mimeType; - private CachedBuffer _cachedMimeType; private String _characterEncoding; private boolean _explicitEncoding; private String _contentType; @@ -105,7 +103,6 @@ public class Response implements HttpServletResponse _reason=null; _locale=null; _mimeType=null; - _cachedMimeType=null; _characterEncoding=null; _explicitEncoding=false; _contentType=null; @@ -181,7 +178,7 @@ public class Response implements HttpServletResponse path = (path == null?"":path); int port=uri.getPort(); if (port<0) - port = HttpScheme.HTTPS.equalsIgnoreCase(uri.getScheme())?443:80; + port = HttpScheme.HTTPS.toString().equalsIgnoreCase(uri.getScheme())?443:80; if (!request.getServerName().equalsIgnoreCase(uri.getHost()) || request.getServerPort()!=port || !path.startsWith(request.getContextPath())) //TODO the root context path is "", with which every non null string starts @@ -250,13 +247,13 @@ public class Response implements HttpServletResponse if (suffix<0) { return url+ - ((HttpScheme.HTTPS.equalsIgnoreCase(uri.getScheme()) || HttpScheme.HTTP.equalsIgnoreCase(uri.getScheme())) && uri.getPath()==null?"/":"") + //if no path, insert the root path + ((HttpScheme.HTTPS.is(uri.getScheme()) || HttpScheme.HTTP.is(uri.getScheme())) && uri.getPath()==null?"/":"") + //if no path, insert the root path sessionURLPrefix+id; } return url.substring(0,suffix)+ - ((HttpScheme.HTTPS.equalsIgnoreCase(uri.getScheme()) || HttpScheme.HTTP.equalsIgnoreCase(uri.getScheme())) && uri.getPath()==null?"/":"")+ //if no path so insert the root path + ((HttpScheme.HTTPS.is(uri.getScheme()) || HttpScheme.HTTP.is(uri.getScheme())) && uri.getPath()==null?"/":"")+ //if no path so insert the root path sessionURLPrefix+id+url.substring(suffix); } @@ -334,7 +331,7 @@ public class Response implements HttpServletResponse else { setHeader(HttpHeader.CACHE_CONTROL, "must-revalidate,no-cache,no-store"); - setContentType(MimeTypes.TEXT_HTML_8859_1); + setContentType(MimeTypes.Type.TEXT_HTML_8859_1.toString()); ByteArrayISO8859Writer writer= new ByteArrayISO8859Writer(2048); if (message != null) { @@ -382,7 +379,6 @@ public class Response implements HttpServletResponse _connection.getRequestFields().remove(HttpHeader.CONTENT_LENGTH); _characterEncoding=null; _mimeType=null; - _cachedMimeType=null; } complete(); @@ -494,13 +490,37 @@ public class Response implements HttpServletResponse _connection.getResponseFields().addDateField(name, date); } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#setHeader(java.lang.String, java.lang.String) + */ + public void setHeader(HttpHeader name, String value) + { + if (HttpHeader.CONTENT_TYPE == name) + setContentType(value); + else + { + if (_connection.isIncluding()) + return; + + _connection.getResponseFields().put(name, value); + + if (HttpHeader.CONTENT_LENGTH==name) + { + if (value==null) + _connection._generator.setContentLength(-1); + else + _connection._generator.setContentLength(Long.parseLong(value)); + } + } + } /* ------------------------------------------------------------ */ /* * @see javax.servlet.http.HttpServletResponse#setHeader(java.lang.String, java.lang.String) */ public void setHeader(String name, String value) { - if (HttpHeader.CONTENT_TYPE.equalsIgnoreCase(name)) + if (HttpHeader.CONTENT_TYPE.is(name)) setContentType(value); else { @@ -512,7 +532,7 @@ public class Response implements HttpServletResponse return; } _connection.getResponseFields().put(name, value); - if (HttpHeader.CONTENT_LENGTH.equalsIgnoreCase(name)) + if (HttpHeader.CONTENT_LENGTH.is(name)) { if (value==null) _connection._generator.setContentLength(-1); @@ -565,7 +585,7 @@ public class Response implements HttpServletResponse } _connection.getResponseFields().add(name, value); - if (HttpHeader.CONTENT_LENGTH.equalsIgnoreCase(name)) + if (HttpHeader.CONTENT_LENGTH.is(name)) _connection._generator.setContentLength(Long.parseLong(value)); } @@ -578,7 +598,7 @@ public class Response implements HttpServletResponse if (!_connection.isIncluding()) { _connection.getResponseFields().putLongField(name, value); - if (HttpHeader.CONTENT_LENGTH.equalsIgnoreCase(name)) + if (HttpHeader.CONTENT_LENGTH.is(name)) _connection._generator.setContentLength(value); } } @@ -592,7 +612,7 @@ public class Response implements HttpServletResponse if (!_connection.isIncluding()) { _connection.getResponseFields().addLongField(name, value); - if (HttpHeader.CONTENT_LENGTH.equalsIgnoreCase(name)) + if (HttpHeader.CONTENT_LENGTH.is(name)) _connection._generator.setContentLength(value); } } @@ -690,10 +710,6 @@ public class Response implements HttpServletResponse if (encoding==null) { - /* implementation of educated defaults */ - if(_cachedMimeType != null) - encoding = MimeTypes.getCharsetFromContentType(_cachedMimeType); - if (encoding==null) encoding = StringUtil.__ISO_8859_1; @@ -726,10 +742,7 @@ public class Response implements HttpServletResponse if (_characterEncoding!=null) { _characterEncoding=null; - if (_cachedMimeType!=null) - _connection.getResponseFields().put(HttpHeader.CONTENT_TYPE,_cachedMimeType); - else - _connection.getResponseFields().put(HttpHeader.CONTENT_TYPE,_mimeType); + _connection.getResponseFields().put(HttpHeader.CONTENT_TYPE,_mimeType); } } else @@ -742,15 +755,6 @@ public class Response implements HttpServletResponse if (i0<0) { _contentType=null; - if(_cachedMimeType!=null) - { - CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); - if (content_type!=null) - { - _contentType=content_type.toString(); - _connection.getResponseFields().put(HttpHeader.CONTENT_TYPE,content_type); - } - } if (_contentType==null) { @@ -848,7 +852,6 @@ public class Response implements HttpServletResponse if (_locale==null) _characterEncoding=null; _mimeType=null; - _cachedMimeType=null; _contentType=null; _connection.getResponseFields().remove(HttpHeader.CONTENT_TYPE); } @@ -863,7 +866,7 @@ public class Response implements HttpServletResponse // Extract params off mimetype _mimeType=contentType.substring(0,i0).trim(); - _cachedMimeType=MimeTypes.CACHE.get(_mimeType); + MimeTypes.Type mime_type=MimeTypes.CACHE.get(_mimeType); // Look for charset int i1=contentType.indexOf("charset=",i0+1); @@ -878,9 +881,9 @@ public class Response implements HttpServletResponse // strip the charset and ignore; if ((i1==i0+1 && i2<0) || (i1==i0+2 && i2<0 && contentType.charAt(i0+1)==' ')) { - if (_cachedMimeType!=null) + if (mime_type!=null) { - CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); + CachedBuffer content_type = mime_type.getAssociate(_characterEncoding); if (content_type!=null) { _contentType=content_type.toString(); @@ -912,12 +915,12 @@ public class Response implements HttpServletResponse else if ((i1==i0+1 && i2<0) || (i1==i0+2 && i2<0 && contentType.charAt(i0+1)==' ')) { // The params are just the char encoding - _cachedMimeType=MimeTypes.CACHE.get(_mimeType); + mime_type=MimeTypes.CACHE.get(_mimeType); _characterEncoding = QuotedStringTokenizer.unquote(contentType.substring(i8)); - if (_cachedMimeType!=null) + if (mime_type!=null) { - CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); + CachedBuffer content_type = mime_type.getAssociate(_characterEncoding); if (content_type!=null) { _contentType=content_type.toString(); @@ -950,7 +953,7 @@ public class Response implements HttpServletResponse } else // No encoding in the params. { - _cachedMimeType=null; + mime_type=null; _contentType=_characterEncoding==null?contentType:contentType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); _connection.getResponseFields().put(HttpHeader.CONTENT_TYPE,_contentType); }