You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jmeter.apache.org by sebb <se...@gmail.com> on 2012/12/02 00:55:41 UTC

Re: svn commit: r1416080 - in /jmeter/trunk: src/protocol/http/org/apache/jmeter/protocol/http/proxy/DefaultSamplerCreator.java test/src/org/apache/jmeter/protocol/http/proxy/TestHttpRequestHdr.java xdocs/changes.xml

On 1 December 2012 23:26,  <pm...@apache.org> wrote:
> Author: pmouawad
> Date: Sat Dec  1 23:26:37 2012
> New Revision: 1416080
>
> URL: http://svn.apache.org/viewvc?rev=1416080&view=rev
> Log:
> Bug 53840 - Proxy Recording : Response message: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "" "
> Bugzilla Id: 53840
>
> Modified:
>     jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/DefaultSamplerCreator.java
>     jmeter/trunk/test/src/org/apache/jmeter/protocol/http/proxy/TestHttpRequestHdr.java
>     jmeter/trunk/xdocs/changes.xml
>
> Modified: jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/DefaultSamplerCreator.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/DefaultSamplerCreator.java?rev=1416080&r1=1416079&r2=1416080&view=diff
> ==============================================================================
> --- jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/DefaultSamplerCreator.java (original)
> +++ jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/DefaultSamplerCreator.java Sat Dec  1 23:26:37 2012
> @@ -20,10 +20,15 @@ package org.apache.jmeter.protocol.http.
>
>  import java.io.File;
>  import java.io.IOException;
> +import java.io.StringReader;
>  import java.net.MalformedURLException;
>  import java.net.URL;
>  import java.util.Map;
>
> +import javax.xml.parsers.ParserConfigurationException;
> +import javax.xml.parsers.SAXParser;
> +import javax.xml.parsers.SAXParserFactory;
> +
>  import org.apache.commons.io.FileUtils;
>  import org.apache.commons.lang3.StringUtils;
>  import org.apache.jmeter.protocol.http.config.MultipartUrlConfig;
> @@ -37,6 +42,11 @@ import org.apache.jmeter.protocol.http.u
>  import org.apache.jmeter.testelement.TestElement;
>  import org.apache.jorphan.logging.LoggingManager;
>  import org.apache.log.Logger;
> +import org.xml.sax.InputSource;
> +import org.xml.sax.SAXException;
> +import org.xml.sax.SAXParseException;
> +import org.xml.sax.XMLReader;
> +import org.xml.sax.helpers.DefaultHandler;
>
>  /**
>   * Default implementation that handles classical HTTP textual + Multipart requests
> @@ -173,7 +183,7 @@ public class DefaultSamplerCreator exten
>                  // Set the file uploads
>                  sampler.setHTTPFiles(urlConfig.getHTTPFileArgs().asArray());
>              // used when postData is pure xml (eg. an xml-rpc call) or for PUT
> -            } else if (postData.trim().startsWith("<?") || HTTPConstants.PUT.equals(sampler.getMethod())) {
> +            } else if ((postData.trim().startsWith("<?") || isPotentialXml(postData)) || HTTPConstants.PUT.equals(sampler.getMethod())) {

It would be better to invoke the method isPotentialXml() last, as it
is a lot more expensive than checking the method type.

i.e. change the order to:

} else if ((postData.trim().startsWith("<?") ||
HTTPConstants.PUT.equals(sampler.getMethod()) ||
isPotentialXml(postData))) {

>                  sampler.addNonEncodedArgument("", postData, "");
>              } else if (contentType == null ||
>                      (contentType.startsWith(HTTPConstants.APPLICATION_X_WWW_FORM_URLENCODED) &&
> @@ -202,6 +212,58 @@ public class DefaultSamplerCreator exten
>      }
>
>      /**
> +     * Tries parsing to see if content is xml
> +     * @param postData String
> +     * @return boolean
> +     */
> +    private static final boolean isPotentialXml(String postData) {
> +        try {
> +            SAXParserFactory spf = SAXParserFactory.newInstance();
> +            SAXParser saxParser = spf.newSAXParser();
> +            XMLReader xmlReader = saxParser.getXMLReader();
> +            ErrorDetectionHandler detectionHandler =
> +                    new ErrorDetectionHandler();
> +            xmlReader.setContentHandler(detectionHandler);
> +            xmlReader.parse(new InputSource(new StringReader(postData)));
> +            return detectionHandler.isErrorDetected();
> +        } catch (ParserConfigurationException e) {
> +            return false;
> +        } catch (SAXException e) {
> +            return false;
> +        } catch (IOException e) {
> +            return false;
> +        }
> +    }
> +
> +    private static final class ErrorDetectionHandler extends DefaultHandler {
> +        private boolean errorDetected = false;
> +        public ErrorDetectionHandler() {
> +            super();
> +        }
> +        /* (non-Javadoc)
> +         * @see org.xml.sax.helpers.DefaultHandler#error(org.xml.sax.SAXParseException)
> +         */
> +        @Override
> +        public void error(SAXParseException e) throws SAXException {
> +            this.errorDetected = true;
> +        }
> +
> +        /* (non-Javadoc)
> +         * @see org.xml.sax.helpers.DefaultHandler#fatalError(org.xml.sax.SAXParseException)
> +         */
> +        @Override
> +        public void fatalError(SAXParseException e) throws SAXException {
> +            this.errorDetected = true;
> +        }
> +        /**
> +         * @return the errorDetected
> +         */
> +        public boolean isErrorDetected() {
> +            return errorDetected;
> +        }
> +
> +    }
> +    /**
>       * Compute sampler name
>       * @param sampler {@link HTTPSamplerBase}
>       * @param request {@link HttpRequestHdr}
>
> Modified: jmeter/trunk/test/src/org/apache/jmeter/protocol/http/proxy/TestHttpRequestHdr.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/protocol/http/proxy/TestHttpRequestHdr.java?rev=1416080&r1=1416079&r2=1416080&view=diff
> ==============================================================================
> --- jmeter/trunk/test/src/org/apache/jmeter/protocol/http/proxy/TestHttpRequestHdr.java (original)
> +++ jmeter/trunk/test/src/org/apache/jmeter/protocol/http/proxy/TestHttpRequestHdr.java Sat Dec  1 23:26:37 2012
> @@ -136,6 +136,40 @@ public class TestHttpRequestHdr  extends
>          arguments = s.getArguments();
>          assertEquals(1, arguments.getArgumentCount());
>          checkArgument((HTTPArgument)arguments.getArgument(0), "", postBody, postBody, contentEncoding, false);
> +
> +        // A HTTP POST request, with content-type text/plain; charset=UTF-8
> +        // The encoding should be picked up from the header we send with the request
> +        contentEncoding = "UTF-8";
> +        url =  "http://vmdal-hqqa9/retalixhq/GG_Implementation/ScreenEntity/ScreenEntityHTTP.aspx?Action=Save&ET=Vendor&TT=Single&Sid=1347280336092";
> +        postBody = "<Action UIStatus=\"2\"><Vendor Id=\"9292\" HOST_ID=\"0\" VENDOR=\"9292\" TERMS_TYPE=\"No Terms\" TERMS=\"0 %\" AUTO_PRICE=\"Use System Default\" VM_VENDOR_TYPE=\"DSD Vendor\" ITEM_FORMAT=\"PLU\" COST_ENTRY_SORT=\"UPC/EAN\" VM_REPORT_SORT=\"UPC/EAN\" VM_ORDER_SORT=\"UPC/EAN\" VM_RECEIVING_SORT=\"UPC/EAN\" VM_MAX_BACK_ORDERS=\"99\" MAX_OPEN_DAYS=\"99\" PAY_BASED_ON=\"System Cost\" ORDER_COST_DATE=\"Use System Rule\" VM_CONSIDER_FREE=\"False\" VM_SHOW_DETAIL=\"False\" VM_UPDATE_COST=\"No\" RD_USE_VENDOR_CC=\"False\" BLIND_RECEIVING=\"Default\" EXCLUDE_RECEIVED_COST=\"False\" PRINT_ITEM_ADJ=\"False\" PRINT_OVERALL_ADJ=\"False\" PRINT_TAX_DETAIL=\"False\" BLOCK_PRICE_VIEW=\"False\" DELIVERY_STATUS=\"No Delivery\" AUTO_RECEIVE=\"False\" TARGET_GM_FLAG=\"%\" MINIMUM_GM_FLAG=\"%\" MARGIN_TYPE=\"Gross Margin\" HOLD_REGULAR=\"Default\" HOLD_SPECIALS=\"Default\" TRUSTING_VENDOR=\"False\" AUTO_ACCEPT=\"All\" EARLY_RCPT_AFFECTS=\"All Costs\" SBT_ELIGIBLE=\"Not eligibl
>  e\" SBT_REPORTING_DAY=\"Monday\" AUTO_BALANCE_FLAG=\"$\" DAX_MANAGED=\"False\" CHANGE_ID=\"QA\" CHANGE_SOURCE=\"Manual Change\" ORIGINAL_SOURCE=\"Manual Change\" RECORD_STATUS=\"Add\" RECORD_STATUS_DATE=\"9/7/2012 8:34:58 AM\" VENDOR_NAME=\"test\" UIStatus=\"2\"/></Action>";
> +        testPostRequest = "POST " + url + " HTTP/1.1\r\n"
> +                + "x-requested-with: XMLHttpRequest" + "\r\n"
> +                + "Accept-Language: en-us" + "\r\n"
> +                + "Referer: http://vmdal-hqqa9/retalixhq/GG_Implementation/ScreenEntity/ScreenEntityPage.aspx?ET=Vendor&TT=Single&WM=2&UID=9292&Sid=1347280331908&UITH=Blue&MUID=window_0" + "\r\n"
> +                + "Accept: */*" + "\r\n"
> +                + "Content-Type: application/x-www-form-urlencoded" + "\r\n"
> +                + "Accept-Encoding: gzip, deflate" + "\r\n"
> +                + "User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; Tablet PC 2.0)" + "\r\n"
> +                + "Host: vmdal-hqqa9" + "\r\n"
> +                + "Content-Length: "+ getBodyLength(postBody, contentEncoding) + "\r\n"
> +                + "Proxy-Connection: Keep-Alive" + "\r\n"
> +                + "Pragma: no-cache" + "\r\n"
> +                + "Cookie: RHQ=sid=5aaeb66c-e174-4f4c-9928-83cffcc62150" + "\r\n"
> +                + "\r\n"
> +                + postBody;
> +        // Use null for url to simulate that HttpRequestHdr do not
> +        // know the encoding for the page. Specify contentEncoding, so the
> +        // request is "sent" using that encoding
> +        s = getSamplerForRequest(null, testPostRequest, contentEncoding);
> +        assertEquals(HTTPConstants.POST, s.getMethod());
> +        assertFalse(s.getDoMultipartPost());
> +        // TODO Should this be OK ?
> +        //assertEquals(contentEncoding, s.getContentEncoding());
> +        // Check arguments
> +        // We should have one argument, with the value equal to the post body
> +        arguments = s.getArguments();
> +        assertEquals(1, arguments.getArgumentCount());
> +        checkArgument((HTTPArgument)arguments.getArgument(0), "", postBody, postBody, contentEncoding, false);
>      }
>
>      public void testEncodedArguments() throws Exception {
>
> Modified: jmeter/trunk/xdocs/changes.xml
> URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1416080&r1=1416079&r2=1416080&view=diff
> ==============================================================================
> --- jmeter/trunk/xdocs/changes.xml (original)
> +++ jmeter/trunk/xdocs/changes.xml Sat Dec  1 23:26:37 2012
> @@ -113,6 +113,7 @@ It has been removed so now size of these
>  <li>Don't log spurious warning messages when using concurrent pool embedded downloads with Cache Manager or CookieManager</li>
>  <li><bugzilla>54057</bugzilla>- Proxy option to set user and password at startup (-u and -a) not working with HTTPClient 4</li>
>  <li><bugzilla>54187</bugzilla> - Request tab does not show headers if request fails</li>
> +<li>Bug 53840 - Proxy Recording : Response message: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "" "</li>
>  </ul>
>
>  <h3>Other Samplers</h3>
>
>