package railo.runtime.tag;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import railo.commons.lang.StringUtil;
import railo.commons.net.HTTPUtil;
import railo.runtime.exp.Abort;
import railo.runtime.exp.ApplicationException;
import railo.runtime.exp.NativeException;
import railo.runtime.exp.PageException;
import railo.runtime.ext.tag.TagImpl;
import railo.runtime.listener.ApplicationContext;
import railo.runtime.op.Caster;
public final class Location extends TagImpl {
/** Yes or No. clientManagement must be enabled. Yes appends client variable
** information to the URL you specify in the url. */
private boolean addtoken=true;
/** The URL of the HTML file or CFML page to open. */
private String url="";
private int statuscode=302;
@Override
public void release() {
super.release();
addtoken=true;
url="";
statuscode=302;
}
/**
* @param statuscode the statuscode to set
* @throws ApplicationException
*/
public void setStatuscode(double statuscode) throws ApplicationException {
int sc=(int) statuscode;
if(sc<300 || sc>307)
throw new ApplicationException("invalid value for attribute statuscode ["+Caster.toString(statuscode)+"]",
"attribute must have one of the folloing values [300|301|302|303|304|305|307]");
this.statuscode = sc;
}
/** set the value addtoken
* Yes or No. clientManagement must be enabled. Yes appends client variable
* information to the URL you specify in the url.
* @param addtoken value to set
**/
public void setAddtoken(boolean addtoken) {
this.addtoken=addtoken;
}
/** set the value url
* The URL of the HTML file or CFML page to open.
* @param url value to set
* @throws ApplicationException
**/
public void setUrl(String url) throws ApplicationException {
this.url=url.trim();
if(this.url.length()==0) throw new ApplicationException("invalid url [empty string] for attribute url");
if(StringUtil.hasLineFeed(url)) throw new ApplicationException("invalid url ["+url+"] for attribute url, carriage-return or line-feed inside the url are not allowed");
}
@Override
public int doStartTag() throws PageException {
try {
pageContext.getOut().clear();
} catch (IOException e) {
throw Caster.toPageException(e);
}
HttpServletResponse rsp = pageContext. getHttpServletResponse();
url=HTTPUtil.encode(url);
// add token
if(addtoken && needId()) {
String[] arr=url.split("\\?");
// only string_name
if(arr.length==1) {
url+="?"+pageContext.getURLToken();
}
// script_name and query_string
else if(arr.length>1) {
url=arr[0]+"?"+pageContext.getURLToken();
for(int i=1;i<arr.length;i++)url+="&"+arr[i];
}
url=rsp.encodeRedirectURL(url);
}
rsp.setHeader("Connection", "close"); // IE unter IIS6, Win2K3 und Resin
rsp.setStatus(statuscode);
rsp.setHeader("location", url);
try {
pageContext.forceWrite("<html>\n<head>\n\t<title>Document Moved</title>\n");
//pageContext.forceWrite("\t<script>window.location='"+JSStringFormat.invoke(url)+"';</script>\n");
pageContext.forceWrite("</head>\n<body>\n\t<h1>Object Moved</h1>\n\t <a HREF=\""+url+"\">here</a>\n");
pageContext.forceWrite("</body>\n</html>");
} catch (IOException e) {
throw new NativeException(e);
}
if(pageContext.getConfig().debug())pageContext.getDebugger().setOutput(false);
throw new Abort(Abort.SCOPE_REQUEST);
}
private boolean needId() {
ApplicationContext ac = pageContext.getApplicationContext();
return ac.isSetClientManagement() || ac.isSetSessionManagement();
}
@Override
public int doEndTag() {
return EVAL_PAGE;
}
}