Skip to content

Commit 5b2c0cd

Browse files
authored
Merge pull request #821 from fl4via/UNDERTOW-1602
[UNDERTOW-1602] Don't immediatly attempt to resume if parsing was uns…
2 parents d2db4e1 + 8c61372 commit 5b2c0cd

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

core/src/main/java/io/undertow/protocols/http2/Http2Channel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ protected AbstractHttp2StreamSourceChannel createChannelImpl(FrameHeaderData fra
486486
boolean ack = Bits.anyAreSet(frameParser.flags, PING_FLAG_ACK);
487487
channel = new Http2PingStreamSourceChannel(this, pingParser.getData(), ack);
488488
if(!ack) { //not an ack from one of our pings, so send it back
489-
sendPing(pingParser.getData(), null, true);
489+
sendPing(pingParser.getData(), new Http2ControlMessageExceptionHandler(), true);
490490
}
491491
break;
492492
}

core/src/main/java/io/undertow/server/protocol/framed/AbstractFramedChannel.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ public abstract class AbstractFramedChannel<C extends AbstractFramedChannel<C, R
129129
private final List<ChannelListener<C>> closeTasks = new CopyOnWriteArrayList<>();
130130
private volatile boolean flushingSenders = false;
131131

132+
private boolean partialRead = false;
133+
132134
@SuppressWarnings("unused")
133135
private volatile int outstandingBuffers;
134136
private static final AtomicIntegerFieldUpdater<AbstractFramedChannel> outstandingBuffersUpdater = AtomicIntegerFieldUpdater.newUpdater(AbstractFramedChannel.class, "outstandingBuffers");
@@ -352,6 +354,7 @@ public synchronized R receive() throws IOException {
352354
channel.getSourceChannel().shutdownReads();
353355
return null;
354356
}
357+
partialRead = false;
355358
boolean requiresReinvoke = false;
356359
int reinvokeDataRemaining = 0;
357360
ReferenceCountedPooled pooled = this.readData;
@@ -470,6 +473,9 @@ public synchronized R receive() throws IOException {
470473
}
471474
return newChannel;
472475
}
476+
} else {
477+
//we set partial read to true so the read listener knows not to immediately call receive again
478+
partialRead = true;
473479
}
474480
return null;
475481
} catch (IOException|RuntimeException|Error e) {
@@ -943,7 +949,11 @@ public void handleEvent(final StreamSourceChannel channel) {
943949
UndertowLogger.REQUEST_IO_LOGGER.tracef("Invoking receive listener", receiver);
944950
ChannelListeners.invokeChannelListener(AbstractFramedChannel.this, listener);
945951
}
946-
if (readData != null && !readData.isFreed() && channel.isOpen()) {
952+
final boolean partialRead;
953+
synchronized (AbstractFramedChannel.this) {
954+
partialRead = AbstractFramedChannel.this.partialRead;
955+
}
956+
if (readData != null && !readData.isFreed() && channel.isOpen() && !partialRead) {
947957
try {
948958
runInIoThread(new Runnable() {
949959
@Override
@@ -955,6 +965,9 @@ public void run() {
955965
IoUtils.safeClose(AbstractFramedChannel.this);
956966
}
957967
}
968+
synchronized (AbstractFramedChannel.this) {
969+
AbstractFramedChannel.this.partialRead = false;
970+
}
958971
}
959972
}
960973

0 commit comments

Comments
 (0)