parseQueryString(String queryString) {
return map;
}
+
+ protected static WebScriptRequest parseMockRequest(String requestType, String requestContent, String requestHeaders, String urlargs, WebScriptRequest request) {
+ MockHttpServletRequest mockRequest = new MockHttpServletRequest();
+ mockRequest.setCharacterEncoding("UTF-8");
+ mockRequest.setContentType(requestType);
+ mockRequest.setParameters(parseQueryString(urlargs));
+
+ JSONTokener jsonTokener = new JSONTokener(requestHeaders);
+ try {
+ JSONArray jsonHeaders = new JSONArray(jsonTokener);
+ for(int i = 0 ; i < jsonHeaders.length(); ++i) {
+ JSONObject jsonHeader = (JSONObject) jsonHeaders.get(i);
+ if(jsonHeader.has("name") && jsonHeader.has("value")) {
+ mockRequest.addHeader(jsonHeader.getString("name"), jsonHeader.getString("value"));
+ }
+ }
+ } catch (JSONException e) {
+ throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR,
+ "Error reading json request (part: headers).", e);
+ }
+
+ mockRequest.setContent(requestContent.getBytes());
+
+ MockWebScriptRequest mockWebScript = new MockWebScriptRequest(request.getRuntime(), mockRequest, request.getServiceMatch(), null);
+ if(requestType.equals(WebScriptRequestImpl.MULTIPART_FORM_DATA)){
+
+ MockFormData mockFormData = new MockFormData();
+ FileItemFactory fileItemFactory = new DiskFileItemFactory();
+
+ JSONTokener jsonMpFieldsTokener = new JSONTokener(request.getParameter("mp-fields"));
+ try {
+ JSONArray mpFields = new JSONArray(jsonMpFieldsTokener);
+ for(int i = 0 ; i < mpFields.length(); ++i) {
+ JSONObject mpField = (JSONObject) mpFields.get(i);
+ String key = mpField.getString("name");
+ FormField formField = null;
+ if(mpField.getString("type").equals("param")) {
+ mockRequest.addParameter(key, request.getParameter(key));
+
+ FileItem fileItem = fileItemFactory.createItem(key, null, true, null);
+ Streams.copy(new ByteArrayInputStream(request.getParameter(key).getBytes()), fileItem.getOutputStream(), true);
+ formField = mockFormData.new FormField(fileItem);
+ } else {
+ // file type
+ formField = ((WebScriptServletRequest)request).getFileField(key);
+
+ }
+ mockFormData.addFormField(formField);
+ }
+ } catch (IOException | JSONException e) {
+ throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR,
+ "Error reading json request (part: form data fields).", e);
+ }
+
+ mockWebScript.setMockFormData(mockFormData);
+ }
+
+ return mockWebScript;
+ }
+ public static JavascriptConsoleRequest readFormData(WebScriptRequest request) {
+ String script = request.getParameter("script");
+ String template = request.getParameter("template");
+ String spaceNodeRef = request.getParameter("spaceNodeRef");
+ String transaction = request.getParameter("transaction");
+ String urlargs = request.getParameter("urlargs");
+ String documentNodeRef = request.getParameter("documentNodeRef");
+ int dumpLimit = DEFAULT_DUMP_LIMIT;
+ if(request.getParameter("dumpLimit") != null){
+ dumpLimit = Integer.parseInt(request.getParameter("dumpLimit"));
+ }
+ //String logOutputChannel = request.getParameter("printOutputChannel");
+ String resultChannel = request.getParameter("resultChannel");
+ String requestType = request.getParameter("requestType");
+ String requestContent = request.getParameter("requestContent");
+ String requestHeaders = request.getParameter("requestHeaders");
+ WebScriptRequest mockRequest = parseMockRequest(requestType, requestContent, requestHeaders, urlargs, request);
+
+ String runas = request.getParameter("runas");
+ if (runas == null) {
+ runas = "";
+ }
+
+ return new JavascriptConsoleRequest(script, template, spaceNodeRef, transaction, runas, documentNodeRef, dumpLimit, resultChannel, mockRequest);
+
+ }
+
public static JavascriptConsoleRequest readJson(WebScriptRequest request) {
Content content = request.getContent();
@@ -96,14 +196,18 @@ public static JavascriptConsoleRequest readJson(WebScriptRequest request) {
}
String logOutputChannel = jsonInput.has("printOutputChannel") ? jsonInput.getString("printOutputChannel") : null;
String resultChannel = jsonInput.has("resultChannel") ? jsonInput.getString("resultChannel") : null;
-
+ String requestType = jsonInput.has("requestType") ? jsonInput.getString("requestType") : null;
+ String requestContent = jsonInput.has("requestContent") ? jsonInput.getString("requestContent") : null;
+ String requestHeaders = jsonInput.has("requestHeaders") ? jsonInput.getString("requestHeaders") : null;
+
String runas = jsonInput.getString("runas");
if (runas == null) {
runas = "";
}
- return new JavascriptConsoleRequest(script, template, spaceNodeRef, transaction, runas, urlargs, documentNodeRef, dumpLimit, resultChannel);
+ WebScriptRequest mockRequest = parseMockRequest(requestType, requestContent, requestHeaders, urlargs, request);
+ return new JavascriptConsoleRequest(script, template, spaceNodeRef, transaction, runas, documentNodeRef, dumpLimit, resultChannel, mockRequest);
} catch (JSONException e) {
throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR,
"Error reading json request body.", e);
@@ -114,7 +218,10 @@ public static JavascriptConsoleRequest readJson(WebScriptRequest request) {
public String toString() {
return "JavascriptConsoleRequest [script=" + script + ", template=" + template + ", spaceNodeRef=" + spaceNodeRef
+ ", runas=" + runas + ", useTransaction=" + useTransaction + ", transactionReadOnly=" + transactionReadOnly
- + ", urlargs=" + urlargs + ", documentNodeRef=" + documentNodeRef + ", dumpLimit=" + dumpLimit + ", resultChannel=" + resultChannel + "]";
+ + ", documentNodeRef=" + documentNodeRef + ", dumpLimit=" + dumpLimit + ", mockRequest=" + mockRequest
+ + ", resultChannel=" + resultChannel + "]";
}
+
+
}
diff --git a/javascript-console-repo/src/main/java/de/fme/jsconsole/request/DelegatingServletInputStream.java b/javascript-console-repo/src/main/java/de/fme/jsconsole/request/DelegatingServletInputStream.java
new file mode 100644
index 0000000..d1b31e4
--- /dev/null
+++ b/javascript-console-repo/src/main/java/de/fme/jsconsole/request/DelegatingServletInputStream.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2002-2012 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package de.fme.jsconsole.request;
+
+import java.io.IOException;
+import java.io.InputStream;
+import javax.servlet.ServletInputStream;
+
+import org.springframework.util.Assert;
+
+/**
+ * Delegating implementation of {@link javax.servlet.ServletInputStream}.
+ *
+ * Used by {@link MockHttpServletRequest}; typically not directly
+ * used for testing application controllers.
+ *
+ * From package: org.springframework.spring-test 4.1.3
+ *
+ * @author Juergen Hoeller
+ * @since 1.0.2
+ * @see MockHttpServletRequest
+ */
+public class DelegatingServletInputStream extends ServletInputStream {
+
+ private final InputStream sourceStream;
+
+
+ /**
+ * Create a DelegatingServletInputStream for the given source stream.
+ * @param sourceStream the source stream (never {@code null})
+ */
+ public DelegatingServletInputStream(InputStream sourceStream) {
+ Assert.notNull(sourceStream, "Source InputStream must not be null");
+ this.sourceStream = sourceStream;
+ }
+
+ /**
+ * Return the underlying source stream (never {@code null}).
+ */
+ public final InputStream getSourceStream() {
+ return this.sourceStream;
+ }
+
+
+ @Override
+ public int read() throws IOException {
+ return this.sourceStream.read();
+ }
+
+ @Override
+ public void close() throws IOException {
+ super.close();
+ this.sourceStream.close();
+ }
+
+}
diff --git a/javascript-console-repo/src/main/java/de/fme/jsconsole/request/HeaderValueHolder.java b/javascript-console-repo/src/main/java/de/fme/jsconsole/request/HeaderValueHolder.java
new file mode 100644
index 0000000..b224d27
--- /dev/null
+++ b/javascript-console-repo/src/main/java/de/fme/jsconsole/request/HeaderValueHolder.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2002-2012 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package de.fme.jsconsole.request;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.util.Assert;
+import org.springframework.util.CollectionUtils;
+
+/**
+ * Internal helper class that serves as value holder for request headers.
+ * From package: org.springframework.spring-test 4.1.3
+ *
+ * @author Juergen Hoeller
+ * @author Rick Evans
+ * @since 2.0.1
+ */
+class HeaderValueHolder {
+
+ private final List