@@ -423,6 +423,7 @@ public void writeBlocking0(ByteBuf data, boolean last) throws IOException {
423
423
if (last && data == null ) {
424
424
return ;
425
425
}
426
+ data .release ();
426
427
throw new IOException ("Response already complete" );
427
428
}
428
429
if (last && data == null ) {
@@ -438,15 +439,22 @@ public void writeBlocking0(ByteBuf data, boolean last) throws IOException {
438
439
//do all this in the same lock
439
440
synchronized (request .connection ()) {
440
441
awaitWriteable ();
441
- if (last ) {
442
- responseDone = true ;
443
- if (upgradeHandler == null ) {
444
- request .response ().end (createBuffer (data ));
442
+ try {
443
+ if (last ) {
444
+ responseDone = true ;
445
+ if (upgradeHandler == null ) {
446
+ request .response ().end (createBuffer (data ));
447
+ } else {
448
+ request .response ().end (createBuffer (data ), upgradeHandler );
449
+ }
445
450
} else {
446
- request .response ().end (createBuffer (data ), upgradeHandler );
451
+ request .response ().write (createBuffer (data ));
447
452
}
448
- } else {
449
- request .response ().write (createBuffer (data ));
453
+ } catch (Exception e ) {
454
+ if (data != null ) {
455
+ data .release ();
456
+ }
457
+ throw new IOException ("Failed to write" , e );
450
458
}
451
459
}
452
460
} finally {
@@ -499,6 +507,9 @@ public <T> void writeAsync0(ByteBuf data, boolean last, IoCallback<T> callback,
499
507
response .headers ().add (HttpHeaderNames .CONNECTION , "close" );
500
508
}
501
509
if (responseDone ) {
510
+ if (data != null ) {
511
+ data .release ();
512
+ }
502
513
if (callback != null ) {
503
514
if (last && data == null ) {
504
515
callback .onComplete (this , context );
@@ -523,32 +534,50 @@ public <T> void writeAsync0(ByteBuf data, boolean last, IoCallback<T> callback,
523
534
request .response ().drainHandler (new Handler <Void >() {
524
535
@ Override
525
536
public void handle (Void event ) {
526
- if (last ) {
527
- responseDone = true ;
528
- if (upgradeHandler == null ) {
529
- request .response ().end (createBuffer (data ));
537
+ try {
538
+ if (last ) {
539
+ responseDone = true ;
540
+ if (upgradeHandler == null ) {
541
+ request .response ().end (createBuffer (data ));
542
+ } else {
543
+ request .response ().end (createBuffer (data ), upgradeHandler );
544
+ }
530
545
} else {
531
- request .response ().end (createBuffer (data ), upgradeHandler );
546
+ request .response ().write (createBuffer (data ));
547
+ }
548
+ queueWriteListener (callback , context , last );
549
+ request .response ().drainHandler (null );
550
+ } catch (Exception e ) {
551
+ if (data != null ) {
552
+ data .release ();
553
+ }
554
+ if (callback != null ) {
555
+ callback .onException (VertxHttpExchange .this , context , new IOException ("Write failed" , e ));
532
556
}
533
- } else {
534
- request .response ().write (createBuffer (data ));
535
557
}
536
- queueWriteListener (callback , context , last );
537
- request .response ().drainHandler (null );
538
558
}
539
559
});
540
560
} else {
541
- if (last ) {
542
- responseDone = true ;
543
- if (upgradeHandler == null ) {
544
- request .response ().end (createBuffer (data ));
561
+ try {
562
+ if (last ) {
563
+ responseDone = true ;
564
+ if (upgradeHandler == null ) {
565
+ request .response ().end (createBuffer (data ));
566
+ } else {
567
+ request .response ().end (createBuffer (data ), upgradeHandler );
568
+ }
545
569
} else {
546
- request .response ().end (createBuffer (data ), upgradeHandler );
570
+ request .response ().write (createBuffer (data ));
571
+ }
572
+ queueWriteListener (callback , context , last );
573
+ } catch (Exception e ) {
574
+ if (data != null ) {
575
+ data .release ();
576
+ }
577
+ if (callback != null ) {
578
+ callback .onException (VertxHttpExchange .this , context , new IOException ("Write failed" , e ));
547
579
}
548
- } else {
549
- request .response ().write (createBuffer (data ));
550
580
}
551
- queueWriteListener (callback , context , last );
552
581
}
553
582
}
554
583
0 commit comments