package railo.runtime.schedule;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.charset.Charset;
import railo.commons.io.IOUtil;
import railo.commons.io.log.LogAndSource;
import railo.commons.io.res.ContentType;
import railo.commons.io.res.Resource;
import railo.commons.lang.StringUtil;
import railo.commons.net.http.HTTPEngine;
import railo.commons.net.http.HTTPResponse;
import railo.commons.net.http.Header;
import railo.commons.security.Credentials;
import railo.runtime.config.Config;
import railo.runtime.exp.PageException;
import railo.runtime.functions.other.CreateUUID;
import railo.runtime.net.proxy.ProxyData;
import railo.runtime.net.proxy.ProxyDataImpl;
import railo.runtime.util.URLResolver;
class ExecutionThread extends Thread {
private Config config;
private LogAndSource log;
private ScheduleTask task;
private String charset;
public ExecutionThread(Config config, LogAndSource log, ScheduleTask task, String charset) {
this.config=config;
this.log=log;
this.task=task;
this.charset=charset;
}
public void run() {
execute(config, log, task, charset);
}
public static void execute(Config config, LogAndSource log, ScheduleTask task, String charset) {
boolean hasError=false;
String logName="schedule task:"+task.getTask();
// init
//HttpClient client = new HttpClient();
//client.setStrictMode(false);
//HttpState state = client.getState();
String url;
if(task.getUrl().getQuery()==null)
url=task.getUrl().toExternalForm()+"?RequestTimeout="+(task.getTimeout()/1000);
else if(StringUtil.isEmpty(task.getUrl().getQuery()))
url=task.getUrl().toExternalForm()+"RequestTimeout="+(task.getTimeout()/1000);
else {
if(StringUtil.indexOfIgnoreCase(task.getUrl().getQuery()+"", "RequestTimeout")!=-1)
url=task.getUrl().toExternalForm();
else
url=task.getUrl().toExternalForm()+"&RequestTimeout="+(task.getTimeout()/1000);
}
//HttpMethod method = new GetMethod(url);
//HostConfiguration hostConfiguration = client.getHostConfiguration();
Header[] headers=new Header[]{
HTTPEngine.header("User-Agent","CFSCHEDULE")
};
//method.setRequestHeader("User-Agent","CFSCHEDULE");
// Userame / Password
Credentials credentials = task.getCredentials();
String user=null,pass=null;
if(credentials!=null) {
user=credentials.getUsername();
pass=credentials.getPassword();
//get.addRequestHeader("Authorization","Basic admin:spwwn1p");
}
// Proxy
ProxyData proxy=task.getProxyData();
if(!ProxyDataImpl.isValid(proxy) && config.isProxyEnableFor(task.getUrl().getHost())) {
proxy=config.getProxyData();
}
HTTPResponse rsp=null;
// execute
try {
rsp = HTTPEngine.get(new URL(url), user, pass, task.getTimeout(),HTTPEngine.MAX_REDIRECT, charset, null, proxy, headers);
} catch (Exception e) {
if(log!=null)log.error(logName,e.getMessage());
hasError=true;
}
// write file
Resource file = task.getResource();
if(!hasError && file!=null && task.isPublish()) {
String n=file.getName();
if(n.indexOf("{id}")!=-1){
n=StringUtil.replace(n, "{id}",CreateUUID.invoke(), false);
file=file.getParentResource().getRealResource(n);
}
if(isText(rsp) && task.isResolveURL()) {
String str;
try {
InputStream stream = rsp.getContentAsStream();
str = stream==null?"":IOUtil.toString(stream,(Charset)null);
if(str==null)str="";
}
catch (IOException e) {
str=e.getMessage();
}
try {
str=new URLResolver().transform(str,task.getUrl(),false);
} catch (PageException e) {
if(log!=null)log.error(logName,e.getMessage());
hasError=true;
}
try {
IOUtil.write(file,str,charset,false);
}
catch (IOException e) {
if(log!=null)log.error(logName,e.getMessage());
hasError=true;
}
}
else {
//print.out("1111111111111111111111111111111");
try {
IOUtil.copy(
rsp.getContentAsStream(),
file,
true
);
//new File(file.getAbsolutePath()).write(method.getResponseBodyAsStream());
}
catch (IOException e) {
if(log!=null)log.error(logName,e.getMessage());
hasError=true;
}
}
}
if(!hasError && log!=null)log.info(logName,"executed");
}
private static boolean isText(HTTPResponse rsp) {
ContentType ct = rsp.getContentType();
if(ct==null)return true;
String mimetype = ct.getMimeType();
return
mimetype == null || mimetype.startsWith("text") || mimetype.startsWith("application/octet-stream");
}
}