#include <iostream>
#include <boost/array.hpp>
#include <boost/asio.hpp>
#include <string>

class BoostTCPConnect{
public:
   BoostTCPConnect(const char* address, const char* service):
       socket(io_service){
       boost::asio::ip::tcp::resolver resolver(io_service);
       boost::asio::ip::tcp::resolver::query query(address, service);
       boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
       boost::asio::ip::tcp::resolver::iterator end;

       error = boost::asio::error::host_not_found;
       while(error && endpoint_iterator!=end){
           socket.close();
           socket.connect(*endpoint_iterator++, error);
       }
       if(error) throw boost::system::system_error(error);
   }

   void writeString(const std::string& out_message){
        std::size_t length=0;
        while(length<out_message.length()){
           length += socket.write_some(boost::asio::buffer(out_message.c_str()+length), error);
        }
   }

   void readString(std::string& in_message){
       try{
           while(true){
               boost::array<char, 8192> buf;
               std::size_t len = socket.read_some(boost::asio::buffer(buf), error);
               if(error == boost::asio::error::eof)    break;
               else if(error)    throw boost::system::system_error(error);

               in_message += std::string(buf.data(), len);
            }
       }catch(std::exception& e){
           std::cerr << e.what() << std::endl;
       }
   }
private:
    boost::asio::io_service io_service;
    boost::asio::ip::tcp::tcp::socket socket;
    boost::system::error_code error;
};

int main(int argc, char* argv[]){
    try{
        BoostTCPConnect connect(argv[1], "http");
        std::string temp1("GET / HTTP/1.0\r\nHost: ");
        std::string temp2(argv[1]);
        std::string temp3("\r\nAccept: */*\r\nConnection: close\r\n\r\n");
        std::string w_message = temp1 + temp2 + temp3;

        connect.writeString(w_message);
        std::string html;
        connect.readString(html);
        html = html.substr(html.find("\r\n\r\n")+4, html.length());
        std::cout << html << std::endl;
    }
    catch(std::exception& e){
        std::cerr << "Error: ";
        std::cerr << e.what() << std::endl;
    }
    //std::cout << get << std::endl;
}
