Skip to content

Commit

Permalink
UNDERTOW-1337 Deployment does not fail if invalid websocket deploymen…
Browse files Browse the repository at this point in the history
…ts are added
  • Loading branch information
stuartwdouglas committed Apr 19, 2018
1 parent 159b3c2 commit 41bfa1a
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 2 deletions.
21 changes: 21 additions & 0 deletions servlet/src/main/java/io/undertow/servlet/api/DeploymentInfo.java
Expand Up @@ -35,6 +35,7 @@


import javax.servlet.DispatcherType; import javax.servlet.DispatcherType;
import javax.servlet.MultipartConfigElement; import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletContextListener;
import javax.servlet.descriptor.JspConfigDescriptor; import javax.servlet.descriptor.JspConfigDescriptor;


import io.undertow.security.api.AuthenticationMechanism; import io.undertow.security.api.AuthenticationMechanism;
Expand Down Expand Up @@ -193,6 +194,8 @@ public class DeploymentInfo implements Cloneable {


private boolean checkOtherSessionManagers = true; private boolean checkOtherSessionManagers = true;


private final List<ServletContextListener> deploymentCompleteListeners = new ArrayList<>();

/** /**
* A map of content encoding to file extension for pre compressed resource (e.g. gzip -> .gz) * A map of content encoding to file extension for pre compressed resource (e.g. gzip -> .gz)
*/ */
Expand Down Expand Up @@ -1348,6 +1351,23 @@ public DeploymentInfo setContainerMinorVersion(int containerMinorVersion) {
return this; return this;
} }


/**
* Add's a listener that is only invoked once all other deployment steps have been completed
*
* The listeners <code>contextDestroyed</code> method will be called after all undeployment steps are undertaken
*
* @param servletContextListener
* @return
*/
public DeploymentInfo addDeploymentCompleteListener(ServletContextListener servletContextListener) {
deploymentCompleteListeners.add(servletContextListener);
return this;
}

public List<ServletContextListener> getDeploymentCompleteListeners() {
return Collections.unmodifiableList(deploymentCompleteListeners);
}

@Override @Override
public DeploymentInfo clone() { public DeploymentInfo clone() {
final DeploymentInfo info = new DeploymentInfo() final DeploymentInfo info = new DeploymentInfo()
Expand Down Expand Up @@ -1440,6 +1460,7 @@ public DeploymentInfo clone() {
info.preCompressedResources.putAll(preCompressedResources); info.preCompressedResources.putAll(preCompressedResources);
info.containerMajorVersion = containerMajorVersion; info.containerMajorVersion = containerMajorVersion;
info.containerMinorVersion = containerMinorVersion; info.containerMinorVersion = containerMinorVersion;
info.deploymentCompleteListeners.addAll(deploymentCompleteListeners);
return info; return info;
} }


Expand Down
Expand Up @@ -90,6 +90,8 @@


import javax.servlet.ServletContainerInitializer; import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException; import javax.servlet.ServletException;


import java.io.File; import java.io.File;
Expand Down Expand Up @@ -253,6 +255,9 @@ public Void call(HttpServerExchange exchange, Object ignore) throws Exception {
//any problems with the paths won't get detected until the data is initialize //any problems with the paths won't get detected until the data is initialize
//so we force initialization here //so we force initialization here
deployment.getServletPaths().initData(); deployment.getServletPaths().initData();
for(ServletContextListener listener : deploymentInfo.getDeploymentCompleteListeners()) {
listener.contextInitialized(new ServletContextEvent(servletContext));
}
state = State.DEPLOYED; state = State.DEPLOYED;
} }


Expand Down Expand Up @@ -660,6 +665,9 @@ public void undeploy() {
deployment.createThreadSetupAction(new ThreadSetupHandler.Action<Void, Object>() { deployment.createThreadSetupAction(new ThreadSetupHandler.Action<Void, Object>() {
@Override @Override
public Void call(HttpServerExchange exchange, Object ignore) throws ServletException { public Void call(HttpServerExchange exchange, Object ignore) throws ServletException {
for(ServletContextListener listener : deployment.getDeploymentInfo().getDeploymentCompleteListeners()) {
listener.contextDestroyed(new ServletContextEvent(deployment.getServletContext()));
}
deployment.destroy(); deployment.destroy();
deployment = null; deployment = null;
state = State.UNDEPLOYED; state = State.UNDEPLOYED;
Expand Down
Expand Up @@ -104,6 +104,12 @@ public void handleDeployment(DeploymentInfo deploymentInfo, ServletContext servl
SecurityActions.addContainer(deploymentInfo.getClassLoader(), container); SecurityActions.addContainer(deploymentInfo.getClassLoader(), container);


deploymentInfo.addListener(Servlets.listener(WebSocketListener.class)); deploymentInfo.addListener(Servlets.listener(WebSocketListener.class));
deploymentInfo.addDeploymentCompleteListener(new ServletContextListener() {
@Override
public void contextInitialized(ServletContextEvent sce) {
container.validateDeployment();
}
});
} }


private static final class WebSocketListener implements ServletContextListener { private static final class WebSocketListener implements ServletContextListener {
Expand Down
Expand Up @@ -787,14 +787,20 @@ private ConfiguredClientEndpoint getClientEndpoint(final Class<?> endpointType,
} }




public void deploymentComplete() {
public void validateDeployment() {
if(!deploymentExceptions.isEmpty()) { if(!deploymentExceptions.isEmpty()) {
Exception e = JsrWebSocketMessages.MESSAGES.deploymentFailedDueToProgramaticErrors(); RuntimeException e = JsrWebSocketMessages.MESSAGES.deploymentFailedDueToProgramaticErrors();
for(DeploymentException ex : deploymentExceptions) { for(DeploymentException ex : deploymentExceptions) {
e.addSuppressed(ex); e.addSuppressed(ex);
} }
throw e;
} }
}

public void deploymentComplete() {
deploymentComplete = true; deploymentComplete = true;
validateDeployment();
} }


public List<ConfiguredServerEndpoint> getConfiguredServerEndpoints() { public List<ConfiguredServerEndpoint> getConfiguredServerEndpoints() {
Expand Down

0 comments on commit 41bfa1a

Please sign in to comment.