|
30 | 30 | import java.util.List; |
31 | 31 | import java.util.Map; |
32 | 32 | import java.util.Optional; |
| 33 | +import java.util.concurrent.CompletableFuture; |
33 | 34 | import java.util.concurrent.Executor; |
34 | 35 |
|
35 | 36 | import org.eclipse.jetty.http.*; |
|
44 | 45 | import org.eclipse.jetty.util.BufferUtil; |
45 | 46 | import org.eclipse.jetty.util.Callback; |
46 | 47 | import org.eclipse.jetty.util.Fields; |
| 48 | +import org.eclipse.jetty.util.Promise; |
47 | 49 | import org.eclipse.jetty.websocket.server.ServerWebSocketContainer; |
48 | 50 | import org.slf4j.Logger; |
49 | 51 |
|
@@ -231,8 +233,26 @@ public Formdata form() { |
231 | 233 | parser.setMaxMemoryFileSize(bufferSize); |
232 | 234 | parser.setMaxLength(maxRequestSize); |
233 | 235 | // Convert the request content into parts. |
234 | | - var parts = parser.parse(request).get(); |
235 | | - for (var part : parts) { |
| 236 | + var futureParts = new CompletableFuture<MultiPartFormData.Parts>(); |
| 237 | + var formCallback = |
| 238 | + new Promise.Invocable<MultiPartFormData.Parts>() { |
| 239 | + @Override |
| 240 | + public void succeeded(MultiPartFormData.Parts result) { |
| 241 | + futureParts.complete(result); |
| 242 | + } |
| 243 | + |
| 244 | + @Override |
| 245 | + public void failed(Throwable x) { |
| 246 | + futureParts.completeExceptionally(x); |
| 247 | + } |
| 248 | + |
| 249 | + @Override |
| 250 | + public InvocationType getInvocationType() { |
| 251 | + return InvocationType.NON_BLOCKING; |
| 252 | + } |
| 253 | + }; |
| 254 | + parser.parse(request, formCallback); |
| 255 | + for (var part : futureParts.get()) { |
236 | 256 | if (part.getFileName() != null) { |
237 | 257 | String name = part.getName(); |
238 | 258 | formdata.put(name, register(new JettyFileUpload(router.getTmpdir(), part))); |
|
0 commit comments