Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

REST Client Reactive: support null file in multipart #20597

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1083,20 +1083,23 @@ private ResultHandle createMultipartForm(MethodCreator methodCreator, ResultHand
"No @PartType annotation found on multipart form field of type File: " +
formClass.name() + "." + field.name());
}
ResultHandle filePath = methodCreator.invokeVirtualMethod(
BytecodeCreator ifFileNotNull = methodCreator.ifNotNull(fieldValue).trueBranch();
ResultHandle filePath = ifFileNotNull.invokeVirtualMethod(
MethodDescriptor.ofMethod(File.class, "toPath", Path.class), fieldValue);
addFile(methodCreator, multipartForm, formParamName, partType, filePath);
addFile(ifFileNotNull, multipartForm, formParamName, partType, filePath);
} else if (is(PATH, fieldClass, index)) {
// and so is path
if (partType == null) {
throw new IllegalArgumentException(
"No @PartType annotation found on multipart form field of type Path: " +
formClass.name() + "." + field.name());
}
addFile(methodCreator, multipartForm, formParamName, partType, fieldValue);
BytecodeCreator ifPathNotNull = methodCreator.ifNotNull(fieldValue).trueBranch();
addFile(ifPathNotNull, multipartForm, formParamName, partType, fieldValue);
} else if (is(BUFFER, fieldClass, index)) {
// and buffer
addBuffer(methodCreator, multipartForm, formParamName, partType, fieldValue, field);
BytecodeCreator ifBufferNotNull = methodCreator.ifNotNull(fieldValue).trueBranch();
addBuffer(ifBufferNotNull, multipartForm, formParamName, partType, fieldValue, field);
} else { // assume POJO:
addPojo(methodCreator, multipartForm, formParamName, partType, fieldValue, field);
}
Expand All @@ -1109,10 +1112,11 @@ private ResultHandle createMultipartForm(MethodCreator methodCreator, ResultHand
throw new IllegalArgumentException("Array of unsupported type: " + componentType.name()
+ " on " + formClassType.name() + "." + field.name());
}
ResultHandle buffer = methodCreator.invokeStaticInterfaceMethod(
BytecodeCreator ifArrayNotNull = methodCreator.ifNotNull(fieldValue).trueBranch();
ResultHandle buffer = ifArrayNotNull.invokeStaticInterfaceMethod(
MethodDescriptor.ofMethod(Buffer.class, "buffer", Buffer.class, byte[].class),
fieldValue);
addBuffer(methodCreator, multipartForm, formParamName, partType, buffer, field);
addBuffer(ifArrayNotNull, multipartForm, formParamName, partType, buffer, field);
break;
case PRIMITIVE:
// primitives are converted to text and sent as attribute
Expand Down Expand Up @@ -1145,7 +1149,7 @@ private void addPojo(MethodCreator methodCreator, AssignableResultHandle multipa
* add file upload, see {@link QuarkusMultipartForm#binaryFileUpload(String, String, String, String)} and
* {@link QuarkusMultipartForm#textFileUpload(String, String, String, String)}
*/
private void addFile(MethodCreator methodCreator, AssignableResultHandle multipartForm, String formParamName,
private void addFile(BytecodeCreator methodCreator, AssignableResultHandle multipartForm, String formParamName,
String partType, ResultHandle filePath) {
ResultHandle fileNamePath = methodCreator.invokeInterfaceMethod(PATH_GET_FILENAME, filePath);
ResultHandle fileName = methodCreator.invokeVirtualMethod(OBJECT_TO_STRING, fileNamePath);
Expand Down Expand Up @@ -1209,7 +1213,7 @@ private void addString(MethodCreator methodCreator, AssignableResultHandle multi
multipartForm, methodCreator.load(formParamName), fieldValue));
}

private void addBuffer(MethodCreator methodCreator, AssignableResultHandle multipartForm, String formParamName,
private void addBuffer(BytecodeCreator methodCreator, AssignableResultHandle multipartForm, String formParamName,
String partType, ResultHandle buffer, FieldInfo field) {
if (partType == null) {
throw new IllegalArgumentException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,6 @@ private void configureBaseUrl(RestClientBuilder builder) {
clientConfigByConfigKey().uri);

if (propertyOptional.isEmpty()) {
// mstodo is the url there string?
propertyOptional = oneOf(clientConfigByClassName().url,
clientConfigByConfigKey().url);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;

Expand Down Expand Up @@ -75,9 +76,11 @@ public String sendByteArrayWithPojo(@RestQuery @DefaultValue("true") Boolean wit
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.TEXT_PLAIN)
@Blocking
public String sendByteArray() {
public String sendByteArray(@QueryParam("nullFile") @DefaultValue("false") boolean nullFile) {
WithByteArrayAsBinaryFile data = new WithByteArrayAsBinaryFile();
data.file = HELLO_WORLD.getBytes(UTF_8);
if (!nullFile) {
data.file = HELLO_WORLD.getBytes(UTF_8);
}
data.fileName = GREETING_TXT;
return client.sendByteArrayAsBinaryFile(data);
}
Expand All @@ -87,9 +90,11 @@ public String sendByteArray() {
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.TEXT_PLAIN)
@Blocking
public String sendBuffer() {
public String sendBuffer(@QueryParam("nullFile") @DefaultValue("false") boolean nullFile) {
WithBufferAsBinaryFile data = new WithBufferAsBinaryFile();
data.file = Buffer.buffer(HELLO_WORLD);
if (!nullFile) {
data.file = Buffer.buffer(HELLO_WORLD);
}
data.fileName = GREETING_TXT;
return client.sendBufferAsBinaryFile(data);
}
Expand All @@ -99,16 +104,19 @@ public String sendBuffer() {
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.TEXT_PLAIN)
@Blocking
public String sendFileAsBinary() throws IOException {
File tempFile = File.createTempFile("quarkus-test", ".bin");
tempFile.deleteOnExit();
public String sendFileAsBinary(@QueryParam("nullFile") @DefaultValue("false") boolean nullFile) throws IOException {
WithFileAsBinaryFile data = new WithFileAsBinaryFile();

try (FileOutputStream fileOutputStream = new FileOutputStream(tempFile)) {
fileOutputStream.write(HELLO_WORLD.getBytes());
}
if (!nullFile) {
File tempFile = File.createTempFile("quarkus-test", ".bin");
tempFile.deleteOnExit();

WithFileAsBinaryFile data = new WithFileAsBinaryFile();
data.file = tempFile;
try (FileOutputStream fileOutputStream = new FileOutputStream(tempFile)) {
fileOutputStream.write(HELLO_WORLD.getBytes());
}

data.file = tempFile;
}
data.fileName = GREETING_TXT;
return client.sendFileAsBinaryFile(data);
}
Expand All @@ -118,16 +126,19 @@ public String sendFileAsBinary() throws IOException {
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.TEXT_PLAIN)
@Blocking
public String sendPathAsBinary() throws IOException {
File tempFile = File.createTempFile("quarkus-test", ".bin");
tempFile.deleteOnExit();
public String sendPathAsBinary(@QueryParam("nullFile") @DefaultValue("false") boolean nullFile) throws IOException {
WithPathAsBinaryFile data = new WithPathAsBinaryFile();

try (FileOutputStream fileOutputStream = new FileOutputStream(tempFile)) {
fileOutputStream.write(HELLO_WORLD.getBytes());
}
if (!nullFile) {
File tempFile = File.createTempFile("quarkus-test", ".bin");
tempFile.deleteOnExit();

WithPathAsBinaryFile data = new WithPathAsBinaryFile();
data.file = tempFile.toPath();
try (FileOutputStream fileOutputStream = new FileOutputStream(tempFile)) {
fileOutputStream.write(HELLO_WORLD.getBytes());
}

data.file = tempFile.toPath();
}
data.fileName = GREETING_TXT;
return client.sendPathAsBinaryFile(data);
}
Expand Down Expand Up @@ -198,7 +209,8 @@ public String sendPathAsText() throws IOException {
@Path("/echo/binary")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String consumeMultipart(@MultipartForm MultipartBodyWithBinaryFile body) {
return String.format("fileOk:%s,nameOk:%s", containsHelloWorld(body.file), GREETING_TXT.equals(body.fileName));
return String.format("fileOk:%s,nameOk:%s", body.file == null ? "null" : containsHelloWorld(body.file),
GREETING_TXT.equals(body.fileName));
}

@POST
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,19 @@ public void shouldSendByteArrayAsBinaryFile() {
// @formatter:on
}

@Test
public void shouldSendNullByteArrayAsBinaryFile() {
// @formatter:off
given()
.queryParam("nullFile", "true")
.header("Content-Type", "text/plain")
.when().get("/client/byte-array-as-binary-file")
.then()
.statusCode(200)
.body(equalTo("fileOk:null,nameOk:true"));
// @formatter:on
}

@Test
public void shouldSendBufferAsBinaryFile() {
// @formatter:off
Expand All @@ -34,6 +47,19 @@ public void shouldSendBufferAsBinaryFile() {
// @formatter:on
}

@Test
public void shouldSendNullBufferAsBinaryFile() {
// @formatter:off
given()
.queryParam("nullFile", "true")
.header("Content-Type", "text/plain")
.when().get("/client/buffer-as-binary-file")
.then()
.statusCode(200)
.body(equalTo("fileOk:null,nameOk:true"));
// @formatter:on
}

@Test
public void shouldSendFileAsBinaryFile() {
// @formatter:off
Expand All @@ -46,6 +72,19 @@ public void shouldSendFileAsBinaryFile() {
// @formatter:on
}

@Test
public void shouldSendNullFileAsBinaryFile() {
// @formatter:off
given()
.queryParam("nullFile", "true")
.header("Content-Type", "text/plain")
.when().get("/client/file-as-binary-file")
.then()
.statusCode(200)
.body(equalTo("fileOk:null,nameOk:true"));
// @formatter:on
}

@Test
public void shouldSendPathAsBinaryFile() {
// @formatter:off
Expand All @@ -58,6 +97,19 @@ public void shouldSendPathAsBinaryFile() {
// @formatter:on
}

@Test
public void shouldSendNullPathAsBinaryFile() {
// @formatter:off
given()
.queryParam("nullFile", "true")
.header("Content-Type", "text/plain")
.when().get("/client/path-as-binary-file")
.then()
.statusCode(200)
.body(equalTo("fileOk:null,nameOk:true"));
// @formatter:on
}

@Test
public void shouldSendByteArrayAsTextFile() {
// @formatter:off
Expand Down