@Override protected void handshake(final Runnable handler) throws Exception { /** Infinite timeout because the continuation is never resumed but only completed on close. */ req.getAsyncContext().setTimeout(0L); /** Server sent events headers. */ rsp.setStatus(HttpServletResponse.SC_OK); rsp.setHeader("Connection", "Close"); rsp.setContentType("text/event-stream; charset=utf-8"); rsp.flushBuffer(); HttpChannel channel = rsp.getHttpChannel(); Connector connector = channel.getConnector(); Executor executor = connector.getExecutor(); executor.execute(handler); }
request.getAsyncContext().complete();
public void complete (Session session, Request request) { if (request.isAsyncStarted() && request.getDispatcherType() == DispatcherType.REQUEST) { request.getAsyncContext().addListener(new SessionAsyncListener(session)); } else { complete(session); } //if dispatcher type is not async and not request, complete immediately (its a forward or an include) //else if dispatcher type is request and not async, complete immediately //else register an async callback completion listener that will complete the session }
@Override protected void handshake(final Runnable handler) throws Exception { /** Infinite timeout because the continuation is never resumed but only completed on close. */ req.getAsyncContext().setTimeout(0L); /** Server sent events headers. */ rsp.setStatus(HttpServletResponse.SC_OK); rsp.setHeader("Connection", "Close"); rsp.setContentType("text/event-stream; charset=utf-8"); rsp.flushBuffer(); HttpChannel channel = rsp.getHttpChannel(); Connector connector = channel.getConnector(); Executor executor = connector.getExecutor(); executor.execute(handler); }
@Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try { super.handle(target, baseRequest, request, response); } catch(Error|IOException|ServletException|RuntimeException e) { if (!response.isCommitted() && !baseRequest.getHttpChannelState().isAsync()) response.setStatus(500); throw e; } finally { if (_requestLog != null && baseRequest.getDispatcherType().equals(DispatcherType.REQUEST)) { if (baseRequest.getHttpChannelState().isAsync()) { if (baseRequest.getHttpChannelState().isInitial()) baseRequest.getAsyncContext().addListener(_listener); } else _requestLog.log(baseRequest, (Response)response); } } }
if (!committed) LOG.warn("Could not send response error 500: "+x); _request.getAsyncContext().complete();