Ana can connect through a proxy without authentication.
This commit is contained in:
parent
8d6dda6386
commit
d7527ba3e3
4 changed files with 58 additions and 15 deletions
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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
|
|
@ -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));
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
Loading…
Add table
Reference in a new issue