Skip to content

Commit 33b3823

Browse files
committed
Migrated from param to part and file
1 parent 12beac4 commit 33b3823

File tree

4 files changed

+43
-24
lines changed

4 files changed

+43
-24
lines changed

spring-graphql/src/main/java/org/springframework/graphql/server/webmvc/GraphQlHttpHandler.java

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
package org.springframework.graphql.server.webmvc;
1818

1919
import java.io.IOException;
20+
import java.io.InputStream;
21+
import java.lang.reflect.Type;
2022
import java.util.Arrays;
2123
import java.util.List;
2224
import java.util.Map;
@@ -25,6 +27,7 @@
2527

2628
import javax.servlet.ServletException;
2729
import javax.servlet.http.HttpServletRequest;
30+
import javax.servlet.http.Part;
2831

2932
import com.fasterxml.jackson.databind.ObjectMapper;
3033
import org.apache.commons.logging.Log;
@@ -124,27 +127,26 @@ public ServerResponse handleRequest(ServerRequest serverRequest) throws ServletE
124127
}
125128

126129
public ServerResponse handleMultipartRequest(ServerRequest serverRequest) throws ServletException {
127-
Optional<String> operation = serverRequest.param("operations");
128-
Optional<String> mapParam = serverRequest.param("map");
130+
HttpServletRequest httpServletRequest = serverRequest.servletRequest();
129131

130-
Map<String, Object> inputQuery = operation
131-
.map(part ->
132-
partReader.<Map<String, Object>>readPart(part, MAP_PARAMETERIZED_TYPE_REF.getType())
133-
)
134-
.orElse(new HashMap<>());
132+
Map<String, Object> inputQuery = Optional.ofNullable(this.<Map<String, Object>>deserializePart(
133+
httpServletRequest,
134+
"operations",
135+
MAP_PARAMETERIZED_TYPE_REF.getType()
136+
)).orElse(new HashMap<>());
135137

136138
final Map<String, Object> queryVariables = getFromMapOrEmpty(inputQuery, "variables");
137139
final Map<String, Object> extensions = getFromMapOrEmpty(inputQuery, "extensions");
138140

139-
Map<String, MultipartFile> fileParams = readMultipartFiles(serverRequest);
141+
Map<String, MultipartFile> fileParams = readMultipartFiles(httpServletRequest);
140142

141-
Map<String, List<String>> fileMapInput =
142-
mapParam.map(part ->
143-
partReader.<Map<String, List<String>>>readPart(part, LIST_PARAMETERIZED_TYPE_REF.getType())
144-
)
145-
.orElse(new HashMap<>());
143+
Map<String, List<String>> fileMappings = Optional.ofNullable(this.<Map<String, List<String>>>deserializePart(
144+
httpServletRequest,
145+
"map",
146+
LIST_PARAMETERIZED_TYPE_REF.getType()
147+
)).orElse(new HashMap<>());
146148

147-
fileMapInput.forEach((String fileKey, List<String> objectPaths) -> {
149+
fileMappings.forEach((String fileKey, List<String> objectPaths) -> {
148150
MultipartFile file = fileParams.get(fileKey);
149151
if (file != null) {
150152
objectPaths.forEach((String objectPath) -> {
@@ -186,16 +188,31 @@ public ServerResponse handleMultipartRequest(ServerRequest serverRequest) throws
186188
return ServerResponse.async(responseMono);
187189
}
188190

189-
private Map<String, Object> getFromMapOrEmpty(Map<String, Object> input, String key) {
191+
private <T> T deserializePart(HttpServletRequest httpServletRequest, String name, Type type) {
192+
try {
193+
Part part = httpServletRequest.getPart(name);
194+
if (part == null) {
195+
return null;
196+
}
197+
try(InputStream inputStream = part.getInputStream()) {
198+
return partReader.readPart(inputStream, type);
199+
} catch (IOException e) {
200+
throw new RuntimeException(e);
201+
}
202+
} catch (IOException | ServletException e) {
203+
throw new RuntimeException(e);
204+
}
205+
}
206+
207+
private Map<String, Object> getFromMapOrEmpty(Map<String, Object> input, String key) {
190208
if (input.containsKey(key)) {
191209
return (Map<String, Object>)input.get(key);
192210
} else {
193211
return new HashMap<>();
194212
}
195213
}
196214

197-
private static Map<String, MultipartFile> readMultipartFiles(ServerRequest request) {
198-
HttpServletRequest httpServletRequest = request.servletRequest();
215+
private static Map<String, MultipartFile> readMultipartFiles(HttpServletRequest httpServletRequest) {
199216
Assert.isInstanceOf(MultipartHttpServletRequest.class, httpServletRequest,
200217
"Request should be of type MultipartHttpServletRequest");
201218
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) httpServletRequest;

spring-graphql/src/main/java/org/springframework/graphql/server/webmvc/JacksonPartReader.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.springframework.core.GenericTypeResolver;
66

77
import java.io.IOException;
8+
import java.io.InputStream;
89
import java.lang.reflect.Type;
910

1011
public class JacksonPartReader implements PartReader {
@@ -16,10 +17,10 @@ public JacksonPartReader(ObjectMapper objectMapper) {
1617
}
1718

1819
@Override
19-
public <T> T readPart(String param, Type targetType) {
20+
public <T> T readPart(InputStream inputStream, Type targetType) {
2021
try {
2122
JavaType javaType = getJavaType(targetType);
22-
return objectMapper.readValue(param, javaType);
23+
return objectMapper.readValue(inputStream, javaType);
2324
} catch (IOException e) {
2425
throw new RuntimeException(e);
2526
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package org.springframework.graphql.server.webmvc;
22

3+
import java.io.InputStream;
34
import java.lang.reflect.Type;
45

56
public interface PartReader {
6-
<T> T readPart(String param, Type targetType);
7+
<T> T readPart(InputStream inputStream, Type targetType);
78
}

spring-graphql/src/test/java/org/springframework/graphql/server/webmvc/GraphQlHttpHandlerTests.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,8 @@ private MockHttpServletRequest createMultipartServletRequest(String query, Strin
167167
);
168168
operations.put("variables", variables);
169169

170-
servletRequest.addParameter("operations", getJsonString(operations));
171-
servletRequest.addParameter("map", getJsonString(partMappings));
170+
servletRequest.addPart(new MockPart("operations", getJsonArray(operations)));
171+
servletRequest.addPart(new MockPart("map", getJsonArray(partMappings)));
172172

173173
return servletRequest;
174174
}
@@ -196,9 +196,9 @@ private byte[] getFileByteArray(Resource resource) {
196196
}
197197
}
198198

199-
private String getJsonString(Object o) {
199+
private byte[] getJsonArray(Object o) {
200200
try {
201-
return objectMapper.writeValueAsString(o);
201+
return objectMapper.writeValueAsBytes(o);
202202
} catch (JsonProcessingException e) {
203203
throw new RuntimeException(e);
204204
}

0 commit comments

Comments
 (0)