📄 sslhttpchannelendpoint.java
字号:
// h.append(_engine.getHandshakeStatus()).append('\n'); switch(_engine.getHandshakeStatus()) { case FINISHED: case NOT_HANDSHAKING: if (_closing || available==0) { if (consumed==0) consumed= -1; break loop; } int c=(header!=null && buffer!=null)?wrap(header,buffer):wrap(header); if (c>0) { consumed+=c; available-=c; } else if (c<0) { if (consumed==0) consumed=-1; break loop; } break; case NEED_UNWRAP: Buffer buf =_buffers.getBuffer(_engine.getSession().getApplicationBufferSize()); try { ByteBuffer bbuf = ((NIOBuffer)buf).getByteBuffer(); if (!unwrap(bbuf) && _engine.getHandshakeStatus()==HandshakeStatus.NEED_UNWRAP) { // h.append("break").append('\n'); break loop; } } finally { _buffers.returnBuffer(buf); } break; case NEED_TASK: { Runnable task; while ((task=_engine.getDelegatedTask())!=null) { // h.append("run task\n"); task.run(); } break; } case NEED_WRAP: { synchronized(_outBuffer) { try { _outNIOBuffer.compact(); int put=_outNIOBuffer.putIndex(); _outBuffer.position(); _result=null; _last="flush wrap"; _result=_engine.wrap(__NO_BUFFERS,_outBuffer); switch(_result.getStatus()) { case BUFFER_OVERFLOW: case BUFFER_UNDERFLOW: Log.warn("wrap {}",_result); case CLOSED: _closing=true; } // h.append("wrap=").append(result).append('\n'); _outNIOBuffer.setPutIndex(put+_result.bytesProduced()); } finally { _outBuffer.position(0); } } flush(); break; } } } return consumed; } /* ------------------------------------------------------------ */ public void flush() throws IOException { while (_outNIOBuffer.length()>0) { int flushed=super.flush(_outNIOBuffer); // h.append("flushed=").append(flushed).append(" of ").append(_outNIOBuffer.length()).append('\n'); if (flushed==0) { Thread.yield(); flushed=super.flush(_outNIOBuffer); // h.append("flushed2=").append(flushed).append(" of ").append(_outNIOBuffer.length()).append('\n'); } } } /* ------------------------------------------------------------ */ private ByteBuffer extractInputBuffer(Buffer buffer) { assert buffer instanceof NIOBuffer; NIOBuffer nbuf=(NIOBuffer)buffer; ByteBuffer bbuf=nbuf.getByteBuffer(); bbuf.position(buffer.putIndex()); return bbuf; } /* ------------------------------------------------------------ */ /** * @return true if progress is made */ private boolean unwrap(ByteBuffer buffer) throws IOException { if (_inNIOBuffer.hasContent()) _inNIOBuffer.compact(); else _inNIOBuffer.clear(); int total_filled=0; while (_inNIOBuffer.space()>0 && super.isOpen()) { try { int filled=super.fill(_inNIOBuffer); // h.append("fill=").append(filled).append('\n'); if (filled<=0) break; total_filled+=filled; } catch(IOException e) { if (_inNIOBuffer.length()==0) throw e; break; } } // h.append("inNIOBuffer=").append(_inNIOBuffer.length()).append('\n'); if (_inNIOBuffer.length()==0) { if(!isOpen()) throw new org.mortbay.jetty.EofException(); return false; } try { _inBuffer.position(_inNIOBuffer.getIndex()); _inBuffer.limit(_inNIOBuffer.putIndex()); _result=null; _last="unwrap"; _result=_engine.unwrap(_inBuffer,buffer); // h.append("unwrap=").append(result).append('\n'); _inNIOBuffer.skip(_result.bytesConsumed()); } finally { _inBuffer.position(0); _inBuffer.limit(_inBuffer.capacity()); } switch(_result.getStatus()) { case BUFFER_OVERFLOW: case BUFFER_UNDERFLOW: if (Log.isDebugEnabled()) Log.debug("unwrap {}",_result); return (total_filled > 0); case CLOSED: _closing=true; case OK: boolean progress=total_filled>0 ||_result.bytesConsumed()>0 || _result.bytesProduced()>0; // h.append("progress=").append(progress).append('\n'); return progress; default: Log.warn("unwrap "+_result); throw new IOException(_result.toString()); } } /* ------------------------------------------------------------ */ private ByteBuffer extractOutputBuffer(Buffer buffer,int n) { NIOBuffer nBuf=null; if (buffer.buffer() instanceof NIOBuffer) { nBuf=(NIOBuffer)buffer.buffer(); return nBuf.getByteBuffer(); } else { if (_reuseBuffer[n]==null) _reuseBuffer[n] = (NIOBuffer)_buffers.getBuffer(_session.getApplicationBufferSize()); NIOBuffer buf = _reuseBuffer[n]; buf.clear(); buf.put(buffer); return buf.getByteBuffer(); } } /* ------------------------------------------------------------ */ private int wrap(Buffer header, Buffer buffer) throws IOException { _gather[0]=extractOutputBuffer(header,0); synchronized(_gather[0]) { _gather[0].position(header.getIndex()); _gather[0].limit(header.putIndex()); _gather[1]=extractOutputBuffer(buffer,1); synchronized(_gather[1]) { _gather[1].position(buffer.getIndex()); _gather[1].limit(buffer.putIndex()); synchronized(_outBuffer) { int consumed=0; try { _outNIOBuffer.clear(); _outBuffer.position(0); _outBuffer.limit(_outBuffer.capacity()); _result=null; _last="wrap wrap"; _result=_engine.wrap(_gather,_outBuffer); // h.append("wrap2=").append(result).append('\n'); _outNIOBuffer.setGetIndex(0); _outNIOBuffer.setPutIndex(_result.bytesProduced()); consumed=_result.bytesConsumed(); } finally { _outBuffer.position(0); if (consumed>0 && header!=null) { int len=consumed<header.length()?consumed:header.length(); header.skip(len); consumed-=len; _gather[0].position(0); _gather[0].limit(_gather[0].capacity()); } if (consumed>0 && buffer!=null) { int len=consumed<buffer.length()?consumed:buffer.length(); buffer.skip(len); consumed-=len; _gather[1].position(0); _gather[1].limit(_gather[1].capacity()); } assert consumed==0; } } } } switch(_result.getStatus()) { case BUFFER_OVERFLOW: case BUFFER_UNDERFLOW: Log.warn("wrap {}",_result); case OK: return _result.bytesConsumed(); case CLOSED: _closing=true; return _result.bytesConsumed()>0?_result.bytesConsumed():-1; default: Log.warn("wrap "+_result); throw new IOException(_result.toString()); } } /* ------------------------------------------------------------ */ private int wrap(Buffer header) throws IOException { _gather[0]=extractOutputBuffer(header,0); synchronized(_gather[0]) { _gather[0].position(header.getIndex()); _gather[0].limit(header.putIndex()); int consumed=0; synchronized(_outBuffer) { try { _outNIOBuffer.clear(); _outBuffer.position(0); _outBuffer.limit(_outBuffer.capacity()); _result=null; _last="wrap wrap"; _result=_engine.wrap(_gather[0],_outBuffer); // h.append("wrap1=").append(result).append('\n'); _outNIOBuffer.setGetIndex(0); _outNIOBuffer.setPutIndex(_result.bytesProduced()); consumed=_result.bytesConsumed(); } finally { _outBuffer.position(0); if (consumed>0 && header!=null) { int len=consumed<header.length()?consumed:header.length(); header.skip(len); consumed-=len; _gather[0].position(0); _gather[0].limit(_gather[0].capacity()); } assert consumed==0; } } } switch(_result.getStatus()) { case BUFFER_OVERFLOW: case BUFFER_UNDERFLOW: Log.warn("wrap {}",_result); case OK: return _result.bytesConsumed(); case CLOSED: _closing=true; return _result.bytesConsumed()>0?_result.bytesConsumed():-1; default: Log.warn("wrap "+_result); throw new IOException(_result.toString()); } } /* ------------------------------------------------------------ */ public boolean isBufferingInput() { return _inNIOBuffer.hasContent(); } /* ------------------------------------------------------------ */ public boolean isBufferingOutput() { return _outNIOBuffer.hasContent(); } /* ------------------------------------------------------------ */ public boolean isBufferred() { return true; } /* ------------------------------------------------------------ */ public SSLEngine getSSLEngine() { return _engine; } /* ------------------------------------------------------------ */ public String toString() { return super.toString()+","+_engine.getHandshakeStatus()+", in/out="+_inNIOBuffer.length()+"/"+_outNIOBuffer.length()+" last "+_last+" "+_result; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -