if(ct!=null && !StringUtil.isEmpty(ct.getCharset(),true)) cs=ct.getCharset();
if(doMultiPart) {
try {
Resource res = param.getFile();
parts.add(new FormBodyPart(
param.getName(),
new ResourceBody(res, mt, res.getName(), cs)
));
//parts.add(new ResourcePart(param.getName(),new ResourcePartSource(param.getFile()),getContentType(param),_charset));
}
catch (FileNotFoundException e) {
throw new ApplicationException("can't upload file, path is invalid",e.getMessage());
}
}
}
// XML
else if(type.equals("xml")) {
ContentType ct = HTTPUtil.toContentType(param.getMimeType(),null);
String mt="text/xml";
if(ct!=null && !StringUtil.isEmpty(ct.getMimeType(),true)) mt=ct.getMimeType();
String cs=charset;
if(ct!=null && !StringUtil.isEmpty(ct.getCharset(),true)) cs=ct.getCharset();
hasBody=true;
hasContentType=true;
req.addHeader("Content-type", mt+"; charset="+cs);
if(eem==null)throw new ApplicationException("type xml is only supported for type post and put");
HTTPEngine4Impl.setBody(eem, param.getValueAsString(),mt,cs);
}
// Body
else if(type.equals("body")) {
ContentType ct = HTTPUtil.toContentType(param.getMimeType(),null);
String mt=null;
if(ct!=null && !StringUtil.isEmpty(ct.getMimeType(),true)) mt=ct.getMimeType();
String cs=charset;
if(ct!=null && !StringUtil.isEmpty(ct.getCharset(),true)) cs=ct.getCharset();
hasBody=true;
if(eem==null)throw new ApplicationException("type body is only supported for type post and put");
HTTPEngine4Impl.setBody(eem, param.getValue(),mt,cs);
}
else {
throw new ApplicationException("invalid type ["+type+"]");
}
}
// post params
if(postParam!=null && postParam.size()>0)
post.setEntity(new org.apache.http.client.entity.UrlEncodedFormEntity(postParam,charset));
if(compression){
acceptEncoding.append("gzip");
}
else {
acceptEncoding.append("deflate;q=0");
req.setHeader("TE", "deflate;q=0");
}
req.setHeader("Accept-Encoding",acceptEncoding.toString());
// multipart
if(doMultiPart && eem!=null) {
hasContentType=true;
boolean doIt=true;
if(!this.multiPart && parts.size()==1){
ContentBody body = parts.get(0).getBody();
if(body instanceof StringBody){
StringBody sb=(StringBody)body;
try {
org.apache.http.entity.ContentType ct=org.apache.http.entity.ContentType.create(sb.getMimeType(),sb.getCharset());
String str = IOUtil.toString(sb.getReader());
StringEntity entity = new StringEntity(str,ct);
eem.setEntity(entity);
} catch (IOException e) {
throw Caster.toPageException(e);
}
doIt=false;
}
}
if(doIt) {
MultipartEntity mpe = new MultipartEntity(HttpMultipartMode.STRICT);
Iterator<FormBodyPart> it = parts.iterator();
while(it.hasNext()) {
FormBodyPart part = it.next();
mpe.addPart(part.getName(),part.getBody());
}
eem.setEntity(mpe);
}
//eem.setRequestEntity(new MultipartRequestEntityFlex(parts.toArray(new Part[parts.size()]), eem.getParams(),http.multiPartType));
}
if(hasBody && hasForm)
throw new ApplicationException("mixing httpparam type file/formfield and body/XML is not allowed");
if(!hasContentType) {
if(isBinary) {
if(hasBody) req.addHeader("Content-type", "application/octet-stream");
else req.addHeader("Content-type", "application/x-www-form-urlencoded; charset="+charset);
}
else {
if(hasBody)
req.addHeader("Content-type", "text/html; charset="+charset );
}
}
// set User Agent
if(!hasHeaderIgnoreCase(req,"User-Agent"))
req.setHeader("User-Agent",this.useragent);
// set timeout
if(this.timeout>0L)HTTPEngine4Impl.setTimeout(params, (int)this.timeout);
// set Username and Password
if(this.username!=null) {
if(this.password==null)this.password="";
if(AUTH_TYPE_NTLM==this.authType) {
if(StringUtil.isEmpty(this.workStation,true))
throw new ApplicationException("attribute workstation is required when authentication type is [NTLM]");
if(StringUtil.isEmpty(this.domain,true))
throw new ApplicationException("attribute domain is required when authentication type is [NTLM]");
HTTPEngine4Impl.setNTCredentials(client, this.username, this.password, this.workStation,this.domain);
}
else httpContext=HTTPEngine4Impl.setCredentials(client, httpHost, this.username, this.password,preauth);
}
// set Proxy
ProxyData proxy=null;
if(!StringUtil.isEmpty(this.proxyserver)) {
proxy=ProxyDataImpl.getInstance(this.proxyserver, this.proxyport, this.proxyuser, this.proxypassword) ;
}
if(pageContext.getConfig().isProxyEnableFor(host)) {
proxy=pageContext.getConfig().getProxyData();
}
HTTPEngine4Impl.setProxy(client, req, proxy);
}
try {
if(httpContext==null)httpContext = new BasicHttpContext();
/////////////////////////////////////////// EXECUTE /////////////////////////////////////////////////
Executor4 e = new Executor4(this,client,httpContext,req,redirect);
HTTPResponse4Impl rsp=null;
if(timeout<0){
try{
rsp = e.execute(httpContext);
}
catch(Throwable t){
if(!throwonerror){
setUnknownHost(cfhttp, t);
return;
}
throw toPageException(t);
}
}
else {
e.start();
try {
synchronized(this){//print.err(timeout);
this.wait(timeout);
}
} catch (InterruptedException ie) {
throw Caster.toPageException(ie);
}
if(e.t!=null){
if(!throwonerror){
setUnknownHost(cfhttp,e.t);
return;
}
throw toPageException(e.t);
}
rsp=e.response;
if(!e.done){
req.abort();
if(throwonerror)
throw new HTTPException("408 Request Time-out","a timeout occurred in tag http",408,"Time-out",rsp.getURL());
setRequestTimeout(cfhttp);
return;
//throw new ApplicationException("timeout");
}
}
/////////////////////////////////////////// EXECUTE /////////////////////////////////////////////////
Charset responseCharset=CharsetUtil.toCharset(rsp.getCharset());
// Write Response Scope
//String rawHeader=httpMethod.getStatusLine().toString();
String mimetype=null;
String contentEncoding=null;
// status code
cfhttp.set(STATUSCODE,((rsp.getStatusCode()+" "+rsp.getStatusText()).trim()));
cfhttp.set(STATUS_CODE,new Double(rsp.getStatusCode()));
cfhttp.set(STATUS_TEXT,(rsp.getStatusText()));
cfhttp.set(HTTP_VERSION,(rsp.getProtocolVersion()));
//responseHeader
railo.commons.net.http.Header[] headers = rsp.getAllHeaders();
StringBuffer raw=new StringBuffer(rsp.getStatusLine()+" ");
Struct responseHeader = new StructImpl();
Struct cookie;
Array setCookie = new ArrayImpl();
Query cookies=new QueryImpl(new String[]{"name","value","path","domain","expires","secure","httpOnly"},0,"cookies");
for(int i=0;i<headers.length;i++) {
railo.commons.net.http.Header header=headers[i];
//print.ln(header);
raw.append(header.toString()+" ");
if(header.getName().equalsIgnoreCase("Set-Cookie")) {
setCookie.append(header.getValue());
parseCookie(cookies,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);
cfhttp.set(KeyConstants._cookies,cookies);
responseHeader.set(STATUS_CODE,new Double(rsp.getStatusCode()));
responseHeader.set(EXPLANATION,(rsp.getStatusText()));
if(setCookie.size()>0)responseHeader.set(SET_COOKIE,setCookie);
// is text
boolean isText=
mimetype == null ||
mimetype == NO_MIMETYPE || HTTPUtil.isTextMimeType(mimetype);
// is multipart
boolean isMultipart= MultiPartResponseUtils.isMultipart(mimetype);
cfhttp.set(KeyConstants._text,Caster.toBoolean(isText));
// mimetype charset
//boolean responseProvideCharset=false;
if(!StringUtil.isEmpty(mimetype,true)){
if(isText) {
String[] types=HTTPUtil.splitMimeTypeAndCharset(mimetype,null);
if(types[0]!=null)cfhttp.set(KeyConstants._mimetype,types[0]);
if(types[1]!=null)cfhttp.set(CHARSET,types[1]);
}
else cfhttp.set(KeyConstants._mimetype,mimetype);
}
else cfhttp.set(KeyConstants._mimetype,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(req.getURI().getPath());// TODO was getName() ->http://hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/httpclient/URI.html#getName()
}
}
if(file!=null)pageContext.getConfig().getSecurityManager().checkFileLocation(file);