You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by se...@apache.org on 2008/10/11 17:36:01 UTC

svn commit: r703675 - in /jakarta/jmeter/trunk: src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java xdocs/changes.xml

Author: sebb
Date: Sat Oct 11 08:36:01 2008
New Revision: 703675

URL: http://svn.apache.org/viewvc?rev=703675&view=rev
Log:
Webservice(SOAP) Sampler improvements
- better content-type handling
- fetch actual response headers
- save request data earlier so can still be seen if connect fails

Modified:
    jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java
    jakarta/jmeter/trunk/xdocs/changes.xml

Modified: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java?rev=703675&r1=703674&r2=703675&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java (original)
+++ jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java Sat Oct 11 08:36:01 2008
@@ -49,6 +49,7 @@
 import org.apache.log.Logger;
 import org.apache.soap.Envelope;
 import org.apache.soap.messaging.Message;
+import org.apache.soap.rpc.SOAPContext;
 import org.apache.soap.transport.SOAPTransport;
 import org.apache.soap.transport.http.SOAPHTTPConnection;
 import org.apache.soap.util.xml.XMLParserUtils;
@@ -96,6 +97,7 @@
     private static final String PROXY_PASS =
         JMeterUtils.getPropDefault(JMeter.HTTP_PROXY_PASS,""); // $NON-NLS-1$
 
+    private static final String ENCODING = "UTF-8"; // $NON-NLS-1$ TODO should this be a variable?
 
     /*
      * Random class for generating random numbers.
@@ -391,7 +393,13 @@
                 TextFile tfile = new TextFile(file);
                 fileContents = tfile.getText();
             }
-            doc = XDB.parse(new FileInputStream(file));
+            FileInputStream fileInputStream = null;
+            try {
+                fileInputStream = new FileInputStream(file);
+                doc = XDB.parse(fileInputStream);
+            } finally {
+                IOUtils.closeQuietly(fileInputStream);
+            }
         } else {// must be a "here" document
             fileContents = getXmlData();
             if (fileContents != null && fileContents.length() > 0) {
@@ -430,6 +438,12 @@
             if (rdoc == null) {
                 throw new SOAPException("Could not create document", null);
             }
+            // set the response defaults
+            result.setDataEncoding(ENCODING);
+            result.setContentType("text/xml"); // $NON-NLS-1$
+            result.setDataType(SampleResult.TEXT);
+            result.setSamplerData(fileContents);// WARNING - could be large
+
             Envelope msgEnv = Envelope.unmarshall(rdoc);
             // create a new message
             Message msg = new Message();
@@ -497,19 +511,20 @@
             }
 
             SOAPTransport st = msg.getSOAPTransport();
-            result.setDataType(SampleResult.TEXT);
             BufferedReader br = null;
-            // check to see if SOAPTransport is not nul and receive is
-            // also not null. hopefully this will improve the error
-            // reporting. 5/13/05 peter lin
             if (st != null && st.receive() != null) {
                 br = st.receive();
+                SOAPContext sc = st.getResponseSOAPContext();
+                // Set details from the actual response
+                // Needs to be done before response can be stored
+                final String contentType = sc.getContentType();
+                result.setContentType(contentType);
+                result.setEncodingAndType(contentType);
                 if (getReadResponse()) {
                     StringWriter sw = new StringWriter();
                     IOUtils.copy(br, sw);
                     result.sampleEnd();
-                    // set the response
-                    result.setResponseData(sw.toString().getBytes());
+                    result.setResponseData(sw.toString().getBytes(result.getDataEncodingWithDefault()));
                 } else {
                     // by not reading the response
                     // for real, it improves the
@@ -520,30 +535,22 @@
                 }
                 result.setSuccessful(true);
                 result.setResponseCodeOK();
-                result.setResponseHeaders(this.convertSoapHeaders(st.getHeaders()));
             } else {
                 result.sampleEnd();
                 result.setSuccessful(false);
                 if (st != null){
-                    result.setResponseData(st.getResponseSOAPContext().getContentType().getBytes());
+                    final String contentType = st.getResponseSOAPContext().getContentType();
+                    result.setContentType(contentType);
+                    result.setEncodingAndType(contentType);
+                    result.setResponseData(st.getResponseSOAPContext().toString().getBytes());
                 }
-                result.setResponseHeaders("error");
             }
-            // 1-22-04 updated the sampler so that when read
-            // response is set, it also sets SamplerData with
-            // the XML message, so users can see what was
-            // sent. if read response is not checked, it will
-            // not set sampler data with the request message.
-            // peter lin.
-            // Removed URL, as that is already stored elsewere
-            result.setSamplerData(fileContents);// WARNING - could be large
-            if (st!= null){
-                result.setEncodingAndType(st.getResponseSOAPContext().getContentType());
+            if (st != null) {
+                SOAPContext sc = st.getResponseSOAPContext();
+                result.setResponseHeaders(convertSoapHeaders(sc.getRootPart().getAllHeaderLines()));
+            } else {
+                result.setResponseHeaders("error");                
             }
-            // setting this is just a formality, since
-            // soap will return a descriptive error
-            // message, soap errors within the response
-            // are preferred.
             if (br != null) {
                 br.close();
             }
@@ -613,6 +620,19 @@
         return buf.toString();
     }
 
+    /**
+     * Process headerLines
+     * @param en enumeration of Strings
+     * @return String containing the lines
+     */
+    private String convertSoapHeaders(Enumeration en) {
+        StringBuffer buf = new StringBuffer(100);
+        while (en.hasMoreElements()) {
+            buf.append(en.nextElement()).append("\n"); //$NON-NLS-1$
+        }
+        return buf.toString();
+    }
+
     public String getTimeout() {
         return getPropertyAsString(TIMEOUT);
     }

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=703675&r1=703674&r2=703675&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Sat Oct 11 08:36:01 2008
@@ -111,7 +111,7 @@
 <li>Bug 45887 - TCPSampler: timeout property incorrectly set</li>
 <li>Bug 45928 - AJP/1.3 Sampler doesn't retrieve his label from messages.properties</li>
 <li>Bug 45904 - Allow 'Not' Response Assertion to succeed with null sample</li>
-<li>HTTP and SOAP sampler character encodings updated to be more consistent</li>
+<li>HTTP, SOAP/XML-RPC and WebService(SOAP) sampler character encodings updated to be more consistent</li>
 <li>Bug 45976 - incomplete result file when using remote testing with more than 1 server</li>
 <li>Bug 45425 - JDBC Request does not support Unicode (changed sampler to use UTF-8)</li>
 </ul>



---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org