private void registerListeners(HttpServerExchange exchange) { exchange.addExchangeCompleteListener((ex, next) -> { onAllDataRead(); next.proceed(); }); this.channel.getReadSetter().set(c -> onDataAvailable()); this.channel.getCloseSetter().set(c -> onAllDataRead()); this.channel.resumeReads(); }
public int read(final ByteBuffer dst) throws IOException { final StreamSourceChannel channel = this.channel; if (channel == null) { return -1; } return channel.read(dst); }
private void readFailed(final IOException e) { try { source.suspendReads(); sink.suspendWrites(); invokeChannelExceptionHandler(source, readExceptionHandler, e); } finally { pooledBuffer.free(); } }
public void setup(StreamSourceChannel channel) { channel.suspendReads(); channel.getReadSetter().set(this); channel.resumeReads(); }
public void wakeupReads() { if (allAreClear(state, FLAG_CLOSED | FLAG_FINISHED)) { delegate.wakeupReads(); } else { delegate.getIoThread().execute(ChannelListeners.getChannelListenerTask(this, readListener)); } }
public void resumeReads() { if (allAreClear(state, FLAG_CLOSED | FLAG_FINISHED)) { delegate.resumeReads(); } else { delegate.getIoThread().execute(ChannelListeners.getChannelListenerTask(this, readListener)); } }
public void handleEvent(final StreamSourceChannel channel) { if(connection.getOriginalSinkConduit().isWriteShutdown() || connection.getOriginalSourceConduit().isReadShutdown()) { safeClose(connection); channel.suspendReads(); return; buffer.clear(); try { res = channel.read(buffer); } catch (IOException e) { UndertowLogger.REQUEST_IO_LOGGER.ioException(e); if (!channel.isReadResumed()) { channel.getReadSetter().set(this); channel.resumeReads(); channel.shutdownReads(); final StreamSinkChannel responseChannel = connection.getChannel().getSinkChannel(); responseChannel.shutdownWrites(); safeClose(connection); } catch (IOException e) { UndertowLogger.REQUEST_LOGGER.debug("Received CPONG, starting next request"); state = new AjpRequestParseState(); channel.getReadSetter().set(this); channel.resumeReads(); } else { UndertowLogger.REQUEST_LOGGER.ignoringAjpRequestWithPrefixCode(state.prefix); channel.getReadSetter().set(null);
@Override public void handleRequest(final HttpServerExchange exchange) throws Exception { if(!exchange.isRequestComplete() && !HttpContinue.requiresContinueResponse(exchange.getRequestHeaders())) { final StreamSourceChannel channel = exchange.getRequestChannel(); int readBuffers = 0; final PooledByteBuffer[] bufferedData = new PooledByteBuffer[maxBuffers]; PooledByteBuffer buffer = exchange.getConnection().getByteBufferPool().allocate(); try { do { int r; ByteBuffer b = buffer.getBuffer(); r = channel.read(b); if (r == -1) { if (b.position() == 0) { final PooledByteBuffer finalBuffer = buffer; final int finalReadBuffers = readBuffers; channel.getReadSetter().set(new ChannelListener<StreamSourceChannel>() { channel.resumeReads(); return; } else if (!b.hasRemaining()) { break; buffer = exchange.getConnection().getByteBufferPool().allocate();
@Override public void run() { try { final FormData existing = exchange.getAttachment(FORM_DATA); if (existing != null) { exchange.dispatch(SameThreadExecutor.INSTANCE, handler); return; PooledByteBuffer pooled = exchange.getConnection().getByteBufferPool().allocate(); try { while (true) { int c = requestChannel.read(pooled.getBuffer()); if(c == 0) { requestChannel.getReadSetter().set(new ChannelListener<StreamSourceChannel>() { @Override public void handleEvent(StreamSourceChannel channel) { requestChannel.resumeReads(); return; } else if (c == -1) {
boolean free = true; try { final ByteBuffer buffer = allocated.getResource(); long transferred; for(;;) { try { transferred = source.transferTo(count, buffer, sink); } catch (IOException e) { invokeChannelExceptionHandler(source, readExceptionHandler, e); return; Channels.setReadListener(source, sourceListener); if (sourceListener == null) { source.suspendReads(); } else { source.wakeupReads(); source.suspendReads(); sink.suspendWrites(); invokeChannelExceptionHandler(source, readExceptionHandler, new EOFException()); source.suspendReads(); source.getReadSetter().set(listener); sink.getWriteSetter().set(listener); source.suspendReads(); } else { source.wakeupReads();
@Override public void parse(HttpHandler handler) throws Exception { if (exchange.getAttachment(FORM_DATA) != null) { handler.handleRequest(exchange); return; } this.handler = handler; StreamSourceChannel channel = exchange.getRequestChannel(); if (channel == null) { throw new IOException(UndertowMessages.MESSAGES.requestChannelAlreadyProvided()); } else { doParse(channel); if (state != 4) { channel.getReadSetter().set(this); channel.resumeReads(); } else { exchange.dispatch(SameThreadExecutor.INSTANCE, handler); } } }
int r; ByteBuffer b = buffer.getBuffer(); r = channel.read(b); if (r == -1) { if (b.position() == 0) { channel.getReadSetter().set(null); channel.suspendReads(); Connectors.executeRootHandler(next, exchange); return; Connectors.ungetRequestBytes(exchange, bufferedData); Connectors.resetRequestChannel(exchange); channel.getReadSetter().set(null); channel.suspendReads(); Connectors.executeRootHandler(next, exchange); return; buffer = exchange.getConnection().getByteBufferPool().allocate(); IoUtils.safeClose(buffer); exchange.endExchange();
return; PooledByteBuffer pooled = exchange.getConnection().getByteBufferPool().allocate(); final ByteBuffer buffer = pooled.getBuffer(); try { try { buffer.clear(); res = channel.read(buffer); if (res == -1) { done = true;
throw UndertowMessages.MESSAGES.argumentCannotBeNull("pool"); final PooledByteBuffer allocated = pool.allocate(); boolean free = true; try { for(;;) { try { read = source.read(buffer); buffer.flip(); } catch (IOException e) { ChannelListeners.invokeChannelExceptionHandler(source, readExceptionHandler, e); return; final int res; try { res = sink.write(buffer); } catch (IOException e) { ChannelListeners.invokeChannelExceptionHandler(sink, writeExceptionHandler, e); return; sink.getWriteSetter().set(listener); source.getReadSetter().set(listener); source.resumeReads(); sink.resumeWrites();
@Override public IoFuture<byte[]> readRequestData() { final ByteArrayOutputStream data = new ByteArrayOutputStream(); final PooledByteBuffer pooled = exchange.getConnection().getByteBufferPool().allocate(); final ByteBuffer buffer = pooled.getBuffer(); final StreamSourceChannel channel = exchange.getRequestChannel(); int res; for (; ; ) { try { res = channel.read(buffer); if (res == -1) { return new FinishedIoFuture<>(data.toByteArray()); channel.getReadSetter().set(new ChannelListener<StreamSourceChannel>() { @Override public void handleEvent(final StreamSourceChannel channel) { channel.resumeReads(); return future.getIoFuture(); } else {
public void handleEvent(final Channel channel) { if(done) { if(channel instanceof StreamSinkChannel) { ((StreamSinkChannel) channel).suspendWrites(); } else if(channel instanceof StreamSourceChannel) { ((StreamSourceChannel)channel).suspendReads(); pooledBuffer = pool.allocate(); noWrite = true; } else if(channel instanceof StreamSourceChannel) { read = source.read(buffer); buffer.flip(); } catch (IOException e) { pooledBuffer = null; done = true; ChannelListeners.invokeChannelExceptionHandler(source, readExceptionHandler, e); return; sink.suspendWrites(); source.suspendReads(); } else if(!source.isReadResumed()){ source.resumeReads();
public void handleEvent(final Channel channel) { final ByteBuffer buffer = pooledBuffer.getResource(); int state = this.state; lres = source.transferTo(count, buffer, sink); } catch (IOException e) { readFailed(e); ires = sink.write(buffer); } catch (IOException e) { writeFailed(e); this.count = count; this.state = 1; source.suspendReads(); sink.resumeWrites(); return; lres = source.transferTo(count, buffer, sink); } catch (IOException e) { readFailed(e); this.state = 0; sink.suspendWrites(); source.resumeReads(); return;
@Override @Nullable protected DataBuffer read() throws IOException { PooledByteBuffer pooledByteBuffer = this.byteBufferPool.allocate(); boolean release = true; try { ByteBuffer byteBuffer = pooledByteBuffer.getBuffer(); int read = this.channel.read(byteBuffer); if (rsReadLogger.isTraceEnabled()) { rsReadLogger.trace(getLogPrefix() + "Read " + read + (read != -1 ? " bytes" : "")); } if (read > 0) { byteBuffer.flip(); DataBuffer dataBuffer = this.bufferFactory.wrap(byteBuffer); release = false; return new UndertowDataBuffer(dataBuffer, pooledByteBuffer); } else if (read == -1) { onAllDataRead(); } return null; } finally { if (release && pooledByteBuffer.isOpen()) { pooledByteBuffer.close(); } } }
public void setup(final StreamSourceChannel channel) { PooledByteBuffer resource = bufferPool.allocate(); ByteBuffer buffer = resource.getBuffer(); try { int r = 0; do { r = channel.read(buffer); if (r == 0) { channel.getReadSetter().set(this); channel.resumeReads(); } else if (r == -1) { stringDone(string.extract()); IoUtils.safeClose(channel); } else { buffer.flip(); string.write(buffer); } } while (r > 0); } catch (IOException e) { error(e); } finally { resource.close(); } }
private static <I extends StreamSourceChannel, O extends StreamSinkChannel> void done(I source, O sink, ChannelListener<? super I> sourceListener, ChannelListener<? super O> sinkListener) { Channels.setReadListener(source, sourceListener); if (sourceListener == null) { source.suspendReads(); } else { source.wakeupReads(); } Channels.setWriteListener(sink, sinkListener); if (sinkListener == null) { sink.suspendWrites(); } else { sink.wakeupWrites(); } }