content: /*
   * Copyright 2014 Sony Corporation
   */
  
  package com.almalence.sony.cameraremote.utils;
  
  import android.util.Log;
  
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.io.OutputStream;
  import java.io.OutputStreamWriter;
  import java.net.HttpURLConnection;
  import java.net.MalformedURLException;
  import java.net.SocketTimeoutException;
  import java.net.URL;
  
  /**
   * Simple HTTP Client for sample application.
   */
  public final class SimpleHttpClient {
  
      private static final String TAG = SimpleHttpClient.class.getSimpleName();
  
      private static final int DEFAULT_CONNECTION_TIMEOUT = 10000; // [msec]
  
      private static final int DEFAULT_READ_TIMEOUT = 10000; // [msec]
  
      private SimpleHttpClient() {
  
      }
  
      /**
       * Send HTTP GET request to the indicated url. Then returns response as
       * string.
       *
       * @param url request target
       * @return response as string
       * @throws IOException all errors and exception are wrapped by this
       *             Exception.
       */
      public static String httpGet(String url) throws IOException {
          return httpGet(url, DEFAULT_READ_TIMEOUT);
      }
  
      /**
       * Send HTTP GET request to the indicated url. Then returns response as
       * string.
       *
       * @param url request target
       * @param timeout Request timeout
       * @return response as string
       * @throws IOException all errors and exception are wrapped by this
       *             Exception.
       */
      public static String httpGet(String url, int timeout) throws IOException {
          HttpURLConnection httpConn = null;
          InputStream inputStream = null;
  
          // Open connection and input stream
          try {
              final URL urlObj = new URL(url);
              httpConn = (HttpURLConnection) urlObj.openConnection();
              httpConn.setRequestMethod("GET");
              httpConn.setConnectTimeout(DEFAULT_CONNECTION_TIMEOUT);
              httpConn.setReadTimeout(timeout);
              httpConn.connect();
  
              int responseCode = httpConn.getResponseCode();
              if (responseCode == HttpURLConnection.HTTP_OK) {
                  inputStream = httpConn.getInputStream();
              }
              if (inputStream == null) {
                  Log.w(TAG, "httpGet: Response Code Error: " + responseCode + ": " + url);
                  throw new IOException("Response Error:" + responseCode);
              }
          } catch (final SocketTimeoutException e) {
              Log.w(TAG, "httpGet: Timeout: " + url);
              throw new IOException();
          } catch (final MalformedURLException e) {
              Log.w(TAG, "httpGet: MalformedUrlException: " + url);
              throw new IOException();
          } catch (final IOException e) {
              Log.w(TAG, "httpGet: " + e.getMessage());
              if (httpConn != null) {
                  httpConn.disconnect();
              }
              throw e;
          }
  
          // Read stream as String
          BufferedReader reader = null;
          try {
              StringBuilder responseBuf = new StringBuilder();
              reader = new BufferedReader(new InputStreamReader(inputStream));
              int c;
              while ((c = reader.read()) != -1) {
                  responseBuf.append((char) c);
              }
              return responseBuf.toString();
          } catch (IOException e) {
              Log.w(TAG, "httpGet: read error: " + e.getMessage());
              throw e;
          } finally {
              try {
                  if (reader != null) {
                      reader.close();
                  }
              } catch (IOException e) {
                  Log.w(TAG, "IOException while closing BufferedReader");
              }
              try {
                  if (inputStream != null) {
                      inputStream.close();
                  }
              } catch (IOException e) {
                  Log.w(TAG, "IOException while closing InputStream");
              }
          }
      }
  
      /**
       * Send HTTP POST request to the indicated url. Then returns response as
       * string.
       *
       * @param url request target
       * @param postData POST body data as string (ex. JSON)
       * @return response as string
       * @throws IOException all errors and exception are wrapped by this
       *             Exception.
       */
      public static String httpPost(String url, String postData) throws IOException {
          return httpPost(url, postData, DEFAULT_READ_TIMEOUT);
      }
  
      /**
       * Send HTTP POST request to the indicated url. Then returns response as
       * string.
       *
       * @param url request target
       * @param postData POST body data as string (ex. JSON)
       * @param timeout Request timeout
       * @return response as string
       * @throws IOException all errors and exception are wrapped by this
       *             Exception.
       */
      public static String httpPost(String url, String postData, int timeout) throws IOException {
          HttpURLConnection httpConn = null;
          OutputStream outputStream = null;
          OutputStreamWriter writer = null;
          InputStream inputStream = null;
  
          // Open connection and input stream
          try {
              final URL urlObj = new URL(url);
              httpConn = (HttpURLConnection) urlObj.openConnection();
              httpConn.setRequestMethod("POST");
              httpConn.setConnectTimeout(DEFAULT_CONNECTION_TIMEOUT);
              httpConn.setReadTimeout(timeout);
              httpConn.setDoInput(true);
              httpConn.setDoOutput(true);
  
              outputStream = httpConn.getOutputStream();
              writer = new OutputStreamWriter(outputStream, "UTF-8");
              writer.write(postData);
              writer.flush();
              writer.close();
              writer = null;
              outputStream.close();
              outputStream = null;
  
              int responseCode = httpConn.getResponseCode();
              if (responseCode == HttpURLConnection.HTTP_OK) {
                  inputStream = httpConn.getInputStream();
              }
              if (inputStream == null) {
                  Log.w(TAG, "httpPost: Response Code Error: " + responseCode + ": " + url);
                  throw new IOException("Response Error:" + responseCode);
              }
          } catch (final SocketTimeoutException e) {
              Log.w(TAG, "httpPost: Timeout: " + url);
              throw new IOException();
          } catch (final MalformedURLException e) {
              Log.w(TAG, "httpPost: MalformedUrlException: " + url);
              throw new IOException();
          } catch (final IOException e) {
              Log.w(TAG, "httpPost: IOException: " + e.getMessage());
              if (httpConn != null) {
                  httpConn.disconnect();
              }
              throw e;
          } finally {
              try {
                  if (writer != null) {
                      writer.close();
                  }
              } catch (IOException e) {
                  Log.w(TAG, "IOException while closing OutputStreamWriter");
              }
              try {
                  if (outputStream != null) {
                      outputStream.close();
                  }
              } catch (IOException e) {
                  Log.w(TAG, "IOException while closing OutputStream");
              }
          }
  
          // Read stream as String
          BufferedReader reader = null;
          try {
              StringBuilder responseBuf = new StringBuilder();
              reader = new BufferedReader(new InputStreamReader(inputStream));
  
              int c;
              while ((c = reader.read()) != -1) {
                  responseBuf.append((char) c);
              }
              return responseBuf.toString();
          } catch (IOException e) {
              Log.w(TAG, "httpPost: read error: " + e.getMessage());
              throw e;
          } finally {
              try {
                  if (reader != null) {
                      reader.close();
                  }
              } catch (IOException e) {
                  Log.w(TAG, "IOException while closing BufferedReader");
              }
          }
      }
  }
  