/** * * Copyright (c) 2014, the Railo Company Ltd. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see <http://www.gnu.org/licenses/>. * **/ package lucee.runtime.schedule; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.nio.charset.Charset; import lucee.commons.io.IOUtil; import lucee.commons.io.log.Log; import lucee.commons.io.log.LogUtil; import lucee.commons.io.res.ContentType; import lucee.commons.io.res.Resource; import lucee.commons.lang.StringUtil; import lucee.commons.net.http.HTTPEngine; import lucee.commons.net.http.HTTPResponse; import lucee.commons.net.http.Header; import lucee.commons.security.Credentials; import lucee.runtime.config.Config; import lucee.runtime.config.ConfigImpl; import lucee.runtime.exp.PageException; import lucee.runtime.functions.other.CreateUUID; import lucee.runtime.net.proxy.ProxyData; import lucee.runtime.net.proxy.ProxyDataImpl; import lucee.runtime.util.URLResolver; class ExecutionThread extends Thread { private Config config; //private Log log; private ScheduleTask task; private String charset; public ExecutionThread(Config config, ScheduleTask task, String charset) { this.config=config; this.task=task; this.charset=charset; } @Override public void run() { execute(config, task, charset); } public static void execute(Config config, ScheduleTask task, String charset) { Log log = getLog(config); 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(),true, charset, null, proxy, headers); } catch (Exception e) { LogUtil.log(log,Log.LEVEL_ERROR,logName,e); 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) { LogUtil.log(log,Log.LEVEL_ERROR,logName,e); hasError=true; } try { IOUtil.write(file,str,charset,false); } catch (IOException e) { LogUtil.log(log,Log.LEVEL_ERROR,logName,e); hasError=true; } } else { try { IOUtil.copy( rsp.getContentAsStream(), file, true ); } catch (IOException e) { LogUtil.log(log,Log.LEVEL_ERROR,logName,e); hasError=true; } } } if(!hasError)log.log(Log.LEVEL_INFO,logName,"executed"); } private static Log getLog(Config config) { return ((ConfigImpl)config).getLog("scheduler"); } 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"); } }