Skip to content

Commit b245526

Browse files
authored
Merge pull request #176 from SentryMan/inputStream
Support InputStream/byte[] Body Types
2 parents c4b611e + 9ca7dbb commit b245526

File tree

5 files changed

+50
-19
lines changed

5 files changed

+50
-19
lines changed

http-generator-core/src/main/java/io/avaje/http/generator/core/JsonBUtil.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ public static Map<String, UType> jsonTypes(ControllerReader reader) {
3333
methodReader -> {
3434
addJsonBodyType(methodReader, addToMap);
3535
if (!methodReader.isVoid()) {
36-
UType uType = UType.parse(methodReader.returnType());
36+
var uType = UType.parse(methodReader.returnType());
3737

38-
if (uType.mainType().equals("java.util.concurrent.CompletableFuture")) {
38+
if ("java.util.concurrent.CompletableFuture".equals(uType.mainType())) {
3939
uType = uType.paramRaw();
4040
}
4141

@@ -51,6 +51,8 @@ private static void addJsonBodyType(MethodReader methodReader, Consumer<UType> a
5151
methodReader.params().stream()
5252
.filter(MethodParam::isBody)
5353
.map(MethodParam::utype)
54+
.filter(s -> !s.full().startsWith("java.io.InputStream"))
55+
.filter(s -> !s.full().startsWith("byte[]"))
5456
.forEach(addToMap);
5557
}
5658
}

http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/JavalinAdapter.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,16 @@ public boolean isBodyMethodParam() {
3131

3232
@Override
3333
public String bodyAsClass(UType type) {
34-
if (useJsonB) {
35-
return type.shortName() + "JsonType.fromJson(ctx.bodyInputStream())";
34+
if (type.full().startsWith("java.io.InputStream")) {
35+
return "ctx.bodyInputStream()";
36+
} else if (type.full().startsWith("byte[]")) {
37+
return "ctx.bodyAsBytes()";
38+
} else {
39+
if (useJsonB) {
40+
return type.shortName() + "JsonType.fromJson(ctx.bodyInputStream())";
41+
}
42+
return "ctx.bodyAsClass(" + type.mainType() + ".class)";
3643
}
37-
return "ctx.bodyAsClass(" + type.mainType() + ".class)";
3844
}
3945

4046
@Override

http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/ControllerMethodWriter.java

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.avaje.http.generator.helidon.nima;
22

33
import static io.avaje.http.generator.core.ProcessingContext.platform;
4+
45
import java.util.List;
56
import java.util.Optional;
67

@@ -40,7 +41,10 @@ void writeHandler(boolean requestScoped) {
4041
writer.append(" private void _%s(ServerRequest req, ServerResponse res) {", method.simpleName()).eol();
4142
final var bodyType = method.bodyType();
4243
if (bodyType != null) {
43-
if (useJsonB) {
44+
45+
if (bodyType.equals("InputStream")) {
46+
writer.append(" var %s = req.content().inputStream();", method.bodyName()).eol();
47+
} else if (useJsonB) {
4448
final var fieldName =
4549
method.params().stream()
4650
.filter(MethodParam::isBody)
@@ -53,18 +57,20 @@ void writeHandler(boolean requestScoped) {
5357
} else {
5458
// use default helidon content negotiation
5559
method.params().stream()
56-
.filter(MethodParam::isBody)
57-
.forEach(
58-
param -> {
59-
final var type = param.utype();
60-
writer.append(" var %s = req.content().as(", method.bodyName());
61-
if (type.param0() != null) {
62-
writer.append("new io.helidon.common.GenericType<%s>() {}", type.full());
63-
} else {
64-
writer.append("%s.class", type.full());
65-
}
66-
writer.append(");").eol();
67-
});
60+
.filter(MethodParam::isBody)
61+
.forEach(
62+
param -> {
63+
final var type = param.utype();
64+
65+
writer.append(" var %s = req.content()", method.bodyName());
66+
writer.append(".as(");
67+
if (type.param0() != null) {
68+
writer.append("new io.helidon.common.GenericType<%s>() {}", type.full());
69+
} else {
70+
writer.append("%s.class", type.full());
71+
}
72+
writer.append(");").eol();
73+
});
6874
}
6975
} else if (usesFormParams()) {
7076
writer.append(" var formParams = req.content().as(Parameters.class);").eol();
@@ -111,7 +117,7 @@ void writeHandler(boolean requestScoped) {
111117
if (!method.isVoid()) {
112118
writeContextReturn();
113119
if (producesJson()) {
114-
final UType uType = UType.parse(method.returnType());
120+
final var uType = UType.parse(method.returnType());
115121
writer.append(" %sJsonType.toJson(result, res.outputStream());", uType.shortName()).eol();
116122
} else {
117123
writer.append(" res.send(result);").eol();

tests/test-javalin-jsonb/src/main/java/org/example/myapp/web/test/TestController2.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.example.myapp.web.test;
22

3+
import java.io.InputStream;
34
import java.util.List;
45
import java.util.Map;
56
import java.util.Set;
@@ -47,4 +48,14 @@ String enumQueryImplied(String s, @QueryParam ServerType type) {
4748
String mapTest(Map<String, List<String>> strings) {
4849
return strings.toString();
4950
}
51+
52+
@Get("/inputStream")
53+
String stream(InputStream stream) {
54+
return stream.toString();
55+
}
56+
57+
@Get("/byteArray")
58+
String bytes(byte[] array) {
59+
return array.toString();
60+
}
5061
}

tests/test-nima-jsonb/src/main/java/org/example/TestController.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.example;
22

3+
import java.io.InputStream;
34
import java.util.Set;
45

56
import io.avaje.http.api.Controller;
@@ -45,4 +46,9 @@ String enumMultiQuery(@QueryParam @Default({"FFA", "PROXY"}) Set<ServerType> typ
4546
String enumQueryImplied(String s, @QueryParam ServerType type) {
4647
return type.name();
4748
}
49+
50+
@Get("/inputStream")
51+
String stream(InputStream stream) {
52+
return stream.toString();
53+
}
4854
}

0 commit comments

Comments
 (0)