Boost logo

Boost Users :

Subject: Re: [Boost-users] boost::asio SSL connection thru proxy server
From: Kumar, Akhilesh (Akhilesh.Kumar_at_[hidden])
Date: 2010-08-30 17:13:12


Sam,

Here is my code snippet to connect to a server without proxy, This code works fine I have tested it, my question is what changes I need to make if I have to go thru proxy to connect to server.


Thanks,

using boost::asio::ip::tcp;
using namespace std;
using namespace boost;

CBoostSocket::Connect()
{
     try
     {
         tcp::resolver *m_pResolver;
         tcp::socket *m_pSocket;
         boost::asio::streambuf request_;
         boost::asio::streambuf response_;
         boost::asio::io_service *m_pIOservice;
         boost::asio::ssl::context *m_pSSLContext;
          boost::asio::ssl::stream<boost::asio::ip::tcp::socket> *m_pSecureSocket;
         string m_host;//host url

         m_pIOservice = new boost::asio::io_service();

         tcp::resolver resolver(*m_pIOservice);
         m_pSSLContext = new boost::asio::ssl::context(*m_pIOservice, boost::asio::ssl::context::sslv23_client);
         m_pSSLContext->set_verify_mode(boost::asio::ssl::context::verify_none);

         //by default connect directly
         string proxyOrHost(m_host);
         //CInternetSettings netSetting;

         boost::system::error_code error = boost::asio::error::host_not_found;
         tcp::resolver::iterator end;

         tcp::resolver::query query(proxyOrHost , "https");
         tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
         // Try each endpoint until we successfully establish a connection.

         //boost::system::error_code error;
         m_pSecureSocket = new boost::asio::ssl::stream<boost::asio::ip::tcp::socket>(*m_pIOservice, *m_pSSLContext) ;
         //try to connect it directly first even though proxy is set, if fail try with proxy
         while (error && endpoint_iterator != end)
         {
              m_pSecureSocket->lowest_layer().close();
              m_pSecureSocket->lowest_layer().connect(*endpoint_iterator++, error);
              if (!error)
              {

                  m_pSecureSocket->handshake(boost::asio::ssl::stream_base::client, error);
                  if(!error)
                  {
                  }
                  else{
                       boost::system::error_code code = error;
                       boost::system::system_error e(error);
                       long lastResult = code.value();
                       string errorString = e.what();
                       m_pSecureSocket->lowest_layer().close();
                       ASSERT(!"Handshake failed: ");
                       std::cout << "Handshake failed: " << error << "\n";
return ;
                  }
              }
              else
              {
                  boost::system::error_code code = error;
                  boost::system::system_error e(error);
                  long lastResult = code.value();
                  string errorString = e.what();
                  ASSERT(!"Connect failed: ");
                   std::cout << "Connect failed: " << error << "\n";
                  m_pSecureSocket->lowest_layer().close();
return ;
              }
         }

         boost::asio::streambuf request;
         std::ostream request_stream(&request);

         request_stream << "POST" << " " << urlPath << " HTTP/1.0\r\n";
         request_stream << "Host: " << m_host << "\r\n";
          request_stream << "Accept: */*\r\n";

     long contentLength = 0;
     const wchar_t *pPostParam;
     long paramLen;

     if(pPostParam && paramLen)
     {
         request_stream << "Content-Length: ";
         request_stream << boost::lexical_cast<string>(contentLength);
         request_stream << "\r\n";
     }
     else
     {

     }

     request_stream << "Cache-Control: no-cache\r\n";
     request_stream << "Connection: Close\r\n\r\n";

     // Send the request.
     boost::system::error_code error;
     boost::asio::write(*m_pSecureSocket, request );
     //Write post param

     if (error)
              throw boost::system::system_error(error);
     }
     catch(...) {
     }
     catch (boost::system::system_error &e){
         //Handle Error
     }
     return S_OK;
}


Akhilesh Kumar

From: boost-users-bounces_at_[hidden] [mailto:boost-users-bounces_at_[hidden]] On Behalf Of Sam Miller
Sent: Monday, August 30, 2010 12:43 PM
To: boost-users_at_[hidden]
Subject: Re: [Boost-users] boost::asio SSL connection thru proxy server


Akilesh,

Your question is not clear to me, what exactly does not work when using your proxy? Does the SSL handshake fail?

Sam

[cid:image001.gif_at_01CB4845.C28A2DD0]"Kumar, Akhilesh" ---08/30/2010 02:34:00 PM---Hi All, Considering that nobody replied my question I am wondering if anybody who has knowledge of t

From:


"Kumar, Akhilesh" <Akhilesh.Kumar_at_[hidden]>


To:


"boost-users_at_[hidden]" <boost-users_at_[hidden]>


Date:


08/30/2010 02:34 PM


Subject:


Re: [Boost-users] boost::asio SSL connection thru proxy server


Sent by:


boost-users-bounces_at_[hidden]

________________________________



Hi All,

Considering that nobody replied my question I am wondering if anybody who has knowledge of this kind of problem has seen my previous message/question. I really need help on this issue if anybody has any thought on this pls. reply.

Thanks,

Akhilesh Kumar

From: Kumar, Akhilesh
Sent: Monday, August 23, 2010 5:10 PM
To: 'boost-users_at_[hidden]'
Subject: boost::asio SSL connection thru proxy server

Hi,

I am writing a boost socket client using boost::asio to do secure HTTP (HTTPS) communication. I Implemented my client based on the code sample based on (http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/example/ssl/client.cpp) with little changes as I am using sync socket. My client woks fine, when I am connecting to server directly, but I am not sure what changes I need to make when my communication going thru proxy.

The unsecure connection(HTTP) work fine thru proxy, and here is what I do for unsecure connection,
1. Initialize boost socket(IO service and other stuff).
2. Resolve and Connect to Proxy server.
3. Start writing to actual server(HTTP send request).
4. Start uploading/downloading.
5. Close Socket.

But I can’t use this above procedure for (SSL) secure connection as I need to do handshaking with the server before I can write anything if my understanding is correct.

Can somebody give me some pointer or code sample or step I need to do when I am doing secure connection thru proxy server.

Just to clarify Microsoft WinInet does do (secure) HTTPS connection thru same proxy fine. If providing my code sample I am using for SSL might help understand the problem I can provide that.

Thanks in advance for any help.

Akhilesh Kumar
_______________________________________________
Boost-users mailing list
Boost-users_at_[hidden]
http://lists.boost.org/mailman/listinfo.cgi/boost-users




image001.gif
image003.png
image004.png

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net