Skip to content
/ i2pd Public
forked from PurpleI2P/i2pd

Commit

Permalink
I2PTunnelConnectionHTTP added
Browse files Browse the repository at this point in the history
  • Loading branch information
orignal committed Jun 2, 2015
1 parent 6a04364 commit 8a3c276
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 13 deletions.
44 changes: 34 additions & 10 deletions I2PTunnel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,13 @@ namespace client
Terminate ();
}
else
{
boost::asio::async_write (*m_Socket, boost::asio::buffer (m_StreamBuffer, bytes_transferred),
std::bind (&I2PTunnelConnection::HandleWrite, shared_from_this (), std::placeholders::_1));
}
Write (m_StreamBuffer, bytes_transferred);
}

void I2PTunnelConnection::Write (const uint8_t * buf, size_t len)
{
m_Socket->async_send (boost::asio::buffer (buf, len),
std::bind (&I2PTunnelConnection::HandleWrite, shared_from_this (), std::placeholders::_1));
}

void I2PTunnelConnection::HandleConnect (const boost::system::error_code& ecode)
Expand All @@ -159,6 +162,13 @@ namespace client
}
}

I2PTunnelConnectionHTTP::I2PTunnelConnectionHTTP (I2PService * owner, std::shared_ptr<i2p::stream::Stream> stream,
std::shared_ptr<boost::asio::ip::tcp::socket> socket,
const boost::asio::ip::tcp::endpoint& target, const std::string& host):
I2PTunnelConnection (owner, stream, socket, target)
{
}

/* This handler tries to stablish a connection with the desired server and dies if it fails to do so */
class I2PClientTunnelHandler: public I2PServiceHandler, public std::enable_shared_from_this<I2PClientTunnelHandler>
{
Expand Down Expand Up @@ -255,13 +265,15 @@ namespace client

I2PServerTunnel::I2PServerTunnel (const std::string& address, int port,
std::shared_ptr<ClientDestination> localDestination, int inport):
I2PService (localDestination), m_Endpoint (boost::asio::ip::address::from_string (address), port), m_IsAccessList (false)
I2PService (localDestination), m_Address (address), m_Port (port), m_IsAccessList (false)
{
m_PortDestination = localDestination->CreateStreamingDestination (inport > 0 ? inport : port);
}

void I2PServerTunnel::Start ()
{
m_Endpoint.address (boost::asio::ip::address::from_string (m_Address));
m_Endpoint.port (m_Port);
Accept ();
}

Expand Down Expand Up @@ -304,15 +316,27 @@ namespace client
return;
}
}
auto conn = std::make_shared<I2PTunnelConnection> (this, stream, std::make_shared<boost::asio::ip::tcp::socket> (GetService ()), m_Endpoint);
AddHandler (conn);
conn->Connect ();
CreateI2PConnection (stream);
}
}

I2PServerTunnelHTTP::I2PServerTunnelHTTP (const std::string& host, int port, std::shared_ptr<ClientDestination> localDestination, int inport):
I2PServerTunnel (host, port, localDestination, inport)
void I2PServerTunnel::CreateI2PConnection (std::shared_ptr<i2p::stream::Stream> stream)
{
auto conn = std::make_shared<I2PTunnelConnection> (this, stream, std::make_shared<boost::asio::ip::tcp::socket> (GetService ()), GetEndpoint ());
AddHandler (conn);
conn->Connect ();
}

I2PServerTunnelHTTP::I2PServerTunnelHTTP (const std::string& address, int port, std::shared_ptr<ClientDestination> localDestination, int inport):
I2PServerTunnel (address, port, localDestination, inport)
{
}

void I2PServerTunnelHTTP::CreateI2PConnection (std::shared_ptr<i2p::stream::Stream> stream)
{
auto conn = std::make_shared<I2PTunnelConnectionHTTP> (this, stream, std::make_shared<boost::asio::ip::tcp::socket> (GetService ()), GetEndpoint (), GetAddress ());
AddHandler (conn);
conn->Connect ();
}
}
}
27 changes: 24 additions & 3 deletions I2PTunnel.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,20 @@ namespace client
I2PTunnelConnection (I2PService * owner, std::shared_ptr<boost::asio::ip::tcp::socket> socket,
std::shared_ptr<const i2p::data::LeaseSet> leaseSet, int port = 0); // to I2P
I2PTunnelConnection (I2PService * owner, std::shared_ptr<boost::asio::ip::tcp::socket> socket,
std::shared_ptr<i2p::stream::Stream> stream); // to I2P using simplified API :)
std::shared_ptr<i2p::stream::Stream> stream); // to I2P using simplified API
I2PTunnelConnection (I2PService * owner, std::shared_ptr<i2p::stream::Stream> stream, std::shared_ptr<boost::asio::ip::tcp::socket> socket,
const boost::asio::ip::tcp::endpoint& target, bool quiet = true); // from I2P
~I2PTunnelConnection ();
void I2PConnect (const uint8_t * msg = nullptr, size_t len = 0);
void Connect ();

private:
protected:

void Terminate ();

void Receive ();
void HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred);
virtual void Write (const uint8_t * buf, size_t len); // can be overloaded
void HandleWrite (const boost::system::error_code& ecode);

void StreamReceive ();
Expand All @@ -55,6 +56,15 @@ namespace client
bool m_IsQuiet; // don't send destination
};

class I2PTunnelConnectionHTTP: public I2PTunnelConnection
{
public:

I2PTunnelConnectionHTTP (I2PService * owner, std::shared_ptr<i2p::stream::Stream> stream,
std::shared_ptr<boost::asio::ip::tcp::socket> socket,
const boost::asio::ip::tcp::endpoint& target, const std::string& host);
};

class I2PClientTunnel: public TCPIPAcceptor
{
protected:
Expand Down Expand Up @@ -92,13 +102,20 @@ namespace client

void SetAccessList (const std::set<i2p::data::IdentHash>& accessList);

const std::string& GetAddress() const { return m_Address; }
int GetPort () const { return m_Port; };
const boost::asio::ip::tcp::endpoint& GetEndpoint () const { return m_Endpoint; }

private:

void Accept ();
void HandleAccept (std::shared_ptr<i2p::stream::Stream> stream);
virtual void CreateI2PConnection (std::shared_ptr<i2p::stream::Stream> stream);

private:

std::string m_Address;
int m_Port;
boost::asio::ip::tcp::endpoint m_Endpoint;
std::shared_ptr<i2p::stream::StreamingDestination> m_PortDestination;
std::set<i2p::data::IdentHash> m_AccessList;
Expand All @@ -109,8 +126,12 @@ namespace client
{
public:

I2PServerTunnelHTTP (const std::string& host, int port,
I2PServerTunnelHTTP (const std::string& address, int port,
std::shared_ptr<ClientDestination> localDestination, int inport = 0);

private:

void CreateI2PConnection (std::shared_ptr<i2p::stream::Stream> stream);
};
}
}
Expand Down

0 comments on commit 8a3c276

Please sign in to comment.