. Fix to server-side WebDav URL encoding (was not encoding to UTF-8 url format)

. Fix to server-side WebDav HTML page link encoding (was not encoding names of items in HTML format inside HREFs)

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2088 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2006-01-09 15:28:53 +00:00
parent 05bee5c2ef
commit 39959718c1
3 changed files with 163 additions and 100 deletions

View File

@@ -25,6 +25,7 @@ import java.util.Date;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.StringTokenizer;
import javax.servlet.http.HttpServletRequest;
@@ -405,28 +406,37 @@ public class WebDAV
String servletPath = request.getServletPath();
int rootPos = urlStr.indexOf(servletPath);
if ( rootPos != -1)
urlStr.setLength(rootPos + servletPath.length());
if ( urlStr.charAt(urlStr.length() - 1) != PathSeperatorChar)
urlStr.append(PathSeperator);
if ( path.equals(RootPath) == false)
if (rootPos != -1)
{
if ( path.startsWith(PathSeperator))
urlStr.append(path.substring(1));
else
urlStr.append(path);
urlStr.setLength(rootPos + servletPath.length());
}
if (urlStr.charAt(urlStr.length() - 1) != PathSeperatorChar)
{
urlStr.append(PathSeperator);
}
if (path.equals(RootPath) == false)
{
// split the path and URL encode each path element
for (StringTokenizer t = new StringTokenizer(path, PathSeperator); t.hasMoreTokens(); /**/)
{
urlStr.append( WebDAVHelper.encodeURL(t.nextToken()) );
if (t.hasMoreTokens())
{
urlStr.append(PathSeperator);
}
}
}
// If the URL is to a collection add a trailing slash
if ( isCollection && urlStr.charAt( urlStr.length() - 1) != PathSeperatorChar)
if (isCollection && urlStr.charAt( urlStr.length() - 1) != PathSeperatorChar)
{
urlStr.append( PathSeperator);
// Return the encoded URL string
return encodeURL( urlStr.toString());
}
// Return the URL string
return urlStr.toString();
}
/**
@@ -507,86 +517,6 @@ public class WebDAV
return strNormalized;
}
/**
* Encodes the given URL string
*
* @param string the String to convert
*/
public static String encodeURL(String string)
{
if (string == null)
{
return "";
}
StringBuilder sb = null; //create on demand
String enc;
char c;
for (int i = 0; i < string.length(); i++)
{
enc = null;
c = string.charAt(i);
switch (c)
{
case '"': enc = "&quot;"; break; //"
case '&': enc = "&amp;"; break; //&
case '<': enc = "&lt;"; break; //<
case '>': enc = "&gt;"; break; //>
//german umlauts
case '\u00E4' : enc = "&auml;"; break;
case '\u00C4' : enc = "&Auml;"; break;
case '\u00F6' : enc = "&ouml;"; break;
case '\u00D6' : enc = "&Ouml;"; break;
case '\u00FC' : enc = "&uuml;"; break;
case '\u00DC' : enc = "&Uuml;"; break;
case '\u00DF' : enc = "&szlig;"; break;
//misc
//case 0x80: enc = "&euro;"; break; sometimes euro symbol is ascii 128, should we suport it?
case '\u20AC': enc = "&euro;"; break;
case '\u00AB': enc = "&laquo;"; break;
case '\u00BB': enc = "&raquo;"; break;
case '\u00A0': enc = "&nbsp;"; break;
default:
if (((int)c) >= 0x80)
{
//encode all non basic latin characters
enc = "&#" + ((int)c) + ";";
}
break;
}
if (enc != null)
{
if (sb == null)
{
String soFar = string.substring(0, i);
sb = new StringBuilder(i + 8);
sb.append(soFar);
}
sb.append(enc);
}
else
{
if (sb != null)
{
sb.append(c);
}
}
}
if (sb == null)
{
return string;
}
else
{
return sb.toString();
}
}
/**
* Make a unique lock token
*