Ana can connect through a proxy without authentication.

This commit is contained in:
Guillermo Biset 2010-06-05 01:15:36 +00:00
parent 8d6dda6386
commit d7527ba3e3
4 changed files with 58 additions and 15 deletions

View file

@ -17,7 +17,8 @@ asio_client::asio_client(ana::address address, ana::port pt) :
asio_listener(io_service_, socket_),
address_(address),
port_(pt),
proxy_( NULL )
proxy_( NULL ),
use_proxy_( false )
{
}
@ -33,7 +34,8 @@ ana::client* ana::client::create(ana::address address, ana::port pt)
void asio_client::run()
{
run_listener( );
if ( ! use_proxy_ ) // If I will connect through a proxy, defer this call until connected.
run_listener( );
boost::thread t( boost::bind( &boost::asio::io_service::run, &io_service_) );
}
@ -43,6 +45,11 @@ ana::client_id asio_client::id() const
return 0;
}
void asio_client::handle_proxy_connection()
{
run_listener();
}
void asio_client::handle_connect(const boost::system::error_code& ec,
tcp::resolver::iterator endpoint_iterator,
ana::connection_handler* handler )
@ -95,6 +102,8 @@ void asio_client::connect_through_proxy(ana::proxy::authentication_type auth_typ
std::string user_name,
std::string password)
{
use_proxy_ = true;
proxy_information proxy_info;
proxy_info.auth_type = auth_type;
@ -103,7 +112,7 @@ void asio_client::connect_through_proxy(ana::proxy::authentication_type auth_typ
proxy_info.user_name = user_name;
proxy_info.password = password;
proxy_ = new proxy_connection( socket_, proxy_info, address_, port_);
proxy_ = new proxy_connection( socket_, proxy_info, address_, port_, this);
proxy_->connect( handler );
}

View file

@ -13,7 +13,8 @@ using boost::asio::ip::tcp;
#define ASIO_CLIENT_HPP
class asio_client : public ana::client,
public asio_listener
public asio_listener,
private proxy_connection_manager
{
public:
/**
@ -44,6 +45,8 @@ class asio_client : public ana::client,
virtual void disconnect_listener();
virtual void handle_proxy_connection();
void handle_sent_header(const boost::system::error_code& ec,
mili::bostream*, ana::detail::shared_buffer,
ana::send_handler*);
@ -68,6 +71,7 @@ class asio_client : public ana::client,
ana::port port_;
proxy_connection* proxy_;
bool use_proxy_;
};
#endif

View file

@ -1,10 +1,14 @@
#include <sstream>
#include "asio_proxy_connection.hpp"
proxy_connection::proxy_connection(tcp::socket& socket, proxy_information pi, ana::address address, ana::port port) :
proxy_connection::proxy_connection(tcp::socket& socket, proxy_information pi, ana::address address,
ana::port port, proxy_connection_manager* manager) :
socket_(socket),
proxy_info_(pi),
address_(address),
port_(port)
port_(port),
manager_(manager)
{
}
@ -19,12 +23,27 @@ std::string* proxy_connection::generate_connect_request() const
);
}
void proxy_connection::handle_response(ana::detail::read_buffer buf,
void proxy_connection::handle_response(boost::asio::streambuf* buf,
const boost::system::error_code& ec,
ana::connection_handler* handler)
{
//TODO: interpret the response and act accordingly
std::cout << "Received: " << buf->string() << "\n"; //to debug for now!
if ( ec )
handler->handle_connect(ec, 0);
else
{
std::stringstream ss;
ss << buf;
const size_t find_pos = ss.str().find( std::string( "200 Connection established" ) );
if ( find_pos < ss.str().size() )
{
handler->handle_connect( ec, 0 );
manager_->handle_proxy_connection();
}
}
delete buf;
}
void proxy_connection::handle_sent_request(const boost::system::error_code& ec,
@ -33,12 +52,12 @@ void proxy_connection::handle_sent_request(const boost::system::error_code& ec,
{
delete request;
//TODO: use a meaningful constant instead of 100
ana::detail::read_buffer read_buf( new ana::detail::read_buffer_implementation( 100 ) );
boost::asio::streambuf* buf = new boost::asio::streambuf( 500 );
boost::asio::async_read(socket_, boost::asio::buffer( read_buf->base(), read_buf->size() ),
boost::bind(&proxy_connection::handle_response, this,
read_buf, boost::asio::placeholders::error, handler));
boost::asio::async_read_until(socket_, *buf,
"\r\n\r\n",
boost::bind(&proxy_connection::handle_response, this,
buf, boost::asio::placeholders::error, handler));
}

View file

@ -9,6 +9,11 @@ using boost::asio::ip::tcp;
#ifndef ASIO_PROXY_CONNECTION
#define ASIO_PROXY_CONNECTION
struct proxy_connection_manager
{
virtual void handle_proxy_connection() = 0;
};
struct proxy_information
{
proxy_information() :
@ -30,7 +35,11 @@ struct proxy_information
class proxy_connection
{
public:
proxy_connection(tcp::socket& socket, proxy_information pi, ana::address address, ana::port port);
proxy_connection(tcp::socket& socket,
proxy_information pi,
ana::address address,
ana::port port,
proxy_connection_manager* manager);
void connect( ana::connection_handler* handler );
@ -44,7 +53,7 @@ class proxy_connection
void handle_sent_request(const boost::system::error_code& ec,
std::string* request, ana::connection_handler* handler);
void handle_response( ana::detail::read_buffer ,
void handle_response( boost::asio::streambuf* buf ,
const boost::system::error_code& ,
ana::connection_handler* );
@ -55,6 +64,8 @@ class proxy_connection
ana::address address_;
ana::port port_;
proxy_connection_manager* manager_;
};
#endif