if(!e.done){
httpMethod.abort();
if(throwonerror)
throw new HTTPException("408 Request Time-out","a timeout occurred in tag http",408,"Time-out",null);
setRequestTimeout(cfhttp);
return;
//throw new ApplicationException("timeout");
}
}
httpMethod=e.httpMethod;
/////////////////////////////////////////// EXECUTE /////////////////////////////////////////////////
int status = httpMethod.getStatusCode();
String responseCharset=charset;
// Write Response Scope
//String rawHeader=httpMethod.getStatusLine().toString();
String mimetype=null;
String contentEncoding=null;
// status code
cfhttp.set(STATUSCODE,((httpMethod.getStatusCode()+" "+httpMethod.getStatusText()).trim()));
cfhttp.set(STATUS_CODE,new Double(httpMethod.getStatusCode()));
cfhttp.set(STATUS_TEXT,(httpMethod.getStatusText()));
cfhttp.set(HTTP_VERSION,(httpMethod.getStatusLine().getHttpVersion()));
//responseHeader
Header[] headers = httpMethod.getResponseHeaders();
StringBuffer raw=new StringBuffer(httpMethod.getStatusLine().toString()+" ");
Struct responseHeader = new StructImpl();
Array setCookie = new ArrayImpl();
for(int i=0;i<headers.length;i++) {
Header header=headers[i];
//print.ln(header);
raw.append(header+" ");
if(header.getName().equalsIgnoreCase("Set-Cookie"))
setCookie.append(header.getValue());
else {
//print.ln(header.getName()+"-"+header.getValue());
Object value=responseHeader.get(KeyImpl.getInstance(header.getName()),null);
if(value==null) responseHeader.set(KeyImpl.getInstance(header.getName()),header.getValue());
else {
Array arr=null;
if(value instanceof Array) {
arr=(Array) value;
}
else {
arr=new ArrayImpl();
responseHeader.set(KeyImpl.getInstance(header.getName()),arr);
arr.appendEL(value);
}
arr.appendEL(header.getValue());
}
}
// Content-Type
if(header.getName().equalsIgnoreCase("Content-Type")) {
mimetype=header.getValue();
if(mimetype==null)mimetype=NO_MIMETYPE;
}
// Content-Encoding
if(header.getName().equalsIgnoreCase("Content-Encoding")) {
contentEncoding=header.getValue();
}
}
cfhttp.set(RESPONSEHEADER,responseHeader);
responseHeader.set(STATUS_CODE,new Double(httpMethod.getStatusCode()));
responseHeader.set(EXPLANATION,(httpMethod.getStatusText()));
if(setCookie.size()>0)responseHeader.set(SET_COOKIE,setCookie);
// is text
boolean isText=
mimetype == null ||
mimetype == NO_MIMETYPE || HTTPUtil.isTextMimeType(mimetype);
cfhttp.set(TEXT,Caster.toBoolean(isText));
// mimetype charset
//boolean responseProvideCharset=false;
if(!StringUtil.isEmpty(mimetype)){
if(isText) {
String[] types=HTTPUtil.splitMimeTypeAndCharset(mimetype,null);
if(types!=null) {
if(types[0]!=null)cfhttp.set(MIME_TYPE,types[0]);
if(types[1]!=null)cfhttp.set(CHARSET,types[1]);
}
}
else cfhttp.set(MIME_TYPE,mimetype);
}
else cfhttp.set(MIME_TYPE,NO_MIMETYPE);
// File
Resource file=null;
if(strFile!=null && strPath!=null) {
file=ResourceUtil.toResourceNotExisting(pageContext, strPath).getRealResource(strFile);
}
else if(strFile!=null) {
file=ResourceUtil.toResourceNotExisting(pageContext, strFile);
}
else if(strPath!=null) {
file=ResourceUtil.toResourceNotExisting(pageContext, strPath);
//Resource dir = file.getParentResource();
if(file.isDirectory()){
file=file.getRealResource(httpMethod.getURI().getName());
}
}
if(file!=null)pageContext.getConfig().getSecurityManager().checkFileLocation(file);
// filecontent
//try {
//print.ln(">> "+responseCharset);
InputStream is=null;
if(isText && getAsBinary!=GET_AS_BINARY_YES) {
String str;
try {
is = httpMethod.getResponseBodyAsStream();
if(is!=null &&isGzipEncoded(contentEncoding))
is = new GZIPInputStream(is);
try {
str = is==null?"":IOUtil.toString(is,responseCharset);
}
catch (UnsupportedEncodingException uee) {
str = IOUtil.toString(is,(Charset)null);
}
}
catch (IOException ioe) {
throw Caster.toPageException(ioe);
}
finally {
IOUtil.closeEL(is);
}
if(str==null)str="";
if(resolveurl){
//URI uri = httpMethod.getURI();
if(e.redirectURL!=null)url=e.redirectURL.toExternalForm();
str=new URLResolver().transform(str,new URL(url),false);
}
cfhttp.set(FILE_CONTENT,str);
try {
if(file!=null){
IOUtil.write(file,str,pageContext.getConfig().getWebCharset(),false);
}
}
catch (IOException e1) {}
if(name!=null) {
Query qry = CSVParser.toQuery( str, delimiter, textqualifier, columns, firstrowasheaders );
pageContext.setVariable(name,qry);
}
}
// Binary
else {
byte[] barr=null;
if(isGzipEncoded(contentEncoding)){
is = new GZIPInputStream(httpMethod.getResponseBodyAsStream());
try {
barr = IOUtil.toBytes(is);
}
catch (IOException t) {
throw Caster.toPageException(t);
}
finally{
IOUtil.closeEL(is);
}
}
else {
try {
barr = httpMethod.getResponseBody();
}
catch (IOException t) {
throw Caster.toPageException(t);
}
}
cfhttp.set(FILE_CONTENT,barr);
if(file!=null) {
try {
if(barr!=null)IOUtil.copy(new ByteArrayInputStream(barr),file,true);
}
catch (IOException ioe) {
throw Caster.toPageException(ioe);
}
}
}
// header
cfhttp.set(HEADER,raw.toString());
if(status!=STATUS_OK){
cfhttp.setEL(ERROR_DETAIL,httpMethod.getStatusCode()+" "+httpMethod.getStatusText());
if(throwonerror){
int code=httpMethod.getStatusCode();
String text=httpMethod.getStatusText();
String msg=code+" "+text;
throw new HTTPException(msg,null,code,text,null);
}
}
}
finally {
releaseConnection(httpMethod);