2121import java .nio .channels .FileChannel ;
2222import java .nio .channels .ReadableByteChannel ;
2323import java .nio .charset .Charset ;
24+ import java .nio .file .Files ;
2425import java .security .cert .Certificate ;
2526import java .util .ArrayList ;
2627import java .util .Collection ;
3839import org .eclipse .jetty .http .HttpHeader ;
3940import org .eclipse .jetty .http .HttpHeaderValue ;
4041import org .eclipse .jetty .http .MimeTypes ;
42+ import org .eclipse .jetty .io .ByteBufferPool ;
4143import org .eclipse .jetty .io .Content ;
4244import org .eclipse .jetty .io .content .InputStreamContentSource ;
4345import org .eclipse .jetty .server .Request ;
5153
5254import edu .umd .cs .findbugs .annotations .NonNull ;
5355import edu .umd .cs .findbugs .annotations .Nullable ;
54- import io .jooby .Body ;
56+ import io .jooby .* ;
5557import io .jooby .ByteRange ;
56- import io .jooby .CompletionListeners ;
57- import io .jooby .Context ;
58- import io .jooby .Cookie ;
59- import io .jooby .DefaultContext ;
60- import io .jooby .FileUpload ;
61- import io .jooby .Formdata ;
62- import io .jooby .MediaType ;
63- import io .jooby .QueryString ;
64- import io .jooby .Route ;
65- import io .jooby .Router ;
66- import io .jooby .Sender ;
67- import io .jooby .Server ;
68- import io .jooby .ServerSentEmitter ;
69- import io .jooby .Session ;
70- import io .jooby .SessionStore ;
71- import io .jooby .SneakyThrows ;
72- import io .jooby .StatusCode ;
73- import io .jooby .WebSocket ;
7458import io .jooby .internal .jetty .http2 .JettyHeaders ;
7559import io .jooby .output .Output ;
7660import io .jooby .value .Value ;
7761
7862public class JettyContext implements DefaultContext , Callback {
63+ private interface DeleteFileTask {
64+ void delete () throws IOException ;
65+
66+ static DeleteFileTask of (FileUpload file ) {
67+ return file ::close ;
68+ }
69+
70+ static DeleteFileTask of (FileDownload file ) {
71+ return () -> {
72+ var path = file .getFile ();
73+ if (path != null ) {
74+ Files .delete (path );
75+ }
76+ };
77+ }
78+ }
79+
7980 private final int bufferSize ;
8081 private final long maxRequestSize ;
8182 Request request ;
8283 Response response ;
8384
8485 private QueryString query ;
8586 private Formdata formdata ;
86- private List <FileUpload > files ;
87+ private List <DeleteFileTask > files ;
8788 private Value headers ;
8889 private Map <String , String > pathMap = Collections .EMPTY_MAP ;
8990 private Map <String , Object > attributes = new HashMap <>();
@@ -558,6 +559,14 @@ public Context send(@NonNull ReadableByteChannel channel) {
558559 return sendStreamInternal (Channels .newInputStream (channel ));
559560 }
560561
562+ @ Override
563+ public @ NonNull Context send (@ NonNull FileDownload file ) {
564+ if (file .deleteOnComplete ()) {
565+ register (DeleteFileTask .of (file ));
566+ }
567+ return DefaultContext .super .send (file );
568+ }
569+
561570 @ NonNull @ Override
562571 public Context send (@ NonNull InputStream in ) {
563572 try {
@@ -582,7 +591,8 @@ private Context sendStreamInternal(@NonNull InputStream in) {
582591 stream = in ;
583592 }
584593 responseStarted = true ;
585- Content .copy (new InputStreamContentSource (stream ), response , this );
594+ Content .copy (
595+ new InputStreamContentSource (stream , ByteBufferPool .SIZED_NON_POOLING ), response , this );
586596 return this ;
587597 } catch (IOException x ) {
588598 throw SneakyThrows .propagate (x );
@@ -633,11 +643,11 @@ public String toString() {
633643
634644 private void clearFiles () {
635645 if (files != null ) {
636- for (FileUpload file : files ) {
646+ for (var file : files ) {
637647 try {
638- file .close ();
648+ file .delete ();
639649 } catch (Exception e ) {
640- router .getLog ().debug ("file upload destroy resulted in exception" , e );
650+ router .getLog ().debug ("file destroy resulted in exception" , e );
641651 }
642652 }
643653 files .clear ();
@@ -708,11 +718,15 @@ private void ifSetChunked() {
708718 }
709719
710720 private FileUpload register (FileUpload upload ) {
721+ register (DeleteFileTask .of (upload ));
722+ return upload ;
723+ }
724+
725+ private void register (DeleteFileTask deleteFileTask ) {
711726 if (files == null ) {
712727 files = new ArrayList <>();
713728 }
714- files .add (upload );
715- return upload ;
729+ files .add (deleteFileTask );
716730 }
717731
718732 private static void formParam (Request request , Formdata form ) {
0 commit comments