294563 removed UpgradeConnectionException from websocket handling
git-svn-id: svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk@1263 7e9141cc-0065-0410-87d8-b60c137991c4
This commit is contained in:
parent
6047b7cad2
commit
d208d55652
|
@ -133,7 +133,7 @@ public class HttpConnection implements Connection
|
|||
}
|
||||
}
|
||||
|
||||
public void handle() throws IOException
|
||||
public Connection handle() throws IOException
|
||||
{
|
||||
if (_exchange != null)
|
||||
_exchange.associate(this);
|
||||
|
@ -171,7 +171,7 @@ public class HttpConnection implements Connection
|
|||
Log.warn("Unexpected data received but no request sent");
|
||||
close();
|
||||
}
|
||||
return;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
if (!_exchange.isAssociated())
|
||||
|
@ -251,7 +251,7 @@ public class HttpConnection implements Connection
|
|||
if (_generator.flushBuffer()>0)
|
||||
continue;
|
||||
}
|
||||
return;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
catch (Throwable e)
|
||||
|
@ -363,6 +363,8 @@ public class HttpConnection implements Connection
|
|||
_exchange.disassociate();
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean isIdle()
|
||||
|
|
|
@ -18,6 +18,7 @@ import java.net.Socket;
|
|||
import javax.net.SocketFactory;
|
||||
import javax.net.ssl.SSLContext;
|
||||
|
||||
import org.eclipse.jetty.io.Connection;
|
||||
import org.eclipse.jetty.io.EndPoint;
|
||||
import org.eclipse.jetty.io.bio.SocketEndPoint;
|
||||
import org.eclipse.jetty.util.component.AbstractLifeCycle;
|
||||
|
@ -67,7 +68,17 @@ class SocketConnector extends AbstractLifeCycle implements HttpClient.Connector
|
|||
{
|
||||
try
|
||||
{
|
||||
connection.handle();
|
||||
Connection con = connection;
|
||||
while(true)
|
||||
{
|
||||
final Connection next = con.handle();
|
||||
if (next!=con)
|
||||
{
|
||||
con=next;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
|
|
|
@ -17,7 +17,13 @@ import java.io.IOException;
|
|||
|
||||
public interface Connection
|
||||
{
|
||||
void handle() throws IOException, UpgradeConnectionException;
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* Handle the connection.
|
||||
* @return The Connection to use for the next handling of the connection. This allows protocol upgrades.
|
||||
* @throws IOException
|
||||
*/
|
||||
Connection handle() throws IOException;
|
||||
|
||||
long getTimeStamp();
|
||||
|
||||
|
|
|
@ -1,26 +0,0 @@
|
|||
package org.eclipse.jetty.io;
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/** Upgrade Connection Exception
|
||||
* This exception is thrown when processing a protocol upgrade
|
||||
* to exit all the current connection handling and to
|
||||
* allow the {@link ConnectedEndPoint} to handle the new exception.
|
||||
*
|
||||
* Code that calls {@link org.eclipse.jetty.io.Connection#handle()}
|
||||
* should catch this exception and call {@link ConnectedEndPoint#setConnection(org.eclipse.jetty.io.Connection)}
|
||||
* with the new connection and then immediately call handle() again.
|
||||
*/
|
||||
public class UpgradeConnectionException extends RuntimeException
|
||||
{
|
||||
Connection _connection;
|
||||
|
||||
public UpgradeConnectionException(Connection newConnection)
|
||||
{
|
||||
_connection=newConnection;
|
||||
}
|
||||
|
||||
public Connection getConnection()
|
||||
{
|
||||
return _connection;
|
||||
}
|
||||
}
|
|
@ -24,7 +24,6 @@ import org.eclipse.jetty.io.Buffer;
|
|||
import org.eclipse.jetty.io.ConnectedEndPoint;
|
||||
import org.eclipse.jetty.io.Connection;
|
||||
import org.eclipse.jetty.io.EofException;
|
||||
import org.eclipse.jetty.io.UpgradeConnectionException;
|
||||
import org.eclipse.jetty.io.nio.SelectorManager.SelectSet;
|
||||
import org.eclipse.jetty.util.log.Log;
|
||||
import org.eclipse.jetty.util.thread.Timeout;
|
||||
|
@ -470,14 +469,16 @@ public class SelectChannelEndPoint extends ChannelEndPoint implements Runnable,
|
|||
{
|
||||
try
|
||||
{
|
||||
_connection.handle();
|
||||
}
|
||||
catch (UpgradeConnectionException e)
|
||||
{
|
||||
Log.debug(e.toString());
|
||||
Log.ignore(e);
|
||||
setConnection(e.getConnection());
|
||||
continue;
|
||||
while(true)
|
||||
{
|
||||
final Connection next = _connection.handle();
|
||||
if (next!=_connection)
|
||||
{
|
||||
_connection=next;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (ClosedChannelException e)
|
||||
{
|
||||
|
|
|
@ -45,7 +45,6 @@ import org.eclipse.jetty.io.EndPoint;
|
|||
import org.eclipse.jetty.io.EofException;
|
||||
import org.eclipse.jetty.io.RuntimeIOException;
|
||||
import org.eclipse.jetty.io.UncheckedPrintWriter;
|
||||
import org.eclipse.jetty.io.UpgradeConnectionException;
|
||||
import org.eclipse.jetty.io.BufferCache.CachedBuffer;
|
||||
import org.eclipse.jetty.io.nio.SelectChannelEndPoint;
|
||||
import org.eclipse.jetty.util.QuotedStringTokenizer;
|
||||
|
@ -363,7 +362,7 @@ public class HttpConnection implements Connection
|
|||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
public void handle() throws IOException
|
||||
public Connection handle() throws IOException
|
||||
{
|
||||
// Loop while more in buffer
|
||||
boolean more_in_buffer =true; // assume true until proven otherwise
|
||||
|
@ -428,7 +427,7 @@ public class HttpConnection implements Connection
|
|||
}
|
||||
|
||||
if (!progress)
|
||||
return;
|
||||
return this;
|
||||
}
|
||||
progress=false;
|
||||
}
|
||||
|
@ -452,6 +451,16 @@ public class HttpConnection implements Connection
|
|||
|
||||
if (_parser.isComplete() && _generator.isComplete() && !_endp.isBufferingOutput())
|
||||
{
|
||||
if (_response.getStatus()==HttpStatus.SWITCHING_PROTOCOLS_101)
|
||||
{
|
||||
Connection connection = (Connection)_request.getAttribute("org.eclipse.jetty.io.Connection");
|
||||
if (connection!=null)
|
||||
{
|
||||
_parser.reset(true);
|
||||
return connection;
|
||||
}
|
||||
}
|
||||
|
||||
if (!_generator.isPersistent())
|
||||
{
|
||||
_parser.reset(true);
|
||||
|
@ -483,6 +492,7 @@ public class HttpConnection implements Connection
|
|||
setCurrentConnection(null);
|
||||
_handling=false;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
|
@ -564,10 +574,6 @@ public class HttpConnection implements Connection
|
|||
server.handleAsync(this);
|
||||
}
|
||||
}
|
||||
catch (UpgradeConnectionException e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
catch (ContinuationThrowable e)
|
||||
{
|
||||
Log.ignore(e);
|
||||
|
|
|
@ -21,7 +21,6 @@ import java.util.concurrent.LinkedBlockingQueue;
|
|||
import org.eclipse.jetty.io.ByteArrayBuffer;
|
||||
import org.eclipse.jetty.io.ByteArrayEndPoint;
|
||||
import org.eclipse.jetty.io.Connection;
|
||||
import org.eclipse.jetty.io.UpgradeConnectionException;
|
||||
import org.eclipse.jetty.util.StringUtil;
|
||||
import org.eclipse.jetty.util.log.Log;
|
||||
|
||||
|
@ -124,19 +123,16 @@ public class LocalConnector extends AbstractConnector
|
|||
{
|
||||
while (endPoint.getIn().length() > 0)
|
||||
{
|
||||
while(true)
|
||||
while (true)
|
||||
{
|
||||
try
|
||||
{
|
||||
endPoint.getConnection().handle();
|
||||
break;
|
||||
}
|
||||
catch (UpgradeConnectionException e)
|
||||
{
|
||||
Log.debug(e.toString());
|
||||
Log.ignore(e);
|
||||
endPoint.setConnection(e.getConnection());
|
||||
final Connection con = endPoint.getConnection();
|
||||
final Connection next = con.handle();
|
||||
if (next!=con)
|
||||
{
|
||||
endPoint.setConnection(next);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,7 +27,6 @@ import org.eclipse.jetty.io.ConnectedEndPoint;
|
|||
import org.eclipse.jetty.io.Connection;
|
||||
import org.eclipse.jetty.io.EndPoint;
|
||||
import org.eclipse.jetty.io.EofException;
|
||||
import org.eclipse.jetty.io.UpgradeConnectionException;
|
||||
import org.eclipse.jetty.io.bio.SocketEndPoint;
|
||||
import org.eclipse.jetty.server.AbstractConnector;
|
||||
import org.eclipse.jetty.server.HttpConnection;
|
||||
|
@ -239,25 +238,16 @@ public class SocketConnector extends AbstractConnector
|
|||
{
|
||||
if (isLowResources())
|
||||
{
|
||||
int lrmit = getLowResourceMaxIdleTime();
|
||||
int lrmit = getLowResourcesMaxIdleTime();
|
||||
if (lrmit>=0 && _sotimeout!= lrmit)
|
||||
{
|
||||
_sotimeout=lrmit;
|
||||
_socket.setSoTimeout(_sotimeout);
|
||||
}
|
||||
}
|
||||
}
|
||||
try
|
||||
{
|
||||
_connection.handle();
|
||||
}
|
||||
catch (UpgradeConnectionException e)
|
||||
{
|
||||
Log.debug(e.toString());
|
||||
Log.ignore(e);
|
||||
setConnection(e.getConnection());
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
_connection=_connection.handle();
|
||||
}
|
||||
}
|
||||
catch (EofException e)
|
||||
|
|
|
@ -25,7 +25,6 @@ import org.eclipse.jetty.io.ConnectedEndPoint;
|
|||
import org.eclipse.jetty.io.Connection;
|
||||
import org.eclipse.jetty.io.EndPoint;
|
||||
import org.eclipse.jetty.io.EofException;
|
||||
import org.eclipse.jetty.io.UpgradeConnectionException;
|
||||
import org.eclipse.jetty.io.nio.ChannelEndPoint;
|
||||
import org.eclipse.jetty.server.HttpConnection;
|
||||
import org.eclipse.jetty.server.Request;
|
||||
|
@ -167,14 +166,14 @@ public class BlockingChannelConnector extends AbstractNIOConnector
|
|||
try
|
||||
{
|
||||
connectionOpened(_connection);
|
||||
|
||||
|
||||
while (isOpen())
|
||||
{
|
||||
if (_connection.isIdle())
|
||||
{
|
||||
if (getServer().getThreadPool().isLowOnThreads())
|
||||
{
|
||||
int lrmit = getLowResourceMaxIdleTime();
|
||||
int lrmit = getLowResourcesMaxIdleTime();
|
||||
if (lrmit>=0 && _sotimeout!= lrmit)
|
||||
{
|
||||
_sotimeout=lrmit;
|
||||
|
@ -182,17 +181,8 @@ public class BlockingChannelConnector extends AbstractNIOConnector
|
|||
}
|
||||
}
|
||||
}
|
||||
try
|
||||
{
|
||||
_connection.handle();
|
||||
}
|
||||
catch (UpgradeConnectionException e)
|
||||
{
|
||||
Log.debug(e.toString());
|
||||
Log.ignore(e);
|
||||
setConnection(e.getConnection());
|
||||
continue;
|
||||
}
|
||||
|
||||
_connection = _connection.handle();
|
||||
}
|
||||
}
|
||||
catch (EofException e)
|
||||
|
|
|
@ -39,7 +39,6 @@ import org.eclipse.jetty.http.HttpException;
|
|||
import org.eclipse.jetty.http.PathMap;
|
||||
import org.eclipse.jetty.io.EofException;
|
||||
import org.eclipse.jetty.io.RuntimeIOException;
|
||||
import org.eclipse.jetty.io.UpgradeConnectionException;
|
||||
import org.eclipse.jetty.security.IdentityService;
|
||||
import org.eclipse.jetty.security.SecurityHandler;
|
||||
import org.eclipse.jetty.server.Dispatcher;
|
||||
|
@ -439,10 +438,6 @@ public class ServletHandler extends ScopedHandler
|
|||
{
|
||||
throw e;
|
||||
}
|
||||
catch(UpgradeConnectionException e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
if (!(DispatcherType.REQUEST.equals(type) || DispatcherType.ASYNC.equals(type)))
|
||||
|
|
|
@ -84,7 +84,7 @@ public class WebSocketConnection implements Connection, WebSocket.Outbound
|
|||
}
|
||||
}
|
||||
|
||||
public void handle() throws IOException
|
||||
public Connection handle() throws IOException
|
||||
{
|
||||
boolean more=true;
|
||||
|
||||
|
@ -120,6 +120,7 @@ public class WebSocketConnection implements Connection, WebSocket.Outbound
|
|||
// TODO - not really the best way
|
||||
_websocket.onDisconnect();
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean isOpen()
|
||||
|
|
|
@ -7,7 +7,6 @@ import javax.servlet.http.HttpServletResponse;
|
|||
|
||||
import org.eclipse.jetty.http.HttpParser;
|
||||
import org.eclipse.jetty.io.ConnectedEndPoint;
|
||||
import org.eclipse.jetty.io.UpgradeConnectionException;
|
||||
import org.eclipse.jetty.server.HttpConnection;
|
||||
|
||||
|
||||
|
@ -82,7 +81,7 @@ public class WebSocketFactory
|
|||
* @throws IOException
|
||||
*/
|
||||
public void upgrade(HttpServletRequest request,HttpServletResponse response, WebSocket websocket, String origin, String protocol)
|
||||
throws UpgradeConnectionException, IOException
|
||||
throws IOException
|
||||
{
|
||||
if (!"WebSocket".equals(request.getHeader("Upgrade")))
|
||||
throw new IllegalStateException("!Upgrade:websocket");
|
||||
|
@ -109,6 +108,7 @@ public class WebSocketFactory
|
|||
connection.fill(((HttpParser)http.getParser()).getBodyBuffer());
|
||||
|
||||
websocket.onConnect(connection);
|
||||
throw new UpgradeConnectionException(connection);
|
||||
request.setAttribute("org.eclipse.jetty.io.Connection",connection);
|
||||
response.flushBuffer();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,10 +6,6 @@ import javax.servlet.ServletException;
|
|||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.eclipse.jetty.http.HttpParser;
|
||||
import org.eclipse.jetty.io.ConnectedEndPoint;
|
||||
import org.eclipse.jetty.io.UpgradeConnectionException;
|
||||
import org.eclipse.jetty.server.HttpConnection;
|
||||
import org.eclipse.jetty.server.Request;
|
||||
import org.eclipse.jetty.server.handler.HandlerWrapper;
|
||||
|
||||
|
|
|
@ -7,11 +7,6 @@ import javax.servlet.http.HttpServlet;
|
|||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.eclipse.jetty.http.HttpParser;
|
||||
import org.eclipse.jetty.io.ConnectedEndPoint;
|
||||
import org.eclipse.jetty.io.UpgradeConnectionException;
|
||||
import org.eclipse.jetty.server.HttpConnection;
|
||||
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
|
|
|
@ -90,6 +90,7 @@ public class WebSocketTest extends TestCase
|
|||
ByteArrayBuffer out = _connector.getResponses(buffer,true);
|
||||
|
||||
String response = StringUtil.printable(out.asArray());
|
||||
System.err.println(response);
|
||||
|
||||
assertTrue(response.startsWith("HTTP/1.1 101 Web Socket Protocol Handshake"));
|
||||
assertTrue(response.contains("Upgrade: WebSocket"));
|
||||
|
|
Loading…
Reference in New Issue