|
25 | 25 | import lombok.Setter; |
26 | 26 | import lombok.SneakyThrows; |
27 | 27 | import lombok.extern.slf4j.Slf4j; |
| 28 | +import org.apache.commons.fileupload.FileItemIterator; |
| 29 | +import org.apache.commons.fileupload.FileItemStream; |
| 30 | +import org.apache.commons.fileupload.FileUploadException; |
| 31 | +import org.apache.commons.fileupload.servlet.ServletFileUpload; |
28 | 32 | import org.osgi.service.component.annotations.Component; |
29 | 33 | import org.osgi.service.component.annotations.Reference; |
30 | 34 | import org.osgi.service.component.annotations.ReferenceCardinality; |
|
37 | 41 | import javax.servlet.http.HttpServletRequest; |
38 | 42 | import javax.servlet.http.HttpServletResponse; |
39 | 43 | import java.io.IOException; |
| 44 | +import java.io.InputStream; |
40 | 45 | import java.io.InputStreamReader; |
41 | 46 | import java.security.AccessController; |
42 | 47 | import java.security.PrivilegedAction; |
43 | | -import java.security.PrivilegedActionException; |
44 | | -import java.security.PrivilegedExceptionAction; |
45 | 48 | import java.util.*; |
46 | 49 | import java.util.stream.Collectors; |
47 | 50 |
|
@@ -164,26 +167,49 @@ public static class Request { |
164 | 167 |
|
165 | 168 | @Override |
166 | 169 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { |
| 170 | + GraphQLContext context = createContext(Optional.of(req), Optional.of(resp)); |
167 | 171 | if (req.getPathInfo().contentEquals("/schema.json")) { |
168 | | - query(CharStreams.toString(new InputStreamReader(getClass().getResourceAsStream("introspectionQuery"))), new HashMap<>(), schema, req, resp); |
| 172 | + query(CharStreams.toString(new InputStreamReader(getClass().getResourceAsStream("introspectionQuery"))), new HashMap<>(), schema, req, resp, context); |
169 | 173 | } else { |
170 | | - query(req.getParameter("q"), new HashMap<>(), readOnlySchema, req, resp); |
| 174 | + query(req.getParameter("q"), new HashMap<>(), readOnlySchema, req, resp, context); |
171 | 175 | } |
172 | 176 | } |
173 | 177 |
|
174 | 178 | @Override |
175 | 179 | protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { |
176 | | - Request request = new ObjectMapper().readValue(req.getInputStream(), Request.class); |
177 | | - query(request.query, request.variables, schema, req, resp); |
| 180 | + GraphQLContext context = createContext(Optional.of(req), Optional.of(resp)); |
| 181 | + InputStream inputStream = null; |
| 182 | + if (ServletFileUpload.isMultipartContent(req)) { |
| 183 | + ServletFileUpload upload = new ServletFileUpload(); |
| 184 | + try { |
| 185 | + FileItemIterator it = upload.getItemIterator(req); |
| 186 | + context.setFiles(Optional.of(it)); |
| 187 | + while (inputStream == null && it.hasNext()) { |
| 188 | + FileItemStream stream = it.next(); |
| 189 | + if (stream.getFieldName().contentEquals("graphql")) { |
| 190 | + inputStream = stream.openStream(); |
| 191 | + } |
| 192 | + } |
| 193 | + if (inputStream == null) { |
| 194 | + throw new ServletException("no query found"); |
| 195 | + } |
| 196 | + } catch (FileUploadException e) { |
| 197 | + throw new ServletException("no query found"); |
| 198 | + } |
| 199 | + } else { |
| 200 | + // this is not a multipart request |
| 201 | + inputStream = req.getInputStream(); |
| 202 | + } |
| 203 | + Request request = new ObjectMapper().readValue(inputStream, Request.class); |
| 204 | + query(request.query, request.variables, schema, req, resp, context); |
178 | 205 | } |
179 | 206 |
|
180 | | - private void query(String query, Map<String, Object> variables, GraphQLSchema schema, HttpServletRequest req, HttpServletResponse resp) throws IOException { |
181 | | - GraphQLContext context = createContext(Optional.of(req), Optional.of(resp)); |
| 207 | + private void query(String query, Map<String, Object> variables, GraphQLSchema schema, HttpServletRequest req, HttpServletResponse resp, GraphQLContext context) throws IOException { |
182 | 208 | if (Subject.getSubject(AccessController.getContext()) == null && context.getSubject().isPresent()) { |
183 | 209 | Subject.doAs(context.getSubject().get(), new PrivilegedAction<Void>() { |
184 | 210 | @Override @SneakyThrows |
185 | 211 | public Void run() { |
186 | | - query(query, variables, schema, req, resp); |
| 212 | + query(query, variables, schema, req, resp, context); |
187 | 213 | return null; |
188 | 214 | } |
189 | 215 | }); |
|
0 commit comments