@Override public void operationComplete(ConnectFuture future) { String connectURI = getConnectURIs().iterator().next(); if (future.isConnected()) { DefaultHttpSession connectSession = (DefaultHttpSession) future.getSession(); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Connected to " + connectURI + " [" + acceptSession + "->" + connectSession + "]"); } if (acceptSession == null || acceptSession.isClosing()) { connectSession.close(true); } else { AttachedSessionManager attachedSessionManager = attachSessions(acceptSession, connectSession); connectSession.getCloseFuture().addListener(new Upgrader(connectSession, acceptSession)); acceptSession.getCloseFuture().addListener(new Upgrader(acceptSession, connectSession)); flushQueuedMessages(acceptSession, attachedSessionManager); } } else { LOGGER.warn("Connection to " + connectURI + " failed [" + acceptSession + "->]"); acceptSession.setStatus(HttpStatus.SERVER_GATEWAY_TIMEOUT); acceptSession.close(true); } }
boolean isChunked = "chunked".equals(session.getWriteHeader("Transfer-Encoding")); if (isChunked) { session.setChunked(true); if (!session.getRemoteAddress().getOption(HttpResourceAddress.USER_AGENT_HEADER_ENABLED) || !session.getRemoteAddress().getOption(HttpResourceAddress.HOST_HEADER_ENABLED) || session.getMethod() == HttpMethod.GET || session.getMethod() == HttpMethod.HEAD || "0".equals(session.getWriteHeader(HEADER_CONTENT_LENGTH)) || isChunked) { URI resource = session.getRemoteAddress().getResource(); httpRequest.setMethod(session.getMethod()); httpRequest.setRequestURI(session.getRequestURI()); httpRequest.setVersion(session.getVersion()); Map<String, List<String>> parameters = session.getParameters(); if (!parameters.isEmpty()) { httpRequest.setParameters(session.getParameters()); if (session.getWriteHeader(HttpHeaders.HEADER_USER_AGENT) == null && session.getRemoteAddress().getOption(HttpResourceAddress.USER_AGENT_HEADER_ENABLED) == Boolean.TRUE) { httpRequest.setHeader("User-Agent", "Kaazing Gateway"); httpRequest.putHeaders(session.getWriteHeaders()); httpRequest.setCookies(session.getWriteCookies()); if (session.getRemoteAddress().getOption(HttpResourceAddress.HOST_HEADER_ENABLED) == Boolean.TRUE) { httpRequest.setHeader(HttpHeaders.HEADER_HOST, resource.getAuthority()); IoBufferAllocatorEx<? extends HttpBuffer> allocator = session.getBufferAllocator();
@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); } } }
@Override public void operationComplete(CloseFuture future) { if (session.getStatus() == INFO_SWITCHING_PROTOCOLS) { ProxyUpgradeHandler handler = new ProxyUpgradeHandler(attachedSession.getParent()); session.suspendRead(); if (LOGGER.isDebugEnabled()) { LOGGER.debug(String.format("http.proxy service is upgrading session %s", session)); } session.upgrade(handler); } } }
private boolean validateRequestPath(DefaultHttpSession acceptSession) { URI requestURI = acceptSession.getRequestURI(); String acceptPath = acceptSession.getServicePath().getPath(); String requestPath = requestURI.normalize().getPath(); return requestPath.startsWith(acceptPath); }
/** * Helper method performing loop detection * @param acceptSession - session parameter * @return - whether a loop was detected or not */ private boolean validateNoLoopDetected(DefaultHttpSession acceptSession) { List<String> viaHeaders = acceptSession.getReadHeaders(HEADER_VIA); if (viaHeaders != null && viaHeaders.stream().anyMatch(h -> h.equals(viaHeader))) { LOGGER.warn("Connection to " + getConnectURIs().iterator().next() + " failed due to loop detection [" + acceptSession + "->]"); acceptSession.setStatus(HttpStatus.SERVER_LOOP_DETECTED); acceptSession.close(true); return false; } return true; }
final IoSession parent = session.getParent(); if (parent == null || parent.isClosing()) { return; final CommitFuture commitFuture = session.getCommitFuture(); if (commitFuture.isCommitted()) { return; httpResponse.setStatus(session.getStatus()); httpResponse.setReason(session.getReason()); httpResponse.setVersion(session.getVersion()); httpResponse.setHeaders(session.getWriteHeaders()); httpResponse.setInjectableHeaders(session.getLocalAddress().getOption(INJECTABLE_HEADERS)); httpResponse.setCookies(session.getWriteCookies()); httpResponse.setBlockPadding(session.getParameter(".kbp") != null); boolean complete = (session.getCurrentWriteRequest() == null) && session.getWriteRequestQueue().isEmpty(session) && session.isClosing(); IoBufferAllocatorEx<? extends HttpBuffer> allocator = session.getBufferAllocator(); HttpBuffer unsharedEmpty = allocator.wrap(allocator.allocate(0)); httpResponse.setContent(new HttpContentMessage(unsharedEmpty, complete)); if (session.getMethod() == HttpMethod.HEAD) { httpResponse.setContentExcluded(true); switch (session.getVersion()) { case HTTP_1_1: boolean isConnectionClose = "close".equals(session.getWriteHeader("Connection")); String contentLength = session.getWriteHeader(HEADER_CONTENT_LENGTH); if (contentLength == null) {
@Override protected void flushInternal(final DefaultHttpSession session) { IoFilterChain filterChain = session.getFilterChain(); WriteRequestQueue writeRequestQueue = session.getWriteRequestQueue(); do { WriteRequest request = writeRequestQueue.poll(session); IoSessionEx parent = session.getParent(); if (parent.isClosing()) { if (session.isCommitting()) { new HttpContentMessage(buf, buf == WRITE_COMPLETE, session.isChunked(), false); flushNowInternal(parent, content, buf, filterChain, request); } else { httpRequest.setMethod(session.getMethod()); httpRequest.setRequestURI(session.getRequestURI()); httpRequest.setVersion(session.getVersion()); httpRequest.putHeaders(session.getWriteHeaders()); httpRequest.setHeader(HttpHeaders.HEADER_HOST, session.getRemoteAddress().getResource().getAuthority()); httpRequest.setCookies(session.getWriteCookies()); session.commit(); session.increaseWrittenBytes(written, System.currentTimeMillis()); } catch (Exception e) { request.getFuture().setException(e);
req.setVersion(session.getVersion()); req.setMethod(session.getMethod()); req.setParameters(session.getParameters()); req.setRequestURI(session.getRequestURI()); req.setSecure(session.isSecure()); req.setCookies(session.getReadCookies()); String contentLengthStr = session.getReadHeader("Content-Length"); if (contentLengthStr != null && !"0".equals(contentLengthStr)) { IoBufferAllocatorEx<? extends HttpBuffer> allocator = session.getBufferAllocator(); HttpContentMessage httpContent = new HttpContentMessage(allocator.wrap(allocator.allocate(0)), false); req.setContent(httpContent); Map<String,List<String>> requestHeaders = new HashMap<>(session.getReadHeaders()); req.setHeaders(requestHeaders); HttpUtils.restrictHeaders(req, HTTPXE_ENVELOPE_HEADERS); req.setSubject(session.getSubject()); req.setLoginContext(session.getLoginContext()); Map<String,List<String>> sessionHeaders = new HashMap<>(httpSession.getReadHeaders()); sessionHeaders.put(HEADER_CONTENT_TYPE, Collections.singletonList(CONTENT_TYPE_APPLICATION_X_MESSAGE_HTTP)); httpSession.setReadHeaders(sessionHeaders);
private void removeInternal0(DefaultHttpSession session) { IoSession parent = session.getParent(); if (parent == null || parent.isClosing()) { return; Integer keepAliveTimeout = session.getRemoteAddress().getOption(HttpResourceAddress.KEEP_ALIVE_TIMEOUT); assert keepAliveTimeout != null; boolean http10 = session.getVersion() == HttpVersion.HTTP_1_0; boolean gatewayToClose = hasCloseHeader(session.getWriteHeaders(HEADER_CONNECTION)); boolean serverToClose = hasCloseHeader(session.getReadHeaders(HEADER_CONNECTION)); boolean upgrade = session.getStatus() == INFO_SWITCHING_PROTOCOLS; if ("chunked".equals(session.getWriteHeader("Transfer-Encoding"))) { IoBufferAllocatorEx<? extends HttpBuffer> allocator = session.getBufferAllocator(); HttpBuffer unsharedEmpty = allocator.wrap(allocator.allocate(0)); HttpContentMessage completeMessage = new HttpContentMessage(unsharedEmpty, true, session.isChunked(), session.isGzipped()); parent.write(completeMessage); session.getCloseFuture().addListener(new IoFutureListener<CloseFuture>() { @Override public void operationComplete(CloseFuture future) { if (!session.getCloseFuture().isClosed()) { parent.getConfig().setBothIdleTime(keepAliveTimeout); parent.getFilterChain().addLast(IDLE_FILTER, idleFilter);
httpSession.setStatus(httpStatus); httpSession.setReason(httpResponse.getReason()); httpSession.setVersion(httpResponse.getVersion()); httpSession.setReadHeaders(httpResponse.getHeaders()); httpSession.getResponseFuture().setReady(); httpSession.close(false); break; case SUCCESS_OK: switch (httpSession.getMethod()) { case HEAD: httpSession.close(false); break; default: HttpContentMessage httpContent = httpResponse.getContent(); if (httpContent == null) { IoBufferAllocatorEx<? extends HttpBuffer> allocator = httpSession.getBufferAllocator(); httpContent = new HttpContentMessage(allocator.wrap(allocator.allocate(0)), true); break; case SUCCESS_NO_CONTENT: httpSession.close(false); break; case CLIENT_UNAUTHORIZED: HttpContentMessage httpContent = httpResponse.getContent(); if (httpContent == null) { IoBufferAllocatorEx<? extends HttpBuffer> allocator = httpSession.getBufferAllocator();
case CLIENT_BAD_REQUEST: case SUCCESS_CREATED: boolean httpxeSpecCompliant = httpSession.isHttpxeSpecCompliant(); if (httpxeSpecCompliant) { httpSession.setStatus(httpResponse.getStatus()); httpSession.setVersion(httpResponse.getVersion()); Map<String,List<String>> remainingHttpxeLevelHeaders = httpResponse.getHeaders(); if ( values != null ) { for ( String value: values) { httpSession.addWriteHeader(headerName,value); Map<String, List<String>> writeHeaders = httpSession.getWriteHeaders(); for (String headerName: writeHeaders.keySet()) { List<String> possiblyDuplicateStrings = writeHeaders.get(headerName); HashSet<HttpCookie> httpxeAndSessionCookies = new HashSet<>(httpSession.getWriteCookies()); httpxeAndSessionCookies.addAll(httpResponse.getCookies()); httpSession.setWriteCookies(httpxeAndSessionCookies); httpSession.setReason(httpResponse.getReason()); boolean hasExplicitDefinedContentLength = httpSession.getWriteHeader(HEADER_CONTENT_LENGTH) != null; if ( hasExplicitDefinedContentLength ) { IoFilterChain chain = session.getFilterChain(); IoBufferAllocatorEx<?> allocator = httpSession.getBufferAllocator();
if (httpSession.getStatus() != null) { httpSession.getCloseFuture().setClosed(); IoHandler upgradeHandler = httpSession.getUpgradeHandler(); if (upgradeHandler == null) { removeInternal0(httpSession); } else { final UpgradeFuture upgradeFuture = httpSession.getUpgradeFuture(); IoSessionEx parent = httpSession.getParent(); try { if (parent instanceof AbstractBridgeSession<?, ?>) {
private void removeInternal0(DefaultHttpSession session) { IoSession parent = session.getParent(); if (parent == null || parent.isClosing()) { return; } boolean connectionClose = session.isConnectionClose(); if (connectionClose) { // close TCP connection when write complete parent.close(false); } else { // write the empty chunk IoBufferAllocatorEx<? extends HttpBuffer> allocator = session.getBufferAllocator(); HttpBuffer unsharedEmpty = allocator.wrap(allocator.allocate(0)); HttpContentMessage completeMessage = new HttpContentMessage(unsharedEmpty, true, session.isChunked(), session.isGzipped()); parent.write(completeMessage); } }
if (acceptSession.getVersion().toString().equals("HTTP/1.0")) { if (this.serviceName != null) { LOGGER.warn(String.format( acceptSession.setStatus(CLIENT_NOT_FOUND); acceptSession.close(false); return;
@Override public void initializeSession(IoSession session, ConnectFuture future) { HttpConnectSession connectSession = (HttpConnectSession) session; connectSession.setVersion(acceptSession.getVersion()); connectSession.setMethod(acceptSession.getMethod()); URI connectURI = computeConnectPath(connectSession.getRequestURI()); connectSession.setRequestURI(connectURI); processRequestHeaders(acceptSession, connectSession); }
@Override public void operationComplete(CommitFuture future) { final DefaultHttpSession session = (DefaultHttpSession) future.getSession(); if (session.getStatus() == HttpStatus.INFO_SWITCHING_PROTOCOLS) { CloseFuture closeFuture = session.getCloseFuture(); closeFuture.addListener(new IoFutureListener<CloseFuture>() { @Override
@Override public void operationComplete(CloseFuture future) { IoSession parent = session.getParent(); if (parent == null || parent.isClosing()) { return; final UpgradeFuture upgradeFuture = session.getUpgradeFuture(); final IoHandler upgradeHandler = session.getUpgradeHandler(); if (upgradeHandler != null) { IoHandler oldHandler;
private boolean add(DefaultHttpSession httpSession) { HttpResourceAddress serverAddress = (HttpResourceAddress)httpSession.getRemoteAddress(); IoSession transportSession = httpSession.getParent(); ServerConnections serverConnections = connections.get(); boolean cached = serverConnections.add(serverAddress, transportSession); if (cached) { if (logger.isDebugEnabled()) { int cachedConnections = serverConnections.cachedConnections(serverAddress); logger.debug(String.format("Caching persistent connection: server = %s session = %s pool = %d", serverAddress.getResource(), transportSession, cachedConnections)); } return true; } else { if (logger.isDebugEnabled()) { int cachedConnections = serverConnections.cachedConnections(serverAddress); logger.debug(String.format("NOT caching persistent connection: server = %s session = %s pool = %d", serverAddress.getResource(), transportSession, cachedConnections)); } } return false; }
@Override protected void doSessionClosed(IoSessionEx session) throws Exception { // if iosession is not being closed then a higher level is asking to close out this http session, likely for upgrade if (!session.isClosing()) { IoFilterChain filterChain = session.getFilterChain(); removeBridgeFilters(filterChain); } DefaultHttpSession httpSession = SESSION_KEY.remove(session); if (httpSession != null && !httpSession.isClosing()) { httpSession.reset(new IOException(LoggingUtils.EARLY_TERMINATION_OF_IOSESSION_MESSAGE).fillInStackTrace()); } }