You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-dev@ws.apache.org by du...@locus.apache.org on 2000/08/17 21:10:59 UTC

cvs commit: xml-soap/java/src/org/apache/soap Utils.java

duftler     00/08/17 12:10:59

  Modified:    java/src/org/apache/soap Utils.java
  Log:
  Changed cleanString(...) to handle CDATA sections correctly.
  Thanks to Ross Milward (ross.milward@db.com) for pointing out this bug.
  
  Revision  Changes    Path
  1.3       +49 -13    xml-soap/java/src/org/apache/soap/Utils.java
  
  Index: Utils.java
  ===================================================================
  RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/Utils.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Utils.java	2000/05/30 10:23:52	1.2
  +++ Utils.java	2000/08/17 19:10:58	1.3
  @@ -78,23 +78,59 @@
   
       StringBuffer strBuf = new StringBuffer();
       char[] chars = orig.toCharArray();
  +    boolean inCDATA = false;
   
       for (int i = 0; i < chars.length; i++)
       {
  -      switch (chars[i])
  +      if (!inCDATA)
         {
  -        case '&'  : strBuf.append("&amp;");
  -                    break;
  -        case '\"' : strBuf.append("&quot;");
  -                    break;
  -        case '\'' : strBuf.append("&apos;");
  -                    break;
  -        case '<'  : strBuf.append("&lt;");
  -                    break;
  -        case '>'  : strBuf.append("&gt;");
  -                    break;
  -        default   : strBuf.append(chars[i]);
  -                    break;
  +        switch (chars[i])
  +        {
  +          case '&'  : strBuf.append("&amp;");
  +                      break;
  +          case '\"' : strBuf.append("&quot;");
  +                      break;
  +          case '\'' : strBuf.append("&apos;");
  +                      break;
  +          case '<'  :
  +                      {
  +                        if (chars.length >= i + 9)
  +                        {
  +                          String tempStr = new String(chars, i, 9);
  +
  +                          if (tempStr.equals("<![CDATA["))
  +                          {
  +                            strBuf.append(tempStr);
  +                            i += 8;
  +                            inCDATA = true;
  +                          }
  +                          else
  +                          {
  +                            strBuf.append("&lt;");
  +                          }
  +                        }
  +                        else
  +                        {
  +                          strBuf.append("&lt;");
  +                        }
  +                      }
  +                      break;
  +          case '>'  : strBuf.append("&gt;");
  +                      break;
  +          default   : strBuf.append(chars[i]);
  +                      break;
  +        }
  +      }
  +      else
  +      {
  +        strBuf.append(chars[i]);
  +
  +        if (chars[i] == '>'
  +            && chars[i - 1] == ']'
  +            && chars[i - 2] == ']')
  +        {
  +          inCDATA = false;
  +        }
         }
       }