Merge branch 'jetty-9.2.x' into jetty-9.3.x

This commit is contained in:
Joakim Erdfelt 2016-11-02 11:33:43 -07:00
commit 3a8cdc93d8
2 changed files with 71 additions and 60 deletions

View File

@ -413,13 +413,22 @@ public class WebSocketServerFactory extends ContainerLifeCycle implements WebSoc
@Override
public boolean isUpgradeRequest(HttpServletRequest request, HttpServletResponse response)
{
if (!"GET".equalsIgnoreCase(request.getMethod()))
// Tests sorted by least common to most common.
String upgrade = request.getHeader("Upgrade");
if (upgrade == null)
{
// not a "GET" request (not a websocket upgrade)
// no "Upgrade: websocket" header present.
return false;
}
String connection = request.getHeader("connection");
if (!"websocket".equalsIgnoreCase(upgrade))
{
// Not a websocket upgrade
return false;
}
String connection = request.getHeader("Connection");
if (connection == null)
{
// no "Connection: upgrade" header present.
@ -443,17 +452,10 @@ public class WebSocketServerFactory extends ContainerLifeCycle implements WebSoc
{
return false;
}
String upgrade = request.getHeader("Upgrade");
if (upgrade == null)
if (!"GET".equalsIgnoreCase(request.getMethod()))
{
// no "Upgrade: websocket" header present.
return false;
}
if (!"websocket".equalsIgnoreCase(upgrade))
{
LOG.debug("Not a 'Upgrade: WebSocket' (was [Upgrade: " + upgrade + "])");
// not a "GET" request (not a websocket upgrade)
return false;
}

View File

@ -183,17 +183,19 @@ public class WebSocketUpgradeFilter extends ContainerLifeCycle implements Filter
chain.doFilter(request,response);
return;
}
if (LOG.isDebugEnabled())
try
{
LOG.debug(".doFilter({}) - {}",fname,chain);
}
if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse))
{
HttpServletRequest httpreq = (HttpServletRequest)request;
HttpServletResponse httpresp = (HttpServletResponse)response;
HttpServletRequest httpreq = (HttpServletRequest) request;
HttpServletResponse httpresp = (HttpServletResponse) response;
if (!factory.isUpgradeRequest(httpreq, httpresp))
{
// Not an upgrade request, skip it
chain.doFilter(request, response);
return;
}
// Since this is a filter, we need to be smart about determining the target path
String contextPath = httpreq.getContextPath();
String target = httpreq.getRequestURI();
@ -201,45 +203,52 @@ public class WebSocketUpgradeFilter extends ContainerLifeCycle implements Filter
{
target = target.substring(contextPath.length());
}
if (factory.isUpgradeRequest(httpreq,httpresp))
MappedResource<WebSocketCreator> resource = pathmap.getMatch(target);
if (resource == null)
{
LOG.debug("target = [{}]",target);
MappedResource<WebSocketCreator> resource = pathmap.getMatch(target);
if (resource == null)
if (LOG.isDebugEnabled())
{
if (LOG.isDebugEnabled())
{
LOG.debug("WebSocket Upgrade on {} has no associated endpoint",target);
LOG.debug("PathMappings: {}",pathmap.dump());
}
// no match.
chain.doFilter(request,response);
return;
}
LOG.debug("WebSocket Upgrade detected on {} for endpoint {}",target,resource);
WebSocketCreator creator = resource.getResource();
// Store PathSpec resource mapping as request attribute
httpreq.setAttribute(PathSpec.class.getName(),resource.getPathSpec());
// We have an upgrade request
if (factory.acceptWebSocket(creator,httpreq,httpresp))
{
// We have a socket instance created
return;
}
// If we reach this point, it means we had an incoming request to upgrade
// but it was either not a proper websocket upgrade, or it was possibly rejected
// due to incoming request constraints (controlled by WebSocketCreator)
if (response.isCommitted())
{
// not much we can do at this point.
return;
LOG.debug("WebSocket Upgrade on {} has no associated endpoint", target);
LOG.debug("PathMappings: {}", pathmap.dump());
}
// no match.
chain.doFilter(request, response);
return;
}
if(LOG.isDebugEnabled())
{
LOG.debug("WebSocket Upgrade detected on {} for endpoint {}", target, resource);
}
WebSocketCreator creator = resource.getResource();
// Store PathSpec resource mapping as request attribute
httpreq.setAttribute(PathSpec.class.getName(), resource.getPathSpec());
// We have an upgrade request
if (factory.acceptWebSocket(creator, httpreq, httpresp))
{
// We have a socket instance created
return;
}
// If we reach this point, it means we had an incoming request to upgrade
// but it was either not a proper websocket upgrade, or it was possibly rejected
// due to incoming request constraints (controlled by WebSocketCreator)
if (response.isCommitted())
{
// not much we can do at this point.
return;
}
}
catch (ClassCastException e)
{
// We are in some kind of funky non-http environment.
if (LOG.isDebugEnabled())
{
LOG.debug("Not a HttpServletRequest, skipping WebSocketUpgradeFilter");
}
}