[
https://issues.apache.org/struts/browse/WW-3095?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=46271#action_46271
]
Martin Gainty commented on WW-3095:
-----------------------------------
you're definitely on the right track
org.apache.struts2.views.util.UrlHelper contains the translateAndEncode method
/*** Translates any script expressions using {...@link
com.opensymphony.xwork2.util.TextParseUtil#translateVariables} and
* encodes the URL using {...@link java.net.URLEncoder#encode} with the
encoding specified in the configuration.
* @param input
* @return the translated and encoded string
*/
public static String translateAndEncode(String input) {
//resolve any stack variables e.g. #attr.variable from ValueStack
String translatedInput = translateVariable(input);
//always UTF-8
String encoding = getEncodingFromConfiguration();
try {
//this is where the REAL encoding takes place
return URLEncoder.encode(translatedInput, encoding);
} catch (UnsupportedEncodingException e) {
LOG.warn("Could not encode URL parameter '" + input + "', returning
value un-encoded");
return translatedInput;
}
}
//org.apache.struts2.views.util.UrlHelper contains the translateAndDecode method
public static String translateAndDecode(String input) {
//resolve any #StackVars
String translatedInput = translateVariable(input);
//always UTF-8
String encoding = getEncodingFromConfiguration();
try
{
return URLDecoder.decode(translatedInput, encoding);
}
catch (UnsupportedEncodingException e)
{
LOG.warn("Could not encode URL parameter '" + input + "', returning
value un-encoded");
return translatedInput;
}
}
//and the translateVariable method
private static String translateVariable(String input) {
ValueStack valueStack =
ServletActionContext.getContext().getValueStack();
String output = TextParseUtil.translateVariables(input, valueStack);
return output;
}
//this only returns UTF-8
private static String getEncodingFromConfiguration() {
final String encoding;
// FIXME: temporary hack until class is made a properly injected bean
Container cont = ActionContext.getContext().getContainer();
String customEncoding = cont.getInstance(String.class,
StrutsConstants.STRUTS_I18N_ENCODING);
// public static final String STRUTS_I18N_ENCODING = "struts.i18n.encoding";
//struts.properties contains
//struts.i18n.encoding=UTF-8
if (customEncoding != null) {
encoding = customEncoding;
} else {
encoding = "UTF-8";
}
//FYI: there is no decision or configuration ability as you always return
"UTF-8"
return encoding; //always UTF-8
}
//but then again calling java.net.UrlEncoder.encode(string,"UTF-8") would
return 'supported code'
public static String encode(String s,String enc) throws
UnsupportedEncodingException
// Translates a string into application/x-www-form-urlencoded format using a
specific encoding scheme. //This method uses the supplied encoding scheme to
obtain the bytes for unsafe characters.
// Note: The World Wide Web Consortium Recommendation states that UTF-8
should be used. Not doing //so may introduce incompatibilites.
// Parameters:
// s - String to be translated.
// enc - The name of a supported character encoding.
// Returns:
// the translated String.
// Throws:
// UnsupportedEncodingException - If the named encoding is not supported
// Since:
// 1.4
concerning allowable characters ..here is what I gleaned from
http://www.w3.org/Addressing/URL/url-spec.txt spec:
hostname ialpha [ . hostname ]
// checking ialpha definition
ialpha alpha [ xalphas ]
//checking alpha definition
alpha a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r
| s | t | u | v | w | x | y | z | A | B | C | D | E | F | G | H | I | J | K |
L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
//essentially [a-z][A-Z]
//checking xalphas definition
xalphas xalpha [ xalphas ]
//check xalphas definition
xalpha alpha | digit | safe | extra | escape
//checking alpha [a-z][A-Z] (see above)
//checking digit
digit 0 |1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
//checking safe
safe $ | - | _ | @ | . | & | + | -
//checking extra
extra ! | * | " | ' | ( | ) | ,
//checking escape
escape % hex hex
//does this conform to your understanding?
> URL has no setEncoding
> ----------------------
>
> Key: WW-3095
> URL: https://issues.apache.org/struts/browse/WW-3095
> Project: Struts 2
> Issue Type: Bug
> Components: Plugin - Tags
> Affects Versions: 2.1.6
> Environment: Struts 2.1.6
> TC 6.0.14
> JDK 1.6.0.10
> Reporter: Martin Gainty
>
> If I set encoding the encoding to UTF-8 in struts.properties as
> struts.i18n.encoding=UTF-8
> //If I implement the include tag I see all appropriate annotations e.g.
> @StrutsTag(name="include",
> tldTagClass="org.apache.struts2.views.jsp.IncludeTag", description="Include a
> servlet's output " +
> "(result of servlet or a JSP page)")
> public class Include extends Component {
>
> //more importantly the include will support the STRUTS_I18N_ENCODING
> DefaultEncoding with this inject //annotation
> @Inject(StrutsConstants.STRUTS_I18N_ENCODING)
> public void setDefaultEncoding(String encoding) {
> defaultEncoding = encoding;
> }
> //but viewing the URL code I see
> @StrutsTag(name="url", tldTagClass="org.apache.struts2.views.jsp.URLTag",
> description="This tag is used to create a URL")
> public class URL extends ContextBean
> //there is no setDefaultEncoding which means any new encodings in
> struts.properties will not be reflected here
> MCG 22 April 09
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.