/*
* Copyright 2015 Themistoklis Mavridis <themis.mavridis@issel.ee.auth.gr>.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.thesmartweb.swebrank;
import java.net.*;
import java.io.*;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.codec.binary.Base64;
import javax.net.ssl.HttpsURLConnection;
/**
* Class to connect to various APIs, to establish http and https connections
* @author Themistoklis Mavridis
*/
public class APIconn {
/**
* variable that is used for http connections
*/
public HttpURLConnection httpCon;
/**
* variable used for https connections
*/
public HttpsURLConnection httpsCon;
/**
* Connects to an ssl url and GETs the response
* @param link_ur the link to connect to
* @return the response in a String
*/
public String sslconnect(URL link_ur) {
try {
httpsCon=(HttpsURLConnection) link_ur.openConnection();
System.out.println(httpsCon.getResponseCode());
if (httpsCon.getResponseCode() != 200) {
String line;
line = "fail";
return line;
} else {
String line;
try (BufferedReader rd = new BufferedReader(new InputStreamReader(httpsCon.getInputStream()))) {
StringBuilder sb = new StringBuilder();
while ((line = rd.readLine()) != null) {
sb.append(line);
}
line = sb.toString();
}
return line;
}
} catch (IOException ex) {
Logger.getLogger(APIconn.class.getName()).log(Level.SEVERE, null, ex);
String line="fail";
return line;
}
}
/**
* Connects to an http url and GETs the response
* @param link_ur the link to connect to
* @return the response in a string
*/
public String connect(URL link_ur) {
try {
httpCon = (HttpURLConnection) link_ur.openConnection();
if (httpCon.getResponseCode() != 200) {
String line;
line = "fail";
return line;
} else {
String line;
try (BufferedReader rd = new BufferedReader(new InputStreamReader(httpCon.getInputStream()))) {
StringBuilder sb = new StringBuilder();
while ((line = rd.readLine()) != null) {
sb.append(line);
}
line = sb.toString();
}
return line;
}
} catch (IOException ex) {
Logger.getLogger(APIconn.class.getName()).log(Level.SEVERE, null, ex);
String line="fail";
return line;
}
}
/**
* Checks if a connection to a url (http or https) gets response code 200
* @param link the link to connect to
* @return a string that contains "ok-conn" if we have response code 200, "fail-conn" if sth else
*/
public String check_conn(String link){
try {
link=link.trim();
String line="fail-conn";
if(link.startsWith("http")){
URL link_ur=new URL(link);
line="DNS-error";
if(link.startsWith("http:")){
try{
httpCon = (HttpURLConnection) link_ur.openConnection();
httpCon.setDefaultUseCaches(false);
httpCon.setReadTimeout(20000);
httpCon.setDoInput(true);
httpCon.connect();
line="fail-conn";
int responseCode=httpCon.getResponseCode();
if (responseCode==200){line="ok-conn";}
}
catch (Exception e){
System.out.println(link);
System.gc();
System.gc();
System.gc();
httpCon=null;
line="fail-conn";
return line;
}
}
else if (link.startsWith("https")){
try{
httpsCon = (HttpsURLConnection) link_ur.openConnection();
httpsCon.setDefaultUseCaches(false);
httpsCon.setReadTimeout(20000);
httpsCon.setDoInput(true);
httpsCon.connect();
//httpCon.connect();
line="fail-conn";
int responseCode=httpsCon.getResponseCode();
if (responseCode==200){line="ok-conn";}
}
catch (Exception e){
System.out.println(link);
System.gc();
System.gc();
System.gc();
httpsCon=null;
line="fail-conn";
return line;
}
}
}
return line;
} catch (MalformedURLException ex) {
Logger.getLogger(APIconn.class.getName()).log(Level.SEVERE, null, ex);
return "fail-conn";
} catch (IOException ex) {
Logger.getLogger(APIconn.class.getName()).log(Level.SEVERE, null, ex);
return "fail-conn";
}
}
/**
* It is used to connect to Azure Marketplace for Bing's search API
* @param link_ur the url to connect to
* @param config_path the path with the configuration file for bing (api keys)
* @return the response of the Search API of Bing
*/
public String azureconnect(URL link_ur, String config_path){
String string_link_ur=link_ur.toString();
String line="fail";
if(string_link_ur.substring(23,28).equalsIgnoreCase("azure")){
HttpsURLConnection[] httpsConn=new HttpsURLConnection[32];
String[] accKeys = GetBingKeys(config_path);//contains the various bing search api keys
int i=-1;
int respp=0;
do{//we are going to try all the keys
try {
i++;
httpsConn[i]=(HttpsURLConnection) link_ur.openConnection();
byte[] accountKeyBytes = Base64.encodeBase64((accKeys[i]+":"+accKeys[i]).getBytes());
String accountKeyEnc = new String(accountKeyBytes);
httpsConn[i].setRequestProperty("Authorization","Basic "+accountKeyEnc);
respp=httpsConn[i].getResponseCode();
} catch (IOException ex) {
Logger.getLogger(APIconn.class.getName()).log(Level.SEVERE, null, ex);
return line;
}
}
while(respp!=200&&i<accKeys.length-1);
int j=i;
if(j>0){
for(int k=0;k<j;k++){
httpsConn[k].disconnect();//we close all the other connections
}
}
if (respp != 200){//we are going to capture some significant responses by Bing Search API in order to know our status
if(respp!=503){
try {
String responseMessage = httpsConn[i].getResponseMessage();
if(responseMessage.startsWith("Insufficient")){
line="insufficient";
}
if(responseMessage.contains("provided")){
line="provided";
}
} catch (IOException ex) {
Logger.getLogger(APIconn.class.getName()).log(Level.SEVERE, null, ex);
return line;
}
}
return line;
}
else {//if we receive code 200, we are ok to read the response
BufferedReader rd = null;
try {
rd = new BufferedReader(new InputStreamReader(httpsConn[i].getInputStream()));
StringBuilder sb = new StringBuilder();
line="";
while ((line = rd.readLine()) != null) {
sb.append(line);
}
line = sb.toString();
rd.close();
return line;
} catch (IOException ex) {
Logger.getLogger(APIconn.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
if(rd!=null){
rd.close();
}
} catch (IOException ex) {
Logger.getLogger(APIconn.class.getName()).log(Level.SEVERE, null, ex);
return line;
}
}
}
}
return line;
}
/**
* It is used to get all the keys for Bing
* @param config_path the path with the configuration file for bing (api keys)
* @return an array with the keys of bing
*/
public String[] GetBingKeys(String config_path){
ReadInput ri = new ReadInput();
List<String> bingkeysList = ri.GetKeyFile(config_path, "bingkeys");
String[] apikeys = bingkeysList.toArray(new String[bingkeysList.size()]);
return apikeys;
}
}