/* * 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; } }