#pragma once

// Transport includes
#include "transport/config.h"
#include "transport/networkplugin.h"
#include "transport/logging.h"

// Swiften
#include "Swiften/Swiften.h"
#include "Swiften/TLS/OpenSSL/OpenSSLContextFactory.h"

// for signal handler
#include "unistd.h"
#include "signal.h"
#include "sys/wait.h"
#include "sys/signal.h"

// Boost
#include <boost/algorithm/string.hpp>

using namespace boost::filesystem;
using namespace boost::program_options;
using namespace Transport;

class HTTPFetch {
	public:
		HTTPFetch(Swift::BoostIOServiceThread *ioSerice, Swift::ConnectionFactory *factory);
		virtual ~HTTPFetch();

		bool fetchURL(const std::string &url);

		boost::signal<void (const std::string &data)> onURLFetched;

	private:
		void _connected(boost::shared_ptr<Swift::Connection> conn, const std::string url, bool error);
		void _disconnected(boost::shared_ptr<Swift::Connection> conn);
		void _read(boost::shared_ptr<Swift::Connection> conn, boost::shared_ptr<Swift::SafeByteArray> data);

		Swift::BoostIOServiceThread *m_ioService;
		Swift::ConnectionFactory *m_factory;
		std::string m_buffer;
		bool m_afterHeader;
};