package io.cattle.platform.api.pubsub.subscribe.jetty;
import io.cattle.platform.api.pubsub.subscribe.MessageWriter;
import io.cattle.platform.api.pubsub.subscribe.NonBlockingSubscriptionHandler;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.websocket.server.WebSocketServerFactory;
import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
import org.eclipse.jetty.websocket.servlet.WebSocketCreator;
public class JettyWebSocketSubcriptionHandler extends NonBlockingSubscriptionHandler {
@Override
protected MessageWriter getMessageWriter(ApiRequest apiRequest) throws IOException {
HttpServletRequest req = apiRequest.getServletContext().getRequest();
HttpServletResponse resp = apiRequest.getServletContext().getResponse();
final WebSocketMessageWriter messageWriter = new WebSocketMessageWriter();
WebSocketServerFactory factory = new WebSocketServerFactory();
factory.getPolicy().setAsyncWriteTimeout(1000);
factory.setCreator(new WebSocketCreator() {
@Override
public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp) {
return messageWriter;
}
});
if ("websocket".equalsIgnoreCase(req.getHeader("Upgrade")) && factory.acceptWebSocket(req, resp)) {
apiRequest.setResponseCode(101);
apiRequest.commit();
return messageWriter;
} else {
return null;
}
}
}