HttpTransport() { acceptor = new HttpAcceptor(); connector = new HttpConnector(); }
@Override protected <T extends ConnectFuture> ConnectFuture connectInternal(final ResourceAddress address, final IoHandler handler, final IoSessionInitializer<T> initializer) { final ConnectFuture connectFuture = new DefaultConnectFuture(); final ResourceAddress transportAddress = address.getTransport(); // initializer for bridge session to specify bridge handler, // and call user-defined bridge session initializer if present final IoSessionInitializer<T> httpSessionInitializer = createHttpSessionInitializer(handler, initializer); // factory to create a new bridge session HttpConnectSessionFactory httpSessionFactory = new DefaultHttpConnectSessionFactory(this, address, httpSessionInitializer, connectFuture); if (transportAddress != null) { Executor ioExecutor = org.kaazing.mina.core.session.AbstractIoSessionEx.CURRENT_WORKER.get(); if (ioExecutor == null) { connectInternal0(connectFuture, address, httpSessionFactory); } else { ioExecutor.execute(() -> connectInternal0(connectFuture, address, httpSessionFactory)); } } return connectFuture; }
private <T extends ConnectFuture> void connectInternal0(ConnectFuture connectFuture, final ResourceAddress address, HttpConnectSessionFactory httpSessionFactory) { IoSession transportSession = persistentConnectionsStore.take((HttpResourceAddress) address); if (transportSession != null) { connectUsingExistingTransport(connectFuture, transportSession, httpSessionFactory); } else { connectUsingNewTransport(connectFuture, address, httpSessionFactory); } }
@Override public void removeBridgeFilters(IoFilterChain filterChain) { for (HttpConnectFilter filter : allConnectFilters) { switch (filter) { case CODEC: // Note: we MUST NOT remove the codec filter until // after the first IoBuffer is received post-upgrade break; default: removeFilter(filterChain, filter.filterName()); break; } } }
@Override protected void doSessionOpened(IoSessionEx session) throws Exception { IoFilterChain filterChain = session.getFilterChain(); addBridgeFilters(filterChain); HttpConnectSessionFactory sessionFactory = HTTP_SESSION_FACTORY_KEY.remove(session); DefaultHttpSession httpSession = sessionFactory.get(session); HTTP_SESSION_KEY.set(session, httpSession); DefaultConnectFuture connectFuture = (DefaultConnectFuture) HTTP_CONNECT_FUTURE_KEY.remove(session); if (!connectFuture.isDone()) { // needed for http redirect as there will be a new connect on the wire connectFuture.setValue(httpSession); } }
private <T extends ConnectFuture> void connectUsingNewTransport(final ConnectFuture connectFuture, ResourceAddress address, HttpConnectSessionFactory httpSessionFactory) { // propagate connection failure, if necessary IoFutureListener<ConnectFuture> parentConnectListener = future -> { // fail bridge connect future if parent connect fails if (!future.isConnected()) { connectFuture.setException(future.getException()); } }; ResourceAddress transportAddress = address.getTransport(); BridgeConnector connector = bridgeServiceFactory.newBridgeConnector(transportAddress); IoSessionInitializer<ConnectFuture> parentInitializer = createParentInitializer(address, connectFuture, httpSessionFactory); connector.connect(transportAddress, bridgeHandler, parentInitializer).addListener(parentConnectListener); }
@Override protected void doSessionClosed(IoSessionEx session) throws Exception { DefaultHttpSession httpSession = HTTP_SESSION_KEY.remove(session); if (httpSession != null) { boolean connectionClose = hasCloseHeader(httpSession.getReadHeaders(HttpHeaders.HEADER_CONNECTION)); if (!httpSession.isClosing() && !connectionClose) { httpSession.setStatus(HttpStatus.SERVER_GATEWAY_TIMEOUT); httpSession.reset(new IOException(LoggingUtils.EARLY_TERMINATION_OF_IOSESSION_MESSAGE).fillInStackTrace()); return; } if (connectionClose && !httpSession.isClosing()) { httpSession.getProcessor().remove(httpSession); } if (!session.isClosing()) { IoFilterChain filterChain = session.getFilterChain(); removeBridgeFilters(filterChain); } } }