Andreas Hartmann schrieb:

I'm trying to setup a test harness for a server which provides a REST
interface based on the Atom publishing protocol. Unfortunately I can't
get POST and PUT to work properly. Setting the Content-Header doesn't
seem to be supported.

[…]

I patched HtmlUnit and WebTest (in a naive way) to make my tests run. Here's what works for me. Any comments are greatly appreciated, if I find the time I could try to polish the patches so that they might be considered for integrating in the codebase. TIA!

HtmlUnit Patch
==============

Index: src/main/java/com/gargoylesoftware/htmlunit/WebRequestSettings.java
===================================================================
--- src/main/java/com/gargoylesoftware/htmlunit/WebRequestSettings.java (revision 3047) +++ src/main/java/com/gargoylesoftware/htmlunit/WebRequestSettings.java (working copy)
@@ -201,8 +201,8 @@
                        + "the two are mutually exclusive!";
             throw new RuntimeException(msg);
         }
-        if (httpMethod_ != HttpMethod.POST) {
- final String msg = "The request body may only be set for POST requests!"; + if (httpMethod_ != HttpMethod.POST && httpMethod_ != HttpMethod.PUT) { + final String msg = "The request body may only be set for POST and PUT requests!";
             throw new RuntimeException(msg);
         }
         requestBody_ = requestBody;
Index: src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java
===================================================================
--- src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java (revision 3047) +++ src/main/java/com/gargoylesoftware/htmlunit/HttpWebConnection.java (working copy)
@@ -221,7 +221,7 @@
postMethod.addParameter(pair.getName(), pair.getValue());
                 }
             }
-            else {
+ else if (webRequestSettings.getEncodingType() == FormEncodingType.MULTIPART) {
                 final List<PartBase> partList = new ArrayList<PartBase>();
for (final NameValuePair pair : webRequestSettings.getRequestParameters()) {
                     final PartBase newPart;
@@ -241,6 +241,12 @@
                 parts = partList.toArray(parts);
method.setRequestEntity(new MultipartRequestEntity(parts, method.getParams()));
             }
+            else {
+                String body = webRequestSettings.getRequestBody();
+                String charset = webRequestSettings.getCharset();
+ String contentType = webRequestSettings.getAdditionalHeaders().get("Content-type"); + method.setRequestEntity(new StringRequestEntity(body, contentType, charset));
+            }
         }


WebTest Patch
=============

Index: src/main/java/com/canoo/webtest/steps/request/InvokePage.java
===================================================================
--- src/main/java/com/canoo/webtest/steps/request/InvokePage.java (revision 46484) +++ src/main/java/com/canoo/webtest/steps/request/InvokePage.java (working copy)
@@ -33,6 +33,7 @@
  *   description="This step executes a request to a particular URL."
  */
 public class InvokePage extends AbstractTargetAction {
+ protected static final String DEFAULT_CONTENT_TYPE = "application/x-www-form-urlencoded";
     private String fUrl;
     private String fCompleteUrl;
     private String fMethod = "GET";
@@ -40,6 +41,7 @@
     private String fContent;

     private String fSoapAction;
+    private String contentType;

     public String getMethod() {
         return fMethod;
@@ -125,6 +127,14 @@
     public void setContent(final String content) {
         fContent = content;
     }
+
+    public void setContentType(final String contentType) {
+        this.contentType = contentType;
+    }
+
+    public String getContentType() {
+        return this.contentType;
+    }

     public String getSoapAction() {
         return fSoapAction;
@@ -151,8 +161,9 @@
     }

     protected Page findTarget() throws IOException, SAXException {
-        if ("POST".equals(getMethod())) {
-            return findTargetByPost();
+        String method = getMethod();
+        if ("POST".equals(method) || "PUT".equals(method)) {
+            return findTarget(SubmitMethod.getInstance(method));
         }
         fCompleteUrl = getContext().getConfig().getUrlForPage(getUrl());
final WebRequestSettings settings = new WebRequestSettings(new URL(fCompleteUrl));
@@ -160,9 +171,9 @@
         return getResponse(settings);
     }

-    private Page findTargetByPost() throws IOException, SAXException {
+ private Page findTarget(SubmitMethod method) throws IOException, SAXException {
         String url = getContext().getConfig().getUrlForPage(getUrl());
- WebRequestSettings settings = new WebRequestSettings(new URL(url), SubmitMethod.POST); + WebRequestSettings settings = new WebRequestSettings(new URL(url), method);

         // get default encoding
         final String charset = System.getProperty("file.encoding");
@@ -174,7 +185,8 @@
         }
         else {
             // TODO: is this the correct Content-type for non-SOAP posts?
- headers.put("Content-type", "application/x-www-form-urlencoded"); + String type = this.contentType != null ? this.contentType : DEFAULT_CONTENT_TYPE;
+            headers.put("Content-type", type);
         }
         settings.setAdditionalHeaders(headers);
         final String content;



-- Andreas


--
Andreas Hartmann, CTO
BeCompany GmbH
http://www.becompany.ch
Tel.: +41 (0) 43 818 57 01
_______________________________________________
WebTest mailing list
[email protected]
http://lists.canoo.com/mailman/listinfo/webtest

Reply via email to