Skip to content

Commit cbec59d

Browse files
authored
favor req.file(name) over req.param(name).toUpload fix jooby-project#819 (jooby-project#823)
Optional Upload with malformed file multipart part fix jooby-project#803
1 parent 2da4bbe commit cbec59d

File tree

22 files changed

+143
-169
lines changed

22 files changed

+143
-169
lines changed

jooby/src/main/java/org/jooby/Jooby.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2854,7 +2854,6 @@ private Injector bootstrap(final Config args,
28542854
parsers.addBinding().toInstance(BuiltinParser.Collection);
28552855
parsers.addBinding().toInstance(BuiltinParser.Optional);
28562856
parsers.addBinding().toInstance(BuiltinParser.Enum);
2857-
parsers.addBinding().toInstance(BuiltinParser.Upload);
28582857
parsers.addBinding().toInstance(BuiltinParser.Bytes);
28592858

28602859
/** basic render */

jooby/src/main/java/org/jooby/Mutant.java

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -449,8 +449,7 @@ default SortedSet<String> toSortedSet() {
449449
@SuppressWarnings("unchecked")
450450
default <T extends Comparable<T>> SortedSet<T> toSortedSet(final Class<T> type) {
451451
return (SortedSet<T>) to(TypeLiteral.get(
452-
Types.newParameterizedType(SortedSet.class, Primitives.wrap(type))
453-
));
452+
Types.newParameterizedType(SortedSet.class, Primitives.wrap(type))));
454453
}
455454

456455
/**
@@ -468,17 +467,7 @@ default Optional<String> toOptional() {
468467
@SuppressWarnings("unchecked")
469468
default <T> Optional<T> toOptional(final Class<T> type) {
470469
return (Optional<T>) to(TypeLiteral.get(
471-
Types.newParameterizedType(Optional.class, Primitives.wrap(type))
472-
));
473-
}
474-
475-
/**
476-
* Convert a form field to file {@link Upload}.
477-
*
478-
* @return A file {@link Upload}.
479-
*/
480-
default Upload toUpload() {
481-
return to(Upload.class);
470+
Types.newParameterizedType(Optional.class, Primitives.wrap(type))));
482471
}
483472

484473
/**

jooby/src/main/java/org/jooby/Parser.java

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -466,25 +466,6 @@ interface Builder {
466466
*/
467467
Builder ifparams(Callback<Map<String, Mutant>> callback);
468468

469-
/**
470-
* Add a HTTP upload callback. The Callback will be executed when current context is bound to a
471-
* HTTP upload via {@link Request#param(String)}.
472-
*
473-
* If current {@link Context} isn't a HTTP upload a call to {@link Context#next()} is made.
474-
*
475-
* @param callback A upload parser callback.
476-
* @return This builder.
477-
*/
478-
Builder upload(Callback<ParamReference<Upload>> callback);
479-
480-
/**
481-
* Like {@link #upload(Callback)} but it skip the callback if the requested type is an
482-
* {@link Optional}.
483-
*
484-
* @param callback A upload parser callback.
485-
* @return This builder.
486-
*/
487-
Builder ifupload(Callback<ParamReference<Upload>> callback);
488469
}
489470

490471
/**

jooby/src/main/java/org/jooby/Request.java

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@
205205

206206
import static java.util.Objects.requireNonNull;
207207

208+
import java.io.IOException;
208209
import java.nio.charset.Charset;
209210
import java.util.List;
210211
import java.util.Locale;
@@ -417,12 +418,12 @@ public Mutant param(final String name, final String... xss) {
417418
}
418419

419420
@Override
420-
public Upload file(final String name) {
421+
public Upload file(final String name) throws IOException {
421422
return req.file(name);
422423
}
423424

424425
@Override
425-
public List<Upload> files(final String name) {
426+
public List<Upload> files(final String name) throws IOException {
426427
return req.files(name);
427428
}
428429

@@ -1013,9 +1014,27 @@ default <T> T form(final Class<T> type, final String... xss) {
10131014
*
10141015
* @param name File's name.
10151016
* @return An {@link Upload}.
1017+
* @throws IOException
10161018
*/
1017-
default Upload file(final String name) {
1018-
return param(name).toUpload();
1019+
default Upload file(final String name) throws IOException {
1020+
List<Upload> files = files(name);
1021+
if (files.size() == 0) {
1022+
throw new Err.Missing(name);
1023+
}
1024+
return files.get(0);
1025+
}
1026+
1027+
/**
1028+
* Get a file {@link Upload} with the given name or empty. The request must be a POST with
1029+
* <code>multipart/form-data</code> content-type.
1030+
*
1031+
* @param name File's name.
1032+
* @return An {@link Upload}.
1033+
* @throws IOException
1034+
*/
1035+
default Optional<Upload> ifFile(final String name) throws IOException {
1036+
List<Upload> files = files(name);
1037+
return files.size() == 0 ? Optional.empty() : Optional.of(files.get(0));
10191038
}
10201039

10211040
/**
@@ -1024,10 +1043,9 @@ default Upload file(final String name) {
10241043
*
10251044
* @param name File's name.
10261045
* @return A list of {@link Upload}.
1046+
* @throws IOException
10271047
*/
1028-
default List<Upload> files(final String name) {
1029-
return param(name).toList(Upload.class);
1030-
}
1048+
List<Upload> files(final String name) throws IOException;
10311049

10321050
/**
10331051
* Get a HTTP header.

jooby/src/main/java/org/jooby/internal/BuiltinParser.java

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,6 @@
220220
import java.util.function.Supplier;
221221

222222
import org.jooby.Parser;
223-
import org.jooby.Upload;
224223

225224
import com.google.common.collect.ImmutableCollection;
226225
import com.google.common.collect.ImmutableList;
@@ -323,13 +322,6 @@ public Object parse(final TypeLiteral<?> type, final Parser.Context ctx) throws
323322
builder.add(ctx.next(paramType, value));
324323
}
325324
return builder.build();
326-
}).upload(uploads -> {
327-
ImmutableCollection.Builder builder = parsers.get(type.getRawType()).get();
328-
TypeLiteral<Upload> paramType = TypeLiteral.get(Upload.class);
329-
for (Upload upload : uploads) {
330-
builder.add(ctx.next(paramType, upload));
331-
}
332-
return builder.build();
333325
});
334326
} else {
335327
return ctx.next();
@@ -359,8 +351,6 @@ public Object parse(final TypeLiteral<?> type, final Parser.Context ctx)
359351
return java.util.Optional.empty();
360352
}
361353
return java.util.Optional.of(ctx.next(paramType));
362-
}).upload(files -> {
363-
return java.util.Optional.of(ctx.next(paramType));
364354
});
365355
} else {
366356
return ctx.next();
@@ -391,17 +381,6 @@ Object toEnum(final Class type, final String value) {
391381
}
392382
},
393383

394-
Upload {
395-
@Override
396-
public Object parse(final TypeLiteral<?> type, final Context ctx) throws Throwable {
397-
if (Upload.class == type.getRawType()) {
398-
return ctx.upload(uploads -> uploads.get(0));
399-
} else {
400-
return ctx.next();
401-
}
402-
}
403-
},
404-
405384
Bytes {
406385
@Override
407386
public Object parse(final TypeLiteral<?> type, final Parser.Context ctx) throws Throwable {

jooby/src/main/java/org/jooby/internal/RequestImpl.java

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@
206206
import static java.util.Objects.requireNonNull;
207207

208208
import java.io.File;
209+
import java.io.IOException;
209210
import java.nio.charset.Charset;
210211
import java.util.ArrayList;
211212
import java.util.Collections;
@@ -392,27 +393,24 @@ public Mutant param(final String name) {
392393
return _param(name, null);
393394
}
394395

396+
@Override
397+
public List<Upload> files(final String name) throws IOException {
398+
List<NativeUpload> files = req.files(name);
399+
List<Upload> uploads = files.stream()
400+
.map(upload -> new UploadImpl(injector, upload))
401+
.collect(Collectors.toList());
402+
return uploads;
403+
}
404+
395405
private Mutant _param(final String name, final Function<String, String> xss) {
396406
Mutant param = this.params.get(name);
397407
if (param == null) {
398-
List<NativeUpload> files = Try.of(() -> req.files(name)).getOrElseThrow(
399-
ex -> new Err(Status.BAD_REQUEST, "Upload " + name + " resulted in error", ex));
400-
if (files.size() > 0) {
401-
List<Upload> uploads = files.stream()
402-
.map(upload -> new UploadImpl(injector, upload))
403-
.collect(Collectors.toList());
404-
param = new MutantImpl(require(ParserExecutor.class), type(),
405-
new UploadParamReferenceImpl(name, uploads));
408+
StrParamReferenceImpl paramref = new StrParamReferenceImpl("parameter", name,
409+
params(name, xss));
410+
param = new MutantImpl(require(ParserExecutor.class), paramref);
406411

412+
if (paramref.size() > 0) {
407413
this.params.put(name, param);
408-
} else {
409-
StrParamReferenceImpl paramref = new StrParamReferenceImpl("parameter", name,
410-
params(name, xss));
411-
param = new MutantImpl(require(ParserExecutor.class), paramref);
412-
413-
if (paramref.size() > 0) {
414-
this.params.put(name, param);
415-
}
416414
}
417415
}
418416
return param;

jooby/src/main/java/org/jooby/internal/mvc/RequestParam.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@
206206
import java.lang.reflect.AnnotatedElement;
207207
import java.lang.reflect.Parameter;
208208
import java.lang.reflect.Type;
209+
import java.util.List;
209210
import java.util.Map;
210211
import java.util.Optional;
211212

@@ -218,6 +219,7 @@
218219
import org.jooby.Response;
219220
import org.jooby.Route;
220221
import org.jooby.Session;
222+
import org.jooby.Upload;
221223
import org.jooby.mvc.Body;
222224
import org.jooby.mvc.Flash;
223225
import org.jooby.mvc.Header;
@@ -272,6 +274,19 @@ private interface GetValue {
272274
builder.put(TypeLiteral.get(Session.class), (req, rsp, param) -> req.session());
273275
builder.put(TypeLiteral.get(Types.newParameterizedType(Optional.class, Session.class)),
274276
(req, rsp, param) -> req.ifSession());
277+
278+
/**
279+
* Files
280+
*/
281+
builder.put(TypeLiteral.get(Upload.class), (req, rsp, param) -> req.file(param.name));
282+
builder.put(TypeLiteral.get(Types.newParameterizedType(Optional.class, Upload.class)),
283+
(req, rsp, param) -> {
284+
List<Upload> files = req.files(param.name);
285+
return files.size() == 0 ? Optional.empty() : Optional.of(files.get(0));
286+
});
287+
builder.put(TypeLiteral.get(Types.newParameterizedType(List.class, Upload.class)),
288+
(req, rsp, param) -> req.files(param.name));
289+
275290
/**
276291
* Cookie
277292
*/
@@ -307,7 +322,7 @@ private interface GetValue {
307322
if (param.type.getRawType() == Map.class) {
308323
return req.flash();
309324
}
310-
return param.optional? req.ifFlash(param.name) : req.flash(param.name);
325+
return param.optional ? req.ifFlash(param.name) : req.flash(param.name);
311326
});
312327

313328
injector = builder.build();

jooby/src/main/java/org/jooby/internal/parser/ParserBuilder.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -209,11 +209,9 @@
209209
import org.jooby.Parser;
210210
import org.jooby.Parser.Builder;
211211
import org.jooby.Parser.Callback;
212-
import org.jooby.Upload;
213212
import org.jooby.internal.BodyReferenceImpl;
214213
import org.jooby.internal.EmptyBodyReference;
215214
import org.jooby.internal.StrParamReferenceImpl;
216-
import org.jooby.internal.UploadParamReferenceImpl;
217215

218216
import com.google.common.collect.ImmutableMap;
219217
import com.google.inject.TypeLiteral;
@@ -280,17 +278,6 @@ public Builder ifparams(final Callback<Map<String, Mutant>> callback) {
280278
return params(callback);
281279
}
282280

283-
@Override
284-
public Builder upload(final Callback<Parser.ParamReference<Upload>> callback) {
285-
strategies.put(TypeLiteral.get(UploadParamReferenceImpl.class), callback);
286-
return this;
287-
}
288-
289-
@Override
290-
public Builder ifupload(final Callback<Parser.ParamReference<Upload>> callback) {
291-
return upload(callback);
292-
}
293-
294281
@SuppressWarnings("unchecked")
295282
public Object parse() throws Throwable {
296283
Map<TypeLiteral<?>, Callback> map = strategies.build();

jooby/src/main/java/org/jooby/internal/parser/ParserExecutor.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -217,10 +217,8 @@
217217
import org.jooby.Parser.Callback;
218218
import org.jooby.Parser.ParamReference;
219219
import org.jooby.Status;
220-
import org.jooby.Upload;
221220
import org.jooby.internal.StatusCodeProvider;
222221
import org.jooby.internal.StrParamReferenceImpl;
223-
import org.jooby.internal.UploadParamReferenceImpl;
224222

225223
import com.google.common.collect.ImmutableList;
226224
import com.google.inject.Injector;
@@ -285,16 +283,6 @@ public Builder ifbody(final Callback<BodyReference> callback) {
285283
return builder.ifbody(callback);
286284
}
287285

288-
@Override
289-
public Builder upload(final Callback<Parser.ParamReference<Upload>> callback) {
290-
return builder.upload(callback);
291-
}
292-
293-
@Override
294-
public Builder ifupload(final Callback<ParamReference<Upload>> callback) {
295-
return builder.ifupload(callback);
296-
}
297-
298286
@Override
299287
public Builder param(final Callback<ParamReference<String>> callback) {
300288
return builder.param(callback);
@@ -356,9 +344,6 @@ private Object wrap(final Object nextval, final Object value) {
356344
ParamReference<?> pref = (ParamReference) value;
357345
return new StrParamReferenceImpl(pref.type(), pref.name(),
358346
ImmutableList.of((String) nextval));
359-
} else if (nextval instanceof Upload) {
360-
ParamReference<?> pref = (ParamReference) value;
361-
return new UploadParamReferenceImpl(pref.name(), ImmutableList.of((Upload) nextval));
362347
}
363348
return nextval;
364349
}

jooby/src/test/java/org/jooby/RequestTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static org.easymock.EasyMock.expect;
44
import static org.junit.Assert.assertEquals;
55

6+
import java.io.IOException;
67
import java.nio.charset.Charset;
78
import java.util.Arrays;
89
import java.util.HashMap;
@@ -234,6 +235,11 @@ public long timestamp() {
234235
throw new UnsupportedOperationException();
235236
}
236237

238+
@Override
239+
public List<Upload> files(final String name) throws IOException {
240+
throw new UnsupportedOperationException();
241+
}
242+
237243
}
238244

239245
@Test

0 commit comments

Comments
 (0)