Skip to content

Commit 86ab10a

Browse files
committed
unify absent of HTTP parameter and empty strings fix #407
1 parent f3a2876 commit 86ab10a

5 files changed

Lines changed: 52 additions & 16 deletions

File tree

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.jooby.issues;
2+
3+
import org.jooby.test.ServerFeature;
4+
import org.junit.Test;
5+
6+
public class Issue407 extends ServerFeature {
7+
8+
{
9+
get("/407", req -> req.param("foo").toOptional());
10+
}
11+
12+
@Test
13+
public void shouldIgnoreEmptyValues() throws Exception {
14+
request()
15+
.get("/407")
16+
.expect("Optional.empty");
17+
18+
request()
19+
.get("/407?foo=")
20+
.expect("Optional.empty");
21+
}
22+
23+
}

jooby-netty/src/main/java/org/jooby/internal/netty/NettyRequest.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.List;
3030
import java.util.Optional;
3131
import java.util.function.Function;
32+
import java.util.function.Predicate;
3233
import java.util.stream.Collectors;
3334

3435
import org.jooby.MediaType;
@@ -37,6 +38,7 @@
3738
import org.jooby.spi.NativeUpload;
3839
import org.jooby.spi.NativeWebSocket;
3940

41+
import com.google.common.base.Strings;
4042
import com.google.common.collect.ArrayListMultimap;
4143
import com.google.common.collect.ImmutableList;
4244
import com.google.common.collect.Multimap;
@@ -232,8 +234,10 @@ private Multimap<String, String> decodeParams() throws IOException {
232234
params = ArrayListMultimap.create();
233235
files = ArrayListMultimap.create();
234236

237+
Predicate<String> notEmpty = s -> !Strings.isNullOrEmpty(s);
235238
query.parameters()
236-
.forEach((name, values) -> values.forEach(value -> params.put(name, value)));
239+
.forEach((name, values) -> values.stream().filter(notEmpty)
240+
.forEach(value -> params.put(name, value)));
237241

238242
HttpMethod method = req.method();
239243
boolean hasBody = method.equals(HttpMethod.POST) || method.equals(HttpMethod.PUT)
@@ -258,16 +262,19 @@ private Multimap<String, String> decodeParams() throws IOException {
258262
while (hasNext.apply(decoder)) {
259263
HttpData field = (HttpData) decoder.next();
260264
try {
261-
String name = field.getName();
262-
switch (field.getHttpDataType()) {
263-
case FileUpload:
264-
files.put(name, new NettyUpload((FileUpload) field, tmpdir));
265-
// excludes upload from param names.
266-
break;
267-
default:
268-
params.put(name, field.getString());
269-
break;
270-
}
265+
String name = field.getName();
266+
switch (field.getHttpDataType()) {
267+
case FileUpload:
268+
files.put(name, new NettyUpload((FileUpload) field, tmpdir));
269+
// excludes upload from param names.
270+
break;
271+
default:
272+
String value = field.getString();
273+
if (notEmpty.test(value)) {
274+
params.put(name, value);
275+
}
276+
break;
277+
}
271278
} finally {
272279
field.release();
273280
}

jooby-servlet/src/main/java/org/jooby/servlet/ServletServletRequest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.jooby.spi.NativeRequest;
3939
import org.jooby.spi.NativeUpload;
4040

41+
import com.google.common.base.Strings;
4142
import com.google.common.collect.ImmutableList;
4243
import com.google.common.collect.ImmutableList.Builder;
4344

@@ -104,7 +105,9 @@ public List<String> params(final String name) throws Exception {
104105
if (values == null) {
105106
return Collections.emptyList();
106107
}
107-
return ImmutableList.copyOf(values);
108+
return Arrays.asList(values).stream()
109+
.filter(s -> !Strings.isNullOrEmpty(s))
110+
.collect(Collectors.toList());
108111
}
109112

110113
@Override

jooby-undertow/src/main/java/org/jooby/internal/undertow/UndertowRequest.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.Deque;
2828
import java.util.List;
2929
import java.util.Optional;
30+
import java.util.function.Predicate;
3031
import java.util.stream.Collectors;
3132

3233
import org.jooby.Cookie;
@@ -36,6 +37,7 @@
3637
import org.jooby.spi.NativeUpload;
3738
import org.jooby.spi.NativeWebSocket;
3839

40+
import com.google.common.base.Strings;
3941
import com.google.common.base.Supplier;
4042
import com.google.common.base.Suppliers;
4143
import com.google.common.collect.ImmutableList;
@@ -105,13 +107,14 @@ public List<String> params(final String name) {
105107
Builder<String> builder = ImmutableList.builder();
106108
// query params
107109
Deque<String> query = exchange.getQueryParameters().get(name);
110+
Predicate<String> notEmpty = s -> !Strings.isNullOrEmpty(s);
108111
if (query != null) {
109-
query.forEach(builder::add);
112+
query.stream().filter(notEmpty).forEach(builder::add);
110113
}
111114
// form params
112115
Optional.ofNullable(form.get(name)).ifPresent(values -> {
113-
values.forEach(value -> {
114-
if (!value.isFile()) {
116+
values.stream().forEach(value -> {
117+
if (!value.isFile() && notEmpty.test(value.getValue())) {
115118
builder.add(value.getValue());
116119
}
117120
});

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ private List<String> params(final String name) {
388388
try {
389389
return req.params(name);
390390
} catch (Exception ex) {
391-
throw new Err(Status.BAD_REQUEST, "Param " + name + " resulted in error", ex);
391+
throw new Err(Status.BAD_REQUEST, "Parameter '" + name + "' resulted in error", ex);
392392
}
393393
}
394394

0 commit comments

Comments
 (0)