package com.zaranux.os.server.util;
import java.io.InputStream;
import java.net.Socket;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicHttpEntityEnclosingRequest;
import org.apache.http.HttpResponse;
import org.apache.http.HttpHost;
import org.apache.http.protocol.HttpProcessor;
import org.apache.http.protocol.HttpRequestExecutor;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.RequestConnControl;
import org.apache.http.protocol.RequestContent;
import org.apache.http.protocol.RequestExpectContinue;
import org.apache.http.protocol.RequestTargetHost;
import org.apache.http.protocol.RequestUserAgent;
import org.apache.http.ConnectionReuseStrategy;
import org.apache.http.protocol.ImmutableHttpProcessor;
import org.apache.http.HttpEntity;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.HttpVersion;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.impl.DefaultHttpClientConnection;
import org.apache.http.impl.DefaultConnectionReuseStrategy;
import org.apache.http.params.SyncBasicHttpParams;
import org.apache.http.HttpRequestInterceptor;
import java.net.URLEncoder;
import com.zaranux.os.server.core.Identity;
public class ZHTTP {
//private static String hostname ;
//private static int port;
// s = -1 -> all
public static InputStream syuncHTTPpost(String host, int port,String zSystemcall, String zParameterList, String path, InputStream is, long s , Identity requester) throws Exception
{
// try
// {
// path = "/zaranux/" +URLEncoder.encode( path.substring(1), "UTF-8") + "?" + "ZOperation="+ zOperation + "&SessionToken=" + URLEncoder.encode(sessionToken, "UTF-8") + "&ZParameterList="+ URLEncoder.encode(zParameterList, "UTF-8");
if(path.startsWith("/")) path = path.substring(1); // e.g. @zaranux/a/b/c
// path = path + "?" + "systemcall="+ zSystemcall + "&identity=" + URLEncoder.encode(requester.getID(), "UTF-8") + "&identityAssertion=" + URLEncoder.encode(requester.getIDAssertion(), "UTF-8") + "¶meterList="+ URLEncoder.encode(zParameterList, "UTF-8");
path = path + "?" + getParams( zSystemcall,requester.getID(),requester.getIDAssertion(), zParameterList, host);
// path = "/zaranux";
path = "/" + path;
HttpEntity entity = new InputStreamEntity(is,s);
String Content_Type = "application/octet-stream";
return syncHTTPpost(host,port,path, entity, Content_Type);
// }catch(Exception e)
// {
// }
// return null;
}
private static String getParams(String systemcall, String identity, String idAssertion, String paramList, String host)throws Exception
{
String params = "systemcall="+ systemcall + "&identity=" + URLEncoder.encode(identity, "UTF-8") + "&identityAssertion=" + URLEncoder.encode(idAssertion, "UTF-8") + "¶meterList="+ URLEncoder.encode(paramList, "UTF-8");
//if(host.startsWith("localhost"))
// params += "&gwt.codesvr=localhost:9997";
return params;
}
public static InputStream syuncHTTPpost(String host, int port,String zSystemcall, String zParameterList, String path , Identity requester) throws Exception
{
InputStream is = null;
if(path.startsWith("/")) path = path.substring(1); // e.g. @zaranux/a/b/c
path = "/" + path;
String Content_Type = "application/x-www-form-urlencoded";
//try{
//HttpEntity entity = new StringEntity("systemcall="+ zSystemcall + "&identity=" + URLEncoder.encode(requester.getID(), "UTF-8") + "&IdentityAssertion=" + URLEncoder.encode(requester.getIDAssertion(), "UTF-8") + "¶meterList="+ zParameterList, "UTF-8");
HttpEntity entity = new StringEntity(getParams( zSystemcall,requester.getID(),requester.getIDAssertion(), zParameterList, host) );
is = syncHTTPpost(host,port,path, entity, Content_Type);
//}
//catch(Exception e)
//{
//}
return is;
}
public static InputStream syncHTTPpost(String host, int port,String path, HttpEntity entity, String Content_Type) throws Exception
{
path = path.replaceAll(" ", "%20");
System.out.println("replaced spaces with %20>" + path);
InputStream is = null;
HttpParams params = new SyncBasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
HttpProtocolParams.setUseExpectContinue(params, true);
HttpProcessor httpproc = new ImmutableHttpProcessor(new HttpRequestInterceptor[] {
// Required protocol interceptors
new RequestContent(),
new RequestTargetHost(),
// Recommended protocol interceptors
new RequestConnControl(),
new RequestUserAgent(),
new RequestExpectContinue()});
HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
HttpContext context = new BasicHttpContext(null);
HttpHost h = new HttpHost(host, port);
DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy();
context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, h);
try {
if (!conn.isOpen()) {
Socket socket = new Socket(h.getHostName(), h.getPort());
conn.bind(socket, params);
}
BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST",
path);
request.setEntity(entity);
System.out.println(">> Request URI: " + request.getRequestLine().getUri());
request.setHeader("Content-Type", Content_Type);
request.setParams(params);
httpexecutor.preProcess(request, httpproc, context);
HttpResponse response = httpexecutor.execute(request, conn, context);
response.setParams(params);
httpexecutor.postProcess(response, httpproc, context);
System.out.println("<< Response: " + response.getStatusLine());
//System.out.println(EntityUtils.toString(response.getEntity()));
//System.out.println("==============");
HttpEntity he = response.getEntity();
System.out.println("getContentLength " + he.getContentLength());
is = he.getContent();
//byte[] b = new byte[1024];
//System.out.println("Read : " + is.read(b));
//if (!connStrategy.keepAlive(response, context)) { // investigate! remove to see if resolves trunkation issue
// conn.close();
// } else {
System.out.println("Connection kept alive...");
// }
}
catch(Exception e)
{
System.out.println(e);
throw e;
}
finally {
try{
//conn.close();
}catch(Exception e)
{
}
}
return is;
}
/*
public static String doSyncPost(String zOperation, String path, String parameterList,long size, InputStream is)
{
HttpParams params = new SyncBasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
HttpProtocolParams.setUseExpectContinue(params, true);
HttpProcessor httpproc = new ImmutableHttpProcessor(new HttpRequestInterceptor[] {
// Required protocol interceptors
new RequestContent(),
new RequestTargetHost(),
// Recommended protocol interceptors
new RequestConnControl(),
new RequestUserAgent(),
new RequestExpectContinue()});
HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
HttpContext context = new BasicHttpContext(null);
HttpHost host = new HttpHost(hostname, port);
DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy();
context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host);
try {
HttpEntity[] requestBodies = {
new StringEntity(
"This is the first test request", "UTF-8")
};
for (int i = 0; i < requestBodies.length; i++) {
if (!conn.isOpen()) {
Socket socket = new Socket(host.getHostName(), host.getPort());
conn.bind(socket, params);
}
BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST",
path);
request.setEntity(requestBodies[i]);
System.out.println(">> Request URI: " + request.getRequestLine().getUri());
request.setParams(params);
httpexecutor.preProcess(request, httpproc, context);
HttpResponse response = httpexecutor.execute(request, conn, context);
response.setParams(params);
httpexecutor.postProcess(response, httpproc, context);
System.out.println("<< Response: " + response.getStatusLine());
System.out.println(EntityUtils.toString(response.getEntity()));
System.out.println("==============");
if (!connStrategy.keepAlive(response, context)) {
conn.close();
} else {
System.out.println("Connection kept alive...");
}
}
}
catch(Exception e)
{
System.out.println(e);
}
finally {
try{
conn.close();
}catch(Exception e)
{
}
}
return "return";
}
public static String doSyncPost3(String zOperation, String path, String parameterList,long size, InputStream is)
{
System.out.println("doSyncPost ");
String output = null;
DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
try
{
BasicHttpProcessor httpproc = new BasicHttpProcessor();
httpproc.addInterceptor(new RequestContent());
httpproc.addInterceptor(new RequestTargetHost());
httpproc.addInterceptor(new RequestConnControl());
httpproc.addInterceptor(new RequestUserAgent());
httpproc.addInterceptor(new RequestExpectContinue());
HttpContext context = new BasicHttpContext(null);
// Socket socket = new Socket(hostname,port);
HttpHost host = new HttpHost(hostname, port);
ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy();
context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host);
// Initialize socket
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
HttpProtocolParams.setUseExpectContinue(params, true);
// conn.bind(socket, params);
if (!conn.isOpen()) {
Socket socket = new Socket(host.getHostName(), host.getPort());
conn.bind(socket, params);
}
BasicHttpEntityEnclosingRequest request = null;
String rp = "ZOperation="+ zOperation+"&ZParameterList=" + parameterList;
if(is == null)
{
path += "?" + rp;
request = new BasicHttpEntityEnclosingRequest("POST",path,HttpVersion.HTTP_1_1);
//request.setHeader("Content-Type", "application/x-www-form-urlencoded");
request.setHeader("Content-Type", "application/octet-stream");
request.setEntity(new StringEntity("help", "UTF-8"));
}else
{
path += "?" + rp;
request = new BasicHttpEntityEnclosingRequest("POST",path,HttpVersion.HTTP_1_1);
// request.setEntity(new InputStreamEntity(is,size));
request.setEntity(new StringEntity("help", "UTF-8"));
request.setHeader("Content-Type", "application/octet-stream");
}
request.setParams(params);
request.removeHeaders("Content-Length");
httpexecutor.preProcess(request, httpproc, context);
//System.out.println(EntityUtils.toString(request.getEntity()));
System.out.println("sending request ... ");
httpexecutor.preProcess(request, httpproc, context);
HttpResponse response = httpexecutor.execute(request, conn, context);
System.out.println("response received. ");
response.setParams(params);
httpexecutor.postProcess(response, httpproc, context);
System.out.println(response.getStatusLine());
HttpEntity entity = response.getEntity();
if (entity != null) {
// Do something useful with the entity and, when done, call
// consumeContent() to make sure the connection can be re-used
output = (EntityUtils.toString(entity));
System.out.println(" entity response : " + output);
entity.consumeContent();
}
}catch(Exception e)
{
//System.out.println("exception " + e.printStackTrace());
e.printStackTrace();
}
finally{
try
{
conn.close();
}catch(Exception e)
{
}
}
return output;
}
public static String doSyncPost2(String zOperation, String path, String parameterList,long size, InputStream is)
{
System.out.println("doSyncPost");
String output = null;
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
HttpProtocolParams.setUseExpectContinue(params, true);
HttpProcessor httpproc = new BasicHttpProcessor();
HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
HttpContext context = new BasicHttpContext(null);
HttpHost host = new HttpHost(hostname, 7070);
DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy();
context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host);
try
{
conn.isOpen();
//BasicHttpEntityEnclosingRequest request = null;
BasicHttpRequest request = null;
String rp = "ZOperation="+ zOperation + "&ZParameterList=" + parameterList;
if(!conn.isOpen())
{
Socket socket = new Socket(hostname,port);
conn.bind(socket, params);
}
if(is != null)
{
request = new BasicHttpRequest("POST",path);//new BasicHttpEntityEnclosingRequest("POST",path); //,HttpVersion.HTTP_1_1);
//request.setHeader("Content-Type", "application/x-www-form-urlencoded");
//request.setEntity(new StringEntity("hello!", "UTF-8"));
System.out.println("path " + path);
}else
{
path += "?" + rp;
request = new BasicHttpEntityEnclosingRequest("POST",path,HttpVersion.HTTP_1_1);
//request.setEntity(new InputStreamEntity(is,size));
request.setHeader("Content-Type", "application/octet-stream");
System.out.println("path " + path);
}
System.out.println(">> Request Line: " + request.getRequestLine());
// System.out.println(">> Entity Line: " + EntityUtils.toString(request.getEntity()));
request.setParams(params);
System.out.println("sending post");
httpexecutor.preProcess(request, httpproc, context);
HttpResponse response = httpexecutor.execute(request, conn, context);
response.setParams(params);
httpexecutor.postProcess(response, httpproc, context);
System.out.println("entity received!" + response.getStatusLine());
HttpEntity entity = response.getEntity();
output = (EntityUtils.toString(entity));
System.out.println("output = "+ output);
if (!connStrategy.keepAlive(response, context)) {
conn.close();
} else {
System.out.println("Connection kept alive...");
}
}
catch(Throwable e)
{
System.out.println(e);
}
finally{
try
{
conn.close();
}catch(Exception e)
{
System.out.println(e);
}
System.out.println("finally");
}
return output;
}
*/
/*
public static void doPost(String zOperation, String path, String parameterList, InputStream is,OutputStream os,final AsyncCallback<Boolean> callback)
{
DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
try
{
Socket socket = new Socket(hostname,port);
HttpParams params = new BasicHttpParams();
conn.bind(socket, params);
BasicHttpEntityEnclosingRequest request = null;
String rp = "ZOperation="+ zOperation + "&ZParameterList=" + parameterList;
if(is != null)
{
request = new BasicHttpEntityEnclosingRequest("POST",path,HttpVersion.HTTP_1_1);
request.setHeader("Content-Type", "application/x-www-form-urlencoded");
request.setEntity(new StringEntity(rp, "UTF-8"));
}else
{
path += "?" + rp;
request = new BasicHttpEntityEnclosingRequest("POST",path,HttpVersion.HTTP_1_1);
request.setEntity(new InputStreamEntity(is,-1));
request.setHeader("Content-Type", "application/octet-stream");
}
conn.sendRequestHeader(request);
conn.sendRequestEntity(request);
HttpResponse response = conn.receiveResponseHeader();
conn.receiveResponseEntity(response);
HttpEntity entity = response.getEntity();
if(entity != null){
if(os != null)
{
entity.writeTo(os);
}
entity.consumeContent();
}
callback.onSuccess(true);
conn.close();
}
catch(Throwable e)
{
callback.onFailure(e);
}
finally{
try
{
conn.shutdown();
}catch(Exception e)
{
}
}
}*/
}