content: package de.mat3.badintent.hooking.proxy.hooks;
  
  
  import android.support.annotation.NonNull;
  import android.util.Log;
  
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.net.HttpURLConnection;
  import java.net.InetSocketAddress;
  import java.net.MalformedURLException;
  import java.net.Proxy;
  import java.net.URL;
  
  import de.mat3.badintent.app.BadIntentConstants;
  import de.robv.android.xposed.XSharedPreferences;
  
  public class ConnectionUtils {
  
      /**
       * Opens proxyfied connection based on BadIntent preferences.
       * @param url
       * @param sPrefs
       * @return opened HttpURLConnection
       * @throws IOException
       */
      public static HttpURLConnection getBadIntentHttpURLConnection(URL url, XSharedPreferences sPrefs) throws IOException {
          final HttpURLConnection conn;
          if (sPrefs.getBoolean(BadIntentConstants.USE_SYSTEM_PROXY, true)){
              conn = (HttpURLConnection) url.openConnection();
          } else {
              String host = sPrefs.getString(BadIntentConstants.PROXY_HOST, "localhost");
              int port = Integer.parseInt(sPrefs.getString(BadIntentConstants.PROXY_PORT, "8080"));
              Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port));
              conn = (HttpURLConnection) url.openConnection(proxy);
          }
          return conn;
      }
  
      /**
       * Get REST URL based on the BadIntent preferences.
       * @param resource needs to start with /
       * @param sPrefs
       * @param port
       * @return
       * @throws MalformedURLException
       */
      public static URL getBadIntentURL(String resource, XSharedPreferences sPrefs, int port) throws MalformedURLException {
          String ip = sPrefs.getString(BadIntentConstants.TARGET_IP, "localhost");
          return new URL("http://" + ip + ":" + port + resource);
      }
  
      public static Thread readResponseAndCloseConnection(final HttpURLConnection conn) {
          return new Thread(new Runnable() {
              @Override
              public void run() {
                  BufferedReader reader = null;
                  try {
                      reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                      StringBuffer buffer = new StringBuffer();
                      String line = "";
                      while ((line = reader.readLine()) != null) {
                          buffer.append(line);
                      }
                  } catch (IOException e) {
                      Log.e(TransactionHooks.TAG, "could not receive HTTP data!");
                      Log.e(TransactionHooks.TAG, " " + e.getMessage());
                  } finally {
                      try {
                          if (reader != null) {
                              reader.close();
                          }
                      } catch (IOException e) {
                          //best effort
                      }
                  }
              }
          });
      }
  }
  