#include <Headers.h>

namespace HTTP {

Headers::Headers() :
   type_(REQUEST),
   curlHeaders_(NULL)
{
  
}


Headers::Headers(Headers::Type type) :
   type_(type),
   curlHeaders_(NULL)
{

}


Headers::~Headers()
{
   clear();
}


bool
Headers::isSet(const std::string & name)
{
   HeaderMap::iterator iter = headers_.find(name);
   return iter != headers_.end();
}


std::string
Headers::get(const std::string & name)
{
   HeaderMap::iterator iter = headers_.find(name);

   if (iter != headers_.end()) {
      return iter->second;
   }
   else {
      return "";
   }
}


std::string
Headers::operator[](const std::string & name)
{
   return get(name);
}


void
Headers::set(const std::string & name, const std::string & value)
{
   headers_.insert( StringPair(name, value) );

   std::string nameValue = name;
   nameValue += ": ";
   nameValue += value;

   if (type_ == REQUEST) {
      curlHeaders_ = curl_slist_append(curlHeaders_, nameValue.c_str());
   }
}


void
Headers::set(const std::string & name)
{
   headers_.insert( StringPair(name, "") );

   if (type_ == REQUEST) {
      curlHeaders_ = curl_slist_append(curlHeaders_, (name + ";").c_str());
   }
}


void
Headers::clear()
{
   if (curlHeaders_) {
      curl_slist_free_all(curlHeaders_);
      curlHeaders_ = NULL;
   }

   headers_.clear();
}


unsigned int
Headers::size()
{
   return headers_.size();
}


Headers::const_iterator
Headers::begin() const
{
   return headers_.begin();
}


Headers::const_iterator
Headers::end() const
{
   return headers_.end();
}


const struct curl_slist * Headers::getCurlHeaders() const
{
   return curlHeaders_;
}

}