/*
  Copyright (c) 2013-2014 Arduino LLC. All right reserved.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "HttpClient.h"

HttpClient::HttpClient() :
  insecure(false) {
  // Empty
}

unsigned int HttpClient::get(String &url) {
  begin("curl");
  if (insecure) {
    addParameter("-k");
  }
  addHeader();
  addParameter(url);
  return run();
}

unsigned int HttpClient::get(const char *url) {
  begin("curl");
  if (insecure) {
    addParameter("-k");
  }
  addHeader();
  addParameter(url);
  return run();
}

void HttpClient::getAsynchronously(String &url) {
  begin("curl");
  if (insecure) {
    addParameter("-k");
  }
  addHeader();
  addParameter(url);
  runAsynchronously();
}

void HttpClient::getAsynchronously(const char *url) {
  begin("curl");
  if (insecure) {
    addParameter("-k");
  }
  addHeader();
  addParameter(url);
  runAsynchronously();
}

unsigned int HttpClient::post(String &url, String &data) {
    return post(url.c_str(), data.c_str());
}

unsigned int HttpClient::post(const char *url, const char *data) {
  begin("curl");
  if (insecure) {
    addParameter("-k");
  }
  addParameter("--request");
  addParameter("POST");
  addParameter("--data");
  addParameter(data);
  addHeader();
  addParameter(url);
  return run();
}

void HttpClient::postAsynchronously(String &url, String &data) {
  postAsynchronously(url.c_str(), data.c_str());
}

void HttpClient::postAsynchronously(const char *url, const char *data) {
  begin("curl");
  if (insecure) {
    addParameter("-k");
  }
  addParameter("--request");
  addParameter("POST");
  addParameter("--data");
  addParameter(data);
  addHeader();
  addParameter(url);
  runAsynchronously();
}

unsigned int HttpClient::patch(String &url, String &data) {
    return patch(url.c_str(), data.c_str());
}

unsigned int HttpClient::patch(const char *url, const char *data) {
  begin("curl");
  if (insecure) {
    addParameter("-k");
  }
  addParameter("--request");
  addParameter("PATCH");
  addParameter("--data");
  addParameter(data);
  addHeader();
  addParameter(url);
  return run();
}

void HttpClient::patchAsynchronously(String &url, String &data) {
  patchAsynchronously(url.c_str(), data.c_str());
}

void HttpClient::patchAsynchronously(const char *url, const char *data) {
  begin("curl");
  if (insecure) {
    addParameter("-k");
  }
  addParameter("--request");
  addParameter("PATCH");
  addParameter("--data");
  addParameter(data);
  addHeader();
  addParameter(url);
  runAsynchronously();
}

unsigned int HttpClient::put(String &url, String &data) {
    return put(url.c_str(), data.c_str());
}

unsigned int HttpClient::put(const char *url, const char *data) {
  begin("curl");
  if (insecure) {
    addParameter("-k");
  }
  addParameter("--request");
  addParameter("PUT");
  addParameter("--data");
  addParameter(data);
  addHeader();
  addParameter(url);
  return run();
}

void HttpClient::putAsynchronously(String &url, String &data) {
  putAsynchronously(url.c_str(), data.c_str());
}

void HttpClient::putAsynchronously(const char *url, const char *data) {
  begin("curl");
  if (insecure) {
    addParameter("-k");
  }
  addParameter("--request");
  addParameter("PUT");
  addParameter("--data");
  addParameter(data);
  addHeader();
  addParameter(url);
  runAsynchronously();
}

boolean HttpClient::ready() {
  return !running();
}

unsigned int HttpClient::getResult() {
  return exitValue();
}

void HttpClient::noCheckSSL() {
  insecure = true;
}

void HttpClient::checkSSL() {
  insecure = false;
}

void HttpClient::setHeader(String &header) {
  this->header = header;
}

void HttpClient::setHeader(const char * header) {
  this->header = String(header);
}

void HttpClient::addHeader() {
  if (header.length() > 0) {
    addParameter("--header");
    addParameter(header);
  }
}

