You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by aw...@apache.org on 2007/06/29 19:43:08 UTC

svn commit: r551975 - in /myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal: io/HtmlResponseWriter.java share/url/EncoderUtils.java

Author: awiner
Date: Fri Jun 29 10:43:07 2007
New Revision: 551975

URL: http://svn.apache.org/viewvc?view=rev&rev=551975
Log:
TRINIDAD-84: Validity: in URI attributes, ampersands should be escaped as &
- Add alternative codepaths to EncoderUtils where '&' becomes '&'

Modified:
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/io/HtmlResponseWriter.java
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/url/EncoderUtils.java

Modified: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/io/HtmlResponseWriter.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/io/HtmlResponseWriter.java?view=diff&rev=551975&r1=551974&r2=551975
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/io/HtmlResponseWriter.java (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/io/HtmlResponseWriter.java Fri Jun 29 10:43:07 2007
@@ -275,7 +275,7 @@
     if (stringValue.startsWith("javascript:"))
       HTMLEscapes.writeAttribute(out, _buffer, stringValue);
     else
-      EncoderUtils.writeURL(out, stringValue, _encoding, false);
+      EncoderUtils.writeURLForHTML(out, stringValue, _encoding, false);
 
     out.write('"');
   }

Modified: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/url/EncoderUtils.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/url/EncoderUtils.java?view=diff&rev=551975&r1=551974&r2=551975
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/url/EncoderUtils.java (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/url/EncoderUtils.java Fri Jun 29 10:43:07 2007
@@ -153,10 +153,24 @@
     String      queryEncoding,
     boolean     useISOForBody) throws IOException, UnsupportedEncodingException
   {
-    _writeURL(out, text, queryEncoding, useISOForBody, 0, false);
+    _writeURL(out, text, queryEncoding, useISOForBody, 0, false, false);
   }
 
   /**
+   * A clone of writeURL(), but applying rules knowing that it
+   * is outputting HTML.
+   */
+  static public void writeURLForHTML(
+    Writer      out,
+    String      text,
+    String      queryEncoding,
+    boolean     useISOForBody) throws IOException, UnsupportedEncodingException
+  {
+    _writeURL(out, text, queryEncoding, useISOForBody, 0, false, true);
+  }
+
+
+  /**
    * Writes a query parameter.  Very few clients will
    * need to use this method - most will just call
    * writeURL or encodeURL.
@@ -165,9 +179,10 @@
     Writer       out,
     String       text,
     String       encoding,
-    int          start)  throws IOException, UnsupportedEncodingException
+    int          start,
+    boolean      forHtml)  throws IOException, UnsupportedEncodingException
   {
-    _encodeString(out, text, encoding, start, _DONT_ENCODE_SET, true);
+    _encodeString(out, text, encoding, start, _DONT_ENCODE_SET, true, forHtml);
   }
 
 
@@ -306,7 +321,8 @@
     String      queryEncoding,
     boolean     useISOForBody,
     int         start,
-    boolean     inAnchor) throws IOException, UnsupportedEncodingException
+    boolean     inAnchor,
+    boolean     forHtml) throws IOException, UnsupportedEncodingException
   {
     int length = text.length();
 
@@ -429,10 +445,17 @@
           // as if it were in the request's character set.  So use
           // the real encoding for those!
           out.write('?');
-          writeQueryParameters(out, text, queryEncoding, i + 1);
+          writeQueryParameters(out, text, queryEncoding, i + 1, forHtml);
           return;
         }
       }
+      else if (ch == '&')
+      {
+        if (forHtml)
+          out.write("&");
+        else
+          out.write(ch);
+      }
       else
       {
         out.write(ch);
@@ -493,7 +516,7 @@
     StringWriter sw = new StringWriter(text.length());
     try
     {
-      _encodeString(sw, text, encoding, 0, _DONT_ENCODE_SET_SMALL, false);
+      _encodeString(sw, text, encoding, 0, _DONT_ENCODE_SET_SMALL, false, false);
     }
     catch (UnsupportedEncodingException uee)
     {
@@ -614,7 +637,8 @@
     String       encoding,
     int          start,
     BitSet       dontEncodeSet,
-    boolean      lookForAnchor)
+    boolean      lookForAnchor,
+    boolean      forHtml)
       throws IOException, UnsupportedEncodingException
   {
     ByteArrayOutputStream buf    = null;
@@ -631,12 +655,19 @@
       if (lookForAnchor && ('#' == ch))
       {
         out.write(ch);
-        _writeURL(out, text, encoding, false, i + 1, true);
+        _writeURL(out, text, encoding, false, i + 1, true, forHtml);
         return;
       }
       else if (dontEncodeSet.get(ch))
       {
-        out.write(ch);
+        if (forHtml && (ch == '&'))
+        {
+          out.write("&");
+        }
+        else
+        {
+          out.write(ch);
+        }
       }
       else
       {