@@ -317,7 +317,11 @@ private void endRequest(Stream s) {
317
317
* @param stream to reset
318
318
* @return whether the stream should be considered as closed
319
319
*/
320
- private boolean reset (Stream stream ) {
320
+ private Boolean reset (Stream stream ) {
321
+ if (stream .reset ) {
322
+ return null ;
323
+ }
324
+ stream .reset = true ;
321
325
if (!responses .contains (stream )) {
322
326
requests .remove (stream );
323
327
return true ;
@@ -326,16 +330,20 @@ private boolean reset(Stream stream) {
326
330
return false ;
327
331
}
328
332
329
- private void writeHead (Stream stream , HttpRequestHead request , boolean chunked , ByteBuf buf , boolean end , boolean connect , PromiseInternal <Void > handler ) {
333
+ private void writeHead (Stream stream , HttpRequestHead request , boolean chunked , ByteBuf buf , boolean end , boolean connect , PromiseInternal <Void > listener ) {
330
334
writeToChannel (new MessageWrite () {
331
335
@ Override
332
336
public void write () {
337
+ if (stream .reset ) {
338
+ listener .fail ("Stream reset" );
339
+ return ;
340
+ }
333
341
stream .request = request ;
334
- beginRequest (stream , request , chunked , buf , end , connect , handler );
342
+ beginRequest (stream , request , chunked , buf , end , connect , listener );
335
343
}
336
344
@ Override
337
345
public void cancel (Throwable cause ) {
338
- handler .fail (cause );
346
+ listener .fail (cause );
339
347
}
340
348
});
341
349
}
@@ -344,6 +352,10 @@ private void writeBuffer(Stream stream, ByteBuf buff, boolean end, PromiseIntern
344
352
writeToChannel (new MessageWrite () {
345
353
@ Override
346
354
public void write () {
355
+ if (stream .reset ) {
356
+ listener .fail ("Stream reset" );
357
+ return ;
358
+ }
347
359
writeBuffer (stream , buff , end , (FutureListener <Void >)listener );
348
360
}
349
361
@@ -368,7 +380,7 @@ private abstract static class Stream {
368
380
private boolean responseEnded ;
369
381
private long bytesRead ;
370
382
private long bytesWritten ;
371
-
383
+ private boolean reset ;
372
384
373
385
Stream (ContextInternal context , Promise <HttpClientStream > promise , int id ) {
374
386
this .context = context ;
@@ -404,7 +416,6 @@ private static class StreamImpl extends Stream implements HttpClientStream {
404
416
405
417
private final Http1xClientConnection conn ;
406
418
private final InboundMessageQueue <Object > queue ;
407
- private boolean reset ;
408
419
private boolean closed ;
409
420
private Handler <HttpResponseHead > headHandler ;
410
421
private Handler <Buffer > chunkHandler ;
@@ -431,18 +442,16 @@ protected void handlePause() {
431
442
}
432
443
@ Override
433
444
protected void handleMessage (Object item ) {
434
- if (!reset ) {
435
- if (item instanceof MultiMap ) {
436
- Handler <MultiMap > handler = endHandler ;
437
- if (handler != null ) {
438
- context .dispatch ((MultiMap ) item , handler );
439
- }
440
- } else {
441
- Buffer buffer = (Buffer ) item ;
442
- Handler <Buffer > handler = chunkHandler ;
443
- if (handler != null ) {
444
- context .dispatch (buffer , handler );
445
- }
445
+ if (item instanceof MultiMap ) {
446
+ Handler <MultiMap > handler = endHandler ;
447
+ if (handler != null ) {
448
+ context .dispatch ((MultiMap ) item , handler );
449
+ }
450
+ } else {
451
+ Buffer buffer = (Buffer ) item ;
452
+ Handler <Buffer > handler = chunkHandler ;
453
+ if (handler != null ) {
454
+ context .dispatch (buffer , handler );
446
455
}
447
456
}
448
457
}
@@ -584,26 +593,24 @@ public Future<Void> reset(Throwable cause) {
584
593
Promise <Void > promise = context .promise ();
585
594
EventLoop eventLoop = conn .context .nettyEventLoop ();
586
595
if (eventLoop .inEventLoop ()) {
587
- _reset (cause , promise );
596
+ reset (cause , promise );
588
597
} else {
589
- eventLoop .execute (() -> _reset (cause , promise ));
598
+ eventLoop .execute (() -> reset (cause , promise ));
590
599
}
591
600
return promise .future ();
592
601
}
593
602
594
- private void _reset (Throwable cause , Promise <Void > promise ) {
595
- if (reset ) {
603
+ private void reset (Throwable cause , Promise <Void > promise ) {
604
+ Boolean removed = conn .reset (this );
605
+ if (removed == null ) {
596
606
promise .fail ("Stream already reset" );
597
- return ;
598
- }
599
- reset = true ;
600
- boolean removed = conn .reset (this );
601
- if (removed ) {
602
- context .execute (cause , this ::handleClosed );
603
607
} else {
604
- context .execute (cause , this ::handleException );
605
- }
606
- promise .complete ();
608
+ if (removed ) {
609
+ context .execute (cause , this ::handleClosed );
610
+ } else {
611
+ context .execute (cause , this ::handleException );
612
+ }
613
+ promise .complete (); }
607
614
}
608
615
609
616
@ Override
@@ -856,7 +863,9 @@ private void handleResponseChunk(Stream stream, ByteBuf chunk) {
856
863
Buffer buff = BufferInternal .safeBuffer (chunk );
857
864
int len = buff .length ();
858
865
stream .bytesRead += len ;
859
- stream .handleChunk (buff );
866
+ if (!stream .reset ) {
867
+ stream .handleChunk (buff );
868
+ }
860
869
}
861
870
862
871
private void handleResponseEnd (Stream stream , LastHttpContent trailer ) {
@@ -908,7 +917,9 @@ private void handleResponseEnd(Stream stream, LastHttpContent trailer) {
908
917
checkLifecycle ();
909
918
}
910
919
lastResponseReceivedTimestamp = System .currentTimeMillis ();
911
- stream .handleEnd (trailer );
920
+ if (!stream .reset ) {
921
+ stream .handleEnd (trailer );
922
+ }
912
923
if (stream .requestEnded ) {
913
924
stream .handleClosed (null );
914
925
}
0 commit comments