You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Martin Gainty (JIRA)" <ji...@apache.org> on 2009/04/22 15:19:06 UTC
[jira] Created: (WW-3095) URL has no setEncoding
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.
[jira] Commented: (WW-3095) URL has no setEncoding
Posted by "Martin Gainty (JIRA)" <ji...@apache.org>.
[ 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.
[jira] Commented: (WW-3095) URL has no setEncoding
Posted by "Wes Wannemacher (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/struts/browse/WW-3095?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=46262#action_46262 ]
Wes Wannemacher commented on WW-3095:
-------------------------------------
Martin, I'm not sure if you're allowed to use non-alphanumeric characters in an URL... I'm looking through the URL spec - http://www.w3.org/Addressing/URL/url-spec.txt and I don't see a part of the URL where anything other than [a-zA-Z0-9+%/] is allowed. I could be wrong though...
> 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.