package railo.runtime.tag; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletResponse; import railo.runtime.exp.PageException; import railo.runtime.exp.TemplateException; import railo.runtime.ext.tag.TagImpl; import railo.runtime.op.Caster; /** * Generates custom HTTP response headers to return to the client. * * * **/ public final class Header extends TagImpl { /** A value for the HTTP header. This attribute is used in conjunction with the name attribute. */ private String value=""; /** Text that explains the status code. This attribute is used in conjunction with the ** statusCode attribute. */ private String statustext; /** A name for the header. */ private String name; /** A number that sets the HTTP status code. */ private int statuscode; private boolean hasStatucCode; private String charset; @Override public void release() { super.release(); value=""; statustext=null; name=null; statuscode=0; hasStatucCode=false; charset=null; } /** set the value value * A value for the HTTP header. This attribute is used in conjunction with the name attribute. * @param value value to set **/ public void setValue(String value) { this.value=value; } /** set the value statustext * Text that explains the status code. This attribute is used in conjunction with the * statusCode attribute. * @param statustext value to set **/ public void setStatustext(String statustext) { this.statustext=statustext; } /** set the value name * A name for the header. * @param name value to set **/ public void setName(String name) { this.name=name; } /** set the value statuscode * A number that sets the HTTP status code. * @param statuscode value to set **/ public void setStatuscode(double statuscode) { this.statuscode=(int) statuscode; hasStatucCode=true; } /** * @param charset The charset to set. */ public void setCharset(String charset) { this.charset = charset; } @Override public int doStartTag() throws PageException { HttpServletResponse rsp = pageContext. getHttpServletResponse(); if(rsp.isCommitted()) throw new TemplateException("can't assign value to header, header is alredy committed"); // set name value if(name != null) { if(charset==null && name.equalsIgnoreCase("content-disposition")) { charset=pageContext.getConfig().getWebCharset(); } try { if(charset!=null) { name = new String(name.getBytes(charset), "ISO-8859-1"); value = new String(value.getBytes(charset), "ISO-8859-1"); } else { name = new String(name.getBytes(), "ISO-8859-1"); value = new String(value.getBytes(), "ISO-8859-1"); } } catch (UnsupportedEncodingException e) { throw Caster.toPageException(e); } if(name.toLowerCase().equals("content-type") && value.length()>0) { rsp.setContentType(value); } else { rsp.addHeader(name, value); } } // set status if(hasStatucCode) { if(statustext != null) { //try { ///rsp.sendError(statuscode, statustext); rsp.setStatus(statuscode,statustext); /*} catch (IOException e) { throw new TemplateException("can't assign value to header, header is alredy committed",e.getMessage()); } */ } else { rsp.setStatus(statuscode); } } return SKIP_BODY; } @Override public int doEndTag() { return EVAL_PAGE; } }