/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.jtotus.network;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CookieStore;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
/**
*
* @author work
*
*
*
*
* http://www.java-tips.org/other-api-tips/httpclient/how-to-use-http-cookies.html
*
*/
public class NordnetConnector implements BrokerConnector {
private DefaultHttpClient httpclient = null;
private void dumpInfo(BasicHttpParams params) {
System.out.printf("HttpClient parameters:\n");
System.out.println(params.getParameter(
CoreProtocolPNames.PROTOCOL_VERSION));
System.out.println(params.getParameter(
CoreProtocolPNames.HTTP_CONTENT_CHARSET));
System.out.println(params.getParameter(
CoreProtocolPNames.USE_EXPECT_CONTINUE));
System.out.println(params.getParameter(
CoreProtocolPNames.USER_AGENT));
System.out.println(params.getParameter(
CoreConnectionPNames.SO_TIMEOUT));
}
private DefaultHttpClient getClient() {
if (httpclient != null) {
return httpclient;
}
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(
new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));
ClientConnectionManager cm = new ThreadSafeClientConnManager(schemeRegistry);
BasicHttpParams params = new BasicHttpParams();
params.setBooleanParameter(HttpConnectionParams.STALE_CONNECTION_CHECK, true);
params.setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, true);
params.setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
// params.setIntParameter(CoreProtocolPNames.WAIT_FOR_CONTINUE, 5000000);
// params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 5000000);
// params.setIntParameter(HttpConnectionParams.SO_TIMEOUT, 9900000);
// params.setIntParameter(CoreConnectionPNames.SO_LINGER, 99000);
dumpInfo(params);
httpclient = new DefaultHttpClient(cm, params);
// httpclient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);
Properties prop = System.getProperties();
if (prop.getProperty("https.proxyHost") != null
&& prop.getProperty("https.proxyPort") != null) {
((DefaultHttpClient)httpclient).getCredentialsProvider().setCredentials(
new AuthScope(prop.getProperty("https.proxyHost"),
Integer.parseInt(prop.getProperty("https.proxyPort"))),
new UsernamePasswordCredentials(prop.getProperty("https.proxyUser"),
prop.getProperty("https.proxyPassword")));
HttpHost proxy = new HttpHost(prop.getProperty("https.proxyHost"),
Integer.parseInt(prop.getProperty("https.proxyPort")));
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
}
return httpclient;
}
private void dumpHeaders(HttpGet url) {
CookieStore cookieStore = null;
Header [] headers = url.getAllHeaders();
for (int i = 0;i < headers.length; i++ ) {
Header tmp = headers[i];
System.out.printf("Headers Name: %s Value:%s\n", tmp.getName(), tmp.getValue());
}
if (httpclient != null)
cookieStore = httpclient.getCookieStore();
if (cookieStore != null) {
List<Cookie> listOfCookies = cookieStore.getCookies();
for (Cookie me : listOfCookies) {
System.out.printf("Cookie dump: %s version:%d!\n", me.getName(), me.getVersion());
if (me.getName().equalsIgnoreCase("Cookie2")) {
System.out.printf("Removing cookie!\n");
listOfCookies.remove(me);
}
}
}
}
public HttpGet getMethod(String url) {
HttpGet httpget = new HttpGet(url);
// httpget.addHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");
// httpget.setHeader("Content-Type","text/html;charset=UTF-8");
// httpget.setHeader("Accept-Charset", "utf-8;q=0.7,*;q=0.7");
// httpget.setHeader("Keep-Alive", "9000");
//
// dumpHeaders(httpget);
return httpget;
}
public String getPage(String url) {
return this.fetchPage(this.getMethod(url));
}
public String getPage(String pattern, Object... arg) {
//System.out.printf("Fetching-->:%s\n", String.format(pattern, arg));
return this.fetchPage(this.getMethod(String.format(pattern, arg)));
}
public String fetchPage(HttpUriRequest url) {
System.out.printf("fetching: %s:%s?%s [%s:%s:%s] %s\n",
url.getURI().getHost(),
url.getURI().getRawPath(),
url.getURI().getQuery(),
url.getURI().getRawFragment(),
url.getURI().getRawSchemeSpecificPart(),
url.getURI().getRawUserInfo(), url.getParams().toString());
HttpResponse response = null;
try {
response = this.getClient().execute(url);
HttpEntity entity = response.getEntity();
//Fixme: encoding!!!
return EntityUtils.toString(entity, "UTF-8");
// StringBuilder respond = new StringBuilder();
// InputStream instream = entity.getContent();
// BufferedReader reader = new BufferedReader(new InputStreamReader(instream, Charset.forName("UTF-8")));
//
// // do something useful with the response
// System.out.printf("done:%s : %s content type:%s\n", url, response.getStatusLine().toString(), entity.getContentType());
// String line = null;
//
//
// while ((line = reader.readLine()) != null) {
// respond.append(line);
// //System.out.printf("got:%s\n", line);
// }
//
// return respond.toString();
} catch (IOException ex) {
//Logger.getLogger(NordnetConnector.class.getName()).log(Level.SEVERE, null, ex);
System.err.printf("Connection failure ... : %s \n", ex.getMessage());
ex.printStackTrace();
return null;
}
}
void dumpObjects(Collection<Object> collection) {
Iterator<Object> iter = collection.iterator();
while (iter.hasNext()) {
Object obj = iter.next();
System.out.printf("Object: %s \n", obj.toString());
}
}
public String authenticate(String url,
String loginToken,
String login,
String passToken,
String encryptedPassword) {
try {
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.04 (lucid) Firefox/3.6.15");
// httpPost.addHeader("Referer", "");
httpPost.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
httpPost.addHeader("Accept-Language", "en-us,en;q=0.5");
httpPost.addHeader("Keep-Alive", "115");
BasicClientCookie cookie1 = new BasicClientCookie("s_cc","true");
BasicClientCookie cookie2 = new BasicClientCookie("s_sq","%5B%5BB%5D%5D");
cookie1.setDomain("www.nordnet.fi");
cookie2.setDomain("www.nordnet.fi");
httpclient.getCookieStore().addCookie(cookie1);
httpclient.getCookieStore().addCookie(cookie2);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("checksum", ""));
nameValuePairs.add(new BasicNameValuePair("referer", "" /* URLEncoder.encode("/mux/login/startFI.html", "utf-8")*/));
nameValuePairs.add(new BasicNameValuePair("encryption", "1"));
nameValuePairs.add(new BasicNameValuePair(loginToken, login));
nameValuePairs.add(new BasicNameValuePair(passToken, encryptedPassword /*URLEncoder.encode(encryptedPassword, "utf-8")*/));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));
// System.out.printf("Login:(%s)%s (%s)Pass:%s\n", loginToken, login, passToken, URLEncoder.encode(encryptedPassword, "utf-8"));
return this.fetchPage(httpPost);
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(NordnetConnector.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
public void close() {
if (httpclient != null) {
httpclient.getConnectionManager().closeExpiredConnections();
}
}
}