protected void clientClose(final SelectionKey key) { log.traceNio(key,"clientClose()", "ENTER"); try { key.channel().close(); } catch (Exception ignore) { } NetCtx att = (NetCtx) key.attachment(); if (att != null) { synchronized (att) { if (att.getTlsContext() != null) att.getTlsContext().setSslState(CLOSING); } } }
protected void accept(SelectionKey key) { ServerSocketChannel ch = (ServerSocketChannel) key.channel(); SocketChannel s; try { while ((s = ch.accept()) != null) { long t0 = evtAccepts.time(); s.configureBlocking(false); NetCtx atta = ctxFactory.create(s, null,this); s.register(selector, OP_READ, atta); log.traceNio(key, "accept()", "AFTER"); if (sslContext != null) { TlsContext tctx = new TlsContext(); tctx.setSslEngine(sslContext.createSSLEngine()); tctx.getSslEngine().setUseClientMode(false); tctx.getSslEngine().beginHandshake(); tctx.setSslState(HANDSHAKE); atta.setTlsContext(tctx); log.traceNio(key, "accept()", "SSL"); } evtAccepts.call(t0); } } catch (Exception e) { // eg: too many open files. do not quit log.error("accept incoming request", e); evtAccepts.error(); } }
NetCtx atta = (NetCtx)key.attachment(); log.traceNio(key, "sslDataRead()", "ENTER"); while (tctx.getSslNetBuf().hasRemaining()) { buffer.clear(); log.traceNio(key, "sslDataRead()->unwrap()", "BEFORE"); SSLEngineResult result = tctx.getSslEngine().unwrap(tctx.getSslNetBuf(), buffer); log.traceNio(key, "sslDataRead()->unwrap()", result.getStatus().toString()); switch (result.getStatus()) { case OK:
log.traceNio(key, "run", "SELECTOR" + String.format("%02x",key.interestOps())); if (!key.isValid()) continue; if (key.isAcceptable()) { connect(key); } else if (key.isReadable()) { log.traceNio(key, "run", "SELECTOR/isReadable()"); NetCtx a = (NetCtx)key.attachment(); TlsContext tctx = a.getTlsContext(); log.traceNio(key, "run", "SELECTOR/isWritable()"); NetCtx a = (NetCtx)key.attachment(); TlsContext tctx = a.getTlsContext();
log.traceNio(key, "sslHandshake()", "ENTER"); log.traceNio(key, "sslHandshake()->unwrap()", "BEFORE"); result = engine.unwrap(tctx.getSslNetBuf(), tctx.getSslAppBuf()); log.traceNio(key, "sslHandshake()->unwrap()", "AFTER"); tctx.getSslNetBuf().compact(); handshakeStatus = result.getHandshakeStatus(); clientClose(key); tctx.setSslState(CLOSED); log.traceNio(key, "sslHandshake()->unwrap()", "CLOSED"); return; } catch (IOException e) { clientClose(key); tctx.setSslState(ERROR); log.traceNio(key, "sslHandshake()->unwrap()", "ERROR"); return; case BUFFER_OVERFLOW: tctx.setSslAppBuf(extendBuf(tctx.getSslAppBuf(), engine.getSession().getApplicationBufferSize(), 0, false)); log.traceNio(key, "sslHandshake()->unwrap()", "OVERFLOW"); break; case BUFFER_UNDERFLOW: { tctx.setSslNetBuf(extendBuf(tctx.getSslNetBuf(), engine.getSession().getPacketBufferSize(), 0, true)); log.traceNio(key, "sslHandshake->unwrap()", "UNDERFLOW"); return; tctx.getSslNetBuf().clear();