Skip to content

Commit

Permalink
Merge pull request #30285 from Sgitario/23059
Browse files Browse the repository at this point in the history
Fix @PartType ignored for String types in Resteasy Rest Client
  • Loading branch information
geoand authored Jan 10, 2023
2 parents fbbb5e8 + cf5240c commit be29324
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1627,7 +1627,7 @@ private void handleMultipartField(String formParamName, String partType, String

// we support string, and send it as an attribute unconverted
if (type.equals(String.class.getName())) {
addString(ifValueNotNull, multipartForm, formParamName, partFilename, fieldValue);
addString(ifValueNotNull, multipartForm, formParamName, partType, partFilename, fieldValue);
} else if (type.equals(File.class.getName())) {
// file is sent as file :)
ResultHandle filePath = ifValueNotNull.invokeVirtualMethod(
Expand Down Expand Up @@ -1660,7 +1660,7 @@ private void handleMultipartField(String formParamName, String partType, String
parameterAnnotations, methodIndex);
BytecodeCreator parameterIsStringBranch = checkStringParam(ifValueNotNull, convertedFormParam,
restClientInterfaceClassName, errorLocation);
addString(parameterIsStringBranch, multipartForm, formParamName, partFilename, convertedFormParam);
addString(parameterIsStringBranch, multipartForm, formParamName, null, partFilename, convertedFormParam);
}
}

Expand Down Expand Up @@ -1743,13 +1743,27 @@ private ResultHandle partFilenameHandle(BytecodeCreator methodCreator, String pa
}

private void addString(BytecodeCreator methodCreator, AssignableResultHandle multipartForm, String formParamName,
String partFilename, ResultHandle fieldValue) {
methodCreator.assign(multipartForm,
methodCreator.invokeVirtualMethod(
MethodDescriptor.ofMethod(QuarkusMultipartForm.class, "attribute", QuarkusMultipartForm.class,
String.class, String.class, String.class),
multipartForm, methodCreator.load(formParamName), fieldValue,
partFilenameHandle(methodCreator, partFilename)));
String partType, String partFilename, ResultHandle fieldValue) {
if (MediaType.APPLICATION_OCTET_STREAM.equalsIgnoreCase(partType)) {
methodCreator.assign(multipartForm,
// MultipartForm#stringFileUpload(String name, String filename, String content, String mediaType);
methodCreator.invokeVirtualMethod(
MethodDescriptor.ofMethod(QuarkusMultipartForm.class, "stringFileUpload",
QuarkusMultipartForm.class, String.class, String.class, String.class,
String.class),
multipartForm,
methodCreator.load(formParamName),
partFilename != null ? methodCreator.load(partFilename) : methodCreator.loadNull(),
fieldValue,
methodCreator.load(partType)));
} else {
methodCreator.assign(multipartForm,
methodCreator.invokeVirtualMethod(
MethodDescriptor.ofMethod(QuarkusMultipartForm.class, "attribute", QuarkusMultipartForm.class,
String.class, String.class, String.class),
multipartForm, methodCreator.load(formParamName), fieldValue,
partFilenameHandle(methodCreator, partFilename)));
}
}

private void addMultiAsFile(BytecodeCreator methodCreator, AssignableResultHandle multipartForm, String formParamName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,18 @@ void shouldUseFileNameFromAnnotation() throws IOException {
File file = File.createTempFile("MultipartTest", ".txt");
file.deleteOnExit();

ClientForm2 form = new ClientForm2();
ClientFormUsingFile form = new ClientFormUsingFile();
form.file = file;
assertThat(client.postMultipartWithPartFilename(form)).isEqualTo(ClientForm2.FILE_NAME);
assertThat(client.postMultipartWithPartFilename(form)).isEqualTo(ClientFormUsingFile.FILE_NAME);
}

@Test
void shouldUseFileNameFromAnnotationUsingString() {
Client client = RestClientBuilder.newBuilder().baseUri(baseUri).build(Client.class);

ClientFormUsingString form = new ClientFormUsingString();
form.file = "file content";
assertThat(client.postMultipartWithPartFilenameUsingString(form)).isEqualTo("clientFile:file content");
}

@Test
Expand Down Expand Up @@ -111,6 +120,13 @@ public String upload(@MultipartForm FormData form) {
return form.myFile.fileName();
}

@POST
@Path("/using-string")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String uploadWithFileContentUsingString(@MultipartForm FormData form) throws IOException {
return form.myFile.fileName() + ":" + Files.readString(form.myFile.uploadedFile());
}

@POST
@Path("/file-content")
@Consumes(MediaType.MULTIPART_FORM_DATA)
Expand Down Expand Up @@ -166,7 +182,12 @@ public interface Client {

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
String postMultipartWithPartFilename(@MultipartForm ClientForm2 clientForm);
String postMultipartWithPartFilename(@MultipartForm ClientFormUsingFile clientForm);

@POST
@Path("/using-string")
@Consumes(MediaType.MULTIPART_FORM_DATA)
String postMultipartWithPartFilenameUsingString(@MultipartForm ClientFormUsingString clientForm);

@POST
@Path("/file-content")
Expand All @@ -190,12 +211,21 @@ public static class ClientForm {
public File file;
}

public static class ClientForm2 {
public static class ClientFormUsingFile {
public static final String FILE_NAME = "clientFile";

@FormParam("myFile")
@PartType(MediaType.APPLICATION_OCTET_STREAM)
@PartFilename(FILE_NAME)
public File file;
}

public static class ClientFormUsingString {
public static final String FILE_NAME = "clientFile";

@FormParam("myFile")
@PartType(MediaType.APPLICATION_OCTET_STREAM)
@PartFilename(FILE_NAME)
public String file;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ public QuarkusMultipartForm textFileUpload(String name, String filename, Buffer
return this;
}

@SuppressWarnings("unused")
public QuarkusMultipartForm stringFileUpload(String name, String filename, String content, String mediaType) {
return textFileUpload(name, filename, Buffer.buffer(content), mediaType);
}

@SuppressWarnings("unused")
public QuarkusMultipartForm binaryFileUpload(String name, String filename, String pathname, String mediaType) {
parts.add(new QuarkusMultipartFormDataPart(name, filename, pathname, mediaType, false));
Expand Down

0 comments on commit be29324

Please sign in to comment.