Skip to content

Commit da06c08

Browse files
committed
friendly version of .value() for querystring, formdata and multipart
1 parent ad44ce3 commit da06c08

File tree

5 files changed

+62
-9
lines changed

5 files changed

+62
-9
lines changed

jooby/src/main/java/io/jooby/internal/HashValue.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package io.jooby.internal;
77

8+
import io.jooby.FileUpload;
89
import io.jooby.Formdata;
910
import io.jooby.Multipart;
1011
import io.jooby.TypeMismatchException;
@@ -172,8 +173,20 @@ public int size() {
172173
}
173174

174175
@Override public String value() {
175-
String name = name();
176-
throw new TypeMismatchException(name == null ? objectType : name, String.class);
176+
StringBuilder buf = new StringBuilder();
177+
String sep = "&";
178+
hash.forEach((k, v) -> {
179+
Iterator<Value> it = v.iterator();
180+
while (it.hasNext()) {
181+
Value value = it.next();
182+
String str = value instanceof FileUpload ? ((FileUpload) value).getFileName() : value.toString();
183+
buf.append(k).append("=").append(str).append(sep);
184+
}
185+
});
186+
if (buf.length() > 0) {
187+
buf.setLength(buf.length() - sep.length());
188+
}
189+
return buf.toString();
177190
}
178191

179192
public HashValue setObjectType(String type) {

jooby/src/main/java/io/jooby/internal/MissingValue.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,8 @@ public MissingValue(String name) {
3939
@Override public Map<String, List<String>> toMultimap() {
4040
return Collections.emptyMap();
4141
}
42+
43+
@Override public String toString() {
44+
return "<missing>";
45+
}
4246
}

jooby/src/test/java/io/jooby/ValueTest.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,6 @@ public void valueToMap() {
217217
public void verifyIllegalAccess() {
218218
/** Object: */
219219
queryString("foo=bar", queryString -> {
220-
assertThrows(BadRequestException.class, () -> queryString.value());
221-
assertThrows(BadRequestException.class, () -> queryString.value(""));
222220
assertThrows(MissingValueException.class, () -> queryString.get("a").get("a").get("a").value());
223221
assertThrows(MissingValueException.class, () -> queryString.get("missing").value());
224222
assertThrows(MissingValueException.class, () -> queryString.get(0).value());
@@ -304,8 +302,6 @@ public void toCollection() {
304302
public void toOptional() {
305303
/** Array: */
306304
queryString("a=1;a=2", queryString -> {
307-
assertMessage(BadRequestException.class, () -> queryString.toOptional(),
308-
"Cannot convert value: 'queryString', to: 'java.lang.String'");
309305
assertMessage(BadRequestException.class, () -> queryString.get("a").toOptional(),
310306
"Cannot convert value: 'a', to: 'java.lang.String'");
311307
assertEquals(Optional.of("1"), queryString.get("a").get(0).toOptional());
@@ -333,8 +329,6 @@ public void toEnum() {
333329
public void verifyExceptionMessage() {
334330
/** Object: */
335331
queryString("foo=bar", queryString -> {
336-
assertMessage(BadRequestException.class, () -> queryString.value(),
337-
"Cannot convert value: 'queryString', to: 'java.lang.String'");
338332
assertMessage(BadRequestException.class, () -> queryString.get("foo").intValue(),
339333
"Cannot convert value: 'foo', to: 'int'");
340334
assertMessage(BadRequestException.class, () -> queryString.get("foo").intValue(0),

modules/jooby-jetty/src/main/java/io/jooby/internal/jetty/JettyContext.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,12 @@ private static void formParam(Request request, Formdata form) {
498498
while (names.hasMoreElements()) {
499499
String name = names.nextElement();
500500
if (query == null || !query.containsKey(name)) {
501-
form.put(name, request.getParameter(name));
501+
String[] values = request.getParameterValues(name);
502+
if (values != null) {
503+
for (String value : values) {
504+
form.put(name, value);
505+
}
506+
}
502507
}
503508
}
504509
}

tests/src/test/java/io/jooby/FeaturedTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2478,6 +2478,43 @@ public void detachOnEventLoop() {
24782478
});
24792479
}
24802480

2481+
@Test
2482+
public void rawValue() {
2483+
new JoobyRunner(app -> {
2484+
app.post("/body", ctx -> {
2485+
return ctx.body().value();
2486+
});
2487+
2488+
app.post("/form", ctx -> {
2489+
return ctx.form().value();
2490+
});
2491+
2492+
app.post("/multipart", ctx -> {
2493+
return ctx.multipart().value();
2494+
});
2495+
}).ready(client -> {
2496+
client.post("/body", rsp -> {
2497+
assertEquals("", rsp.body().string());
2498+
});
2499+
2500+
client.post("/body", create("{\"foo\": \"bar\"}", json), rsp -> {
2501+
assertEquals("{\"foo\": \"bar\"}", rsp.body().string());
2502+
});
2503+
2504+
client.post("/form", new FormBody.Builder().add("a", "a b").add("c", "d").add("c", "e").build(), rsp -> {
2505+
assertEquals("a=a b&c=d&c=e", rsp.body().string());
2506+
});
2507+
2508+
client.post("/multipart", new MultipartBody.Builder()
2509+
.setType(MultipartBody.FORM)
2510+
.addFormDataPart("a", "b")
2511+
.addFormDataPart("f", "19kb.txt", create(_19kb, MediaType.parse("text/plain")))
2512+
.build(), rsp -> {
2513+
assertEquals("a=b&f=19kb.txt", rsp.body().string());
2514+
});
2515+
});
2516+
}
2517+
24812518
private static String readText(Path file) {
24822519
try {
24832520
return new String(Files.readAllBytes(file), StandardCharsets.UTF_8);

0 commit comments

Comments
 (0)