Index: core/src/main/java/com/xpn/xwiki/plugin/packaging/PackageAPI.java =================================================================== --- core/src/main/java/com/xpn/xwiki/plugin/packaging/PackageAPI.java (revision 2345) +++ core/src/main/java/com/xpn/xwiki/plugin/packaging/PackageAPI.java (working copy) @@ -158,7 +158,7 @@ public String export() throws IOException, XWikiException { getXWikiContext().getResponse().setContentType("application/zip"); - getXWikiContext().getResponse().addHeader("Content-disposition", "attachment; filename=" + XWiki.getURLEncoded(plugin.getName()) + ".xar"); + getXWikiContext().getResponse().addHeader("Content-disposition", "attachment; filename=" + context.getWiki().getURLEncoded(plugin.getName()) + ".xar"); getXWikiContext().setFinished(true); return plugin.export(getXWikiContext().getResponse().getOutputStream(), getXWikiContext()); } Index: core/src/main/java/com/xpn/xwiki/api/XWiki.java =================================================================== --- core/src/main/java/com/xpn/xwiki/api/XWiki.java (revision 2345) +++ core/src/main/java/com/xpn/xwiki/api/XWiki.java (working copy) @@ -209,7 +209,7 @@ public String getURLEncoded(String content) { - return com.xpn.xwiki.XWiki.getURLEncoded(content); + return xwiki.getURLEncoded(content); } /** Index: core/src/main/java/com/xpn/xwiki/XWiki.java =================================================================== --- core/src/main/java/com/xpn/xwiki/XWiki.java (revision 2345) +++ core/src/main/java/com/xpn/xwiki/XWiki.java (working copy) @@ -1046,10 +1046,10 @@ return scontent; } - public static String getURLEncoded(String content) + public String getURLEncoded(String content) { try { - return URLEncoder.encode(content, "UTF-8"); + return URLEncoder.encode(content, this.getEncoding()); } catch (UnsupportedEncodingException e) { return content; } @@ -3663,12 +3663,29 @@ if ((request.getParameter("topic") != null) && (action.equals("edit") || action.equals("inline"))) docname = request.getParameter("topic"); - else - docname = getDocumentNameFromPath(request.getPathInfo(), context); + else { + docname = getDocumentNameFromPath(fixDecodedURI(request, request.getPathInfo()), context); + } } return docname; } + private String fixDecodedURI(XWikiRequest request, String uri) { + // PATCH: tomcat does not properly handle URIs with non ascii characters. + // By default, it decodes the URI as if it was encoded in ISO-8859-1 + // there is currently no setting to modify this behaviour, so we have to + // fix the improperly decoded URI. + if (!"ISO-8859-1".equals(getEncoding())) { + try { + byte[] urib = uri.getBytes("ISO-8859-1"); + return new String(urib, getEncoding()); + } catch (UnsupportedEncodingException e) { + log.error("Unsupported Encoding Exception received, check your xwiki config.", e); + } + } + return uri; + } + public boolean prepareDocuments(XWikiRequest request, XWikiContext context, VelocityContext vcontext) throws XWikiException { Index: core/src/main/java/com/xpn/xwiki/util/TOCGenerator.java =================================================================== --- core/src/main/java/com/xpn/xwiki/util/TOCGenerator.java (revision 2345) +++ core/src/main/java/com/xpn/xwiki/util/TOCGenerator.java (working copy) @@ -110,7 +110,7 @@ public static String makeHeadingID (String text, int occurence, XWikiContext context) { // Encode to convert unsafe chars //text = Utils.encode(text.trim(), context); - text = "H" + XWiki.getURLEncoded(text); + text = "H" + context.getWiki().getURLEncoded(text); text = text.replaceAll("[^a-zA-Z0-9]", ""); if (occurence > 0) { Index: core/src/main/java/com/xpn/xwiki/web/DownloadAction.java =================================================================== --- core/src/main/java/com/xpn/xwiki/web/DownloadAction.java (revision 2345) +++ core/src/main/java/com/xpn/xwiki/web/DownloadAction.java (working copy) @@ -72,7 +72,7 @@ String mimetype = attachment.getMimeType(context); response.setContentType(mimetype); - String ofilename = XWiki.getURLEncoded(attachment.getFilename()).replaceAll("\\+", " "); + String ofilename = context.getWiki().getURLEncoded(attachment.getFilename()).replaceAll("\\+", " "); // The inline attribute of Content-Disposition tells the browser that they should display // the downloaded file in the page (see http://www.ietf.org/rfc/rfc1806.txt for more Index: web/standard/src/main/webapp/skins/xwiki10b1/login.vm =================================================================== --- web/standard/src/main/webapp/skins/xwiki10b1/login.vm (revision 2345) +++ web/standard/src/main/webapp/skins/xwiki10b1/login.vm (working copy) @@ -1,6 +1,6 @@ #if($context.user!="XWiki.XWikiGuest") #if($request.xredirect) -$response.sendRedirect($request.xredirect) +$response.sendRedirect($xwiki.getURLEncoded($request.xredirect)) #else $response.sendRedirect($xwiki.getURL("Main.WebHome")) #end Index: web/standard/src/main/webapp/skins/xwiki10b1/global.vm =================================================================== --- web/standard/src/main/webapp/skins/xwiki10b1/global.vm (revision 2345) +++ web/standard/src/main/webapp/skins/xwiki10b1/global.vm (working copy) @@ -36,10 +36,10 @@ #end #if ($context.action != "loginerror") #if ($isguest) -#set($loginurl = $xwiki.getURL("XWiki.XWikiLogin", "login", "xredirect=$logredir")) +#set($loginurl = $xwiki.getURL("XWiki.XWikiLogin", "login", "xredirect=$xwiki.getURLEncoded($logredir)")) $!msg.get("login")#sep() #else -#set($logouturl = $xwiki.getURL("XWiki.XWikiLogout","logout", "xredirect=$logredir")) +#set($logouturl = $xwiki.getURL("XWiki.XWikiLogout","logout", "xredirect=$xwiki.getURLEncoded($logredir)")) $!msg.get("logout")#sep() #end #end Index: web/standard/src/main/webapp/skins/xwiki10b1/create.vm =================================================================== --- web/standard/src/main/webapp/skins/xwiki10b1/create.vm (revision 2345) +++ web/standard/src/main/webapp/skins/xwiki10b1/create.vm (working copy) @@ -48,9 +48,13 @@ ##$newdoc.getURL("edit", "template=${template}&parent=${parent}$auxparams")) #if($newdoc.isNew()) #if($tocreate == "post") -$response.sendRedirect($newdoc.getURL("inline", "parent=Blog.WebHome&template=XWiki.ArticleClassTemplate&XWiki.ArticleClass_0_title=$title")) +#set($etitle = $xwiki.getURLEncoded($title)) +$response.sendRedirect($newdoc.getURL("inline", "parent=Blog.WebHome&template=XWiki.ArticleClassTemplate&XWiki.ArticleClass_0_title=$etitle")) #else -$response.sendRedirect($newdoc.getURL("edit", "template=${template}&parent=${parent}${auxparams}&title=$title")) +#set($etitle = $xwiki.getURLEncoded($title)) +#set($etemplate = $xwiki.getURLEncoded("${template}")) +#set($eparent = $xwiki.getURLEncoded("${parent}${auxparams}")) +$response.sendRedirect($newdoc.getURL("edit", "template=${etemplate}&parent=${eparent}&title=$etitle")) #end #else $response.sendRedirect($newdoc.getURL("view", "xpage=docalreadyexists"))