Skip to content

Commit

Permalink
Merge pull request PurpleI2P#128 from klondi/httpproxy
Browse files Browse the repository at this point in the history
Httpproxy
  • Loading branch information
orignal committed Jan 2, 2015
2 parents 0f07b04 + e5503c5 commit fa40098
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 5 deletions.
40 changes: 39 additions & 1 deletion Destination.cpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
#include <algorithm>
#include <mutex>
#include <boost/lexical_cast.hpp>
#include <cryptopp/dh.h>
#include "Log.h"
#include "util.h"
#include "Timestamp.h"
#include "NetDb.h"
#include "Destination.h"
#include "ClientContext.h"

namespace i2p
{
Expand Down Expand Up @@ -383,12 +385,48 @@ namespace client
}
}

std::shared_ptr<i2p::stream::Stream> ClientDestination::CreateStream (const std::string& dest, int port) {
i2p::data::IdentHash identHash;
if (i2p::client::context.GetAddressBook ().GetIdentHash (dest, identHash))
return CreateStream (identHash, port);
else
{
LogPrint (eLogWarning, "Remote destination ", dest, " not found");
return nullptr;
}
}

std::shared_ptr<i2p::stream::Stream> ClientDestination::CreateStream (const i2p::data::IdentHash& dest, int port) {
const i2p::data::LeaseSet * leaseSet = FindLeaseSet (dest);
if (!leaseSet)
{
bool found = false;
std::condition_variable newDataReceived;
std::mutex newDataReceivedMutex;
std::unique_lock<std::mutex> l(newDataReceivedMutex);
RequestDestination (dest,
[&newDataReceived, &found](bool success)
{
found = success;
newDataReceived.notify_all ();
});
if (newDataReceived.wait_for (l, std::chrono::seconds (STREAM_REQUEST_TIMEOUT)) == std::cv_status::timeout)
LogPrint (eLogError, "Subscription LeseseSet request timeout expired");
if (found)
leaseSet = FindLeaseSet (dest);
}
if (leaseSet)
return CreateStream (*leaseSet, port);
else
return nullptr;
}

std::shared_ptr<i2p::stream::Stream> ClientDestination::CreateStream (const i2p::data::LeaseSet& remote, int port)
{
if (m_StreamingDestination)
return m_StreamingDestination->CreateNewOutgoingStream (remote, port);
return nullptr;
}
}

void ClientDestination::AcceptStreams (const i2p::stream::StreamingDestination::Acceptor& acceptor)
{
Expand Down
3 changes: 3 additions & 0 deletions Destination.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ namespace client
const int DEFAULT_INBOUND_TUNNEL_LENGTH = 3;
const char I2CP_PARAM_OUTBOUND_TUNNEL_LENGTH[] = "outbound.length";
const int DEFAULT_OUTBOUND_TUNNEL_LENGTH = 3;
const int STREAM_REQUEST_TIMEOUT = 60; //in seconds

class ClientDestination: public i2p::garlic::GarlicDestination
{
Expand Down Expand Up @@ -64,6 +65,8 @@ namespace client

// streaming
i2p::stream::StreamingDestination * GetStreamingDestination () const { return m_StreamingDestination; };
std::shared_ptr<i2p::stream::Stream> CreateStream (const std::string& dest, int port = 0);
std::shared_ptr<i2p::stream::Stream> CreateStream (const i2p::data::IdentHash& dest, int port = 0);
std::shared_ptr<i2p::stream::Stream> CreateStream (const i2p::data::LeaseSet& remote, int port = 0);
void AcceptStreams (const i2p::stream::StreamingDestination::Acceptor& acceptor);
void StopAcceptingStreams ();
Expand Down
8 changes: 6 additions & 2 deletions I2PTunnel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,11 @@ namespace client
}
}

I2PTunnel::I2PTunnel (ClientDestination * localDestination) :
m_LocalDestination (localDestination ? localDestination :
i2p::client::context.CreateNewLocalDestination (false, I2P_TUNNEL_DEFAULT_KEY_TYPE))
{
}
void I2PTunnel::AddConnection (std::shared_ptr<I2PTunnelConnection> conn)
{
m_Connections.insert (conn);
Expand All @@ -155,8 +160,7 @@ namespace client
}

I2PClientTunnel::I2PClientTunnel (const std::string& destination, int port, ClientDestination * localDestination):
I2PTunnel (localDestination ? localDestination :
i2p::client::context.CreateNewLocalDestination (false, i2p::data::SIGNING_KEY_TYPE_ECDSA_SHA256_P256)),
I2PTunnel (localDestination),
m_Acceptor (GetService (), boost::asio::ip::tcp::endpoint (boost::asio::ip::tcp::v4(), port)),
m_Timer (GetService ()), m_Destination (destination), m_DestinationIdentHash (nullptr),
m_RemoteLeaseSet (nullptr)
Expand Down
4 changes: 2 additions & 2 deletions I2PTunnel.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ namespace client
const size_t I2P_TUNNEL_CONNECTION_BUFFER_SIZE = 8192;
const int I2P_TUNNEL_CONNECTION_MAX_IDLE = 3600; // in seconds
const int I2P_TUNNEL_DESTINATION_REQUEST_TIMEOUT = 10; // in seconds
const uint16_t I2P_TUNNEL_DEFAULT_KEY_TYPE = i2p::data::SIGNING_KEY_TYPE_ECDSA_SHA256_P256;

class I2PTunnel;
class I2PTunnelConnection: public std::enable_shared_from_this<I2PTunnelConnection>
Expand Down Expand Up @@ -58,8 +59,7 @@ namespace client
{
public:

I2PTunnel (ClientDestination * localDestination):
m_LocalDestination (localDestination) {};
I2PTunnel (ClientDestination * localDestination = nullptr);
virtual ~I2PTunnel () { ClearConnections (); };

void AddConnection (std::shared_ptr<I2PTunnelConnection> conn);
Expand Down

0 comments on commit fa40098

Please sign in to comment.