001 /** 002 * Implements the CFML Function urlencodedformat 003 */ 004 package railo.runtime.functions.other; 005 006 import java.io.UnsupportedEncodingException; 007 008 import railo.commons.lang.StringUtil; 009 import railo.commons.lang.URLEncoder; 010 import railo.runtime.PageContext; 011 import railo.runtime.exp.PageException; 012 import railo.runtime.ext.function.Function; 013 import railo.runtime.net.http.ReqRspUtil; 014 import railo.runtime.op.Caster; 015 016 public final class URLEncodedFormat implements Function { 017 018 private static final long serialVersionUID = 5640029138134769481L; 019 020 public static String call(PageContext pc , String str) throws PageException { 021 return call(pc,str, "UTF-8",true); 022 } 023 024 025 public static String call(PageContext pc , String str, String encoding) throws PageException { 026 return call(pc,str, encoding,true); 027 } 028 029 public static String call(PageContext pc , String str, String encoding,boolean force) throws PageException { 030 return invoke(str, encoding, force); 031 } 032 033 public static String invoke(String str, String encoding,boolean force) throws PageException { 034 if(!force && !ReqRspUtil.needEncoding(str,false)) 035 return str; 036 037 try { 038 String enc=railo.commons.net.URLEncoder.encode(str, encoding); 039 return StringUtil.replace(StringUtil.replace(StringUtil.replace(StringUtil.replace(StringUtil.replace(enc, "+", "%20", false), "*", "%2A", false), "-", "%2D", false), ".", "%2E", false), "_", "%5F", false);// TODO do better 040 //return enc; 041 } 042 catch (Throwable t) { 043 try { 044 return URLEncoder.encode(str, encoding); 045 } 046 catch (UnsupportedEncodingException e) { 047 throw Caster.toPageException(e); 048 } 049 } 050 } 051 052 }