mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-02-02 02:44:15 +00:00
don't block HTTP server/proxy for 10 seconds anymore
This commit is contained in:
parent
7b768ccb26
commit
e96ffd4189
@ -852,32 +852,42 @@ namespace util
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SendToDestination (destination, buf, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
void HTTPConnection::SendToDestination (const i2p::data::IdentHash& destination, const char * buf, size_t len)
|
|
||||||
{
|
|
||||||
auto leaseSet = i2p::client::context.GetSharedLocalDestination ()->FindLeaseSet (destination);
|
auto leaseSet = i2p::client::context.GetSharedLocalDestination ()->FindLeaseSet (destination);
|
||||||
if (!leaseSet || !leaseSet->HasNonExpiredLeases ())
|
if (leaseSet && leaseSet->HasNonExpiredLeases ())
|
||||||
|
SendToDestination (leaseSet, buf, len);
|
||||||
|
else
|
||||||
{
|
{
|
||||||
i2p::data::netdb.RequestDestination (destination, true, i2p::client::context.GetSharedLocalDestination ()->GetTunnelPool ());
|
i2p::data::netdb.RequestDestination (destination, true, i2p::client::context.GetSharedLocalDestination ()->GetTunnelPool ());
|
||||||
std::this_thread::sleep_for (std::chrono::seconds(10)); // wait for 10 seconds
|
m_Timer.expires_from_now (boost::posix_time::seconds(HTTP_DESTINATION_REQUEST_TIMEOUT));
|
||||||
leaseSet = i2p::client::context.GetSharedLocalDestination ()->FindLeaseSet (destination);
|
m_Timer.async_wait (boost::bind (&HTTPConnection::HandleDestinationRequestTimeout,
|
||||||
if (!leaseSet || !leaseSet->HasNonExpiredLeases ()) // still no LeaseSet
|
this, boost::asio::placeholders::error, destination, buf, len));
|
||||||
{
|
|
||||||
SendReply (leaseSet ? "<html>" + itoopieImage + "<br>Leases expired</html>" : "<html>" + itoopieImage + "LeaseSet not found</html>", 504);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HTTPConnection::HandleDestinationRequestTimeout (const boost::system::error_code& ecode, i2p::data::IdentHash destination, const char * buf, size_t len)
|
||||||
|
{
|
||||||
|
if (ecode != boost::asio::error::operation_aborted)
|
||||||
|
{
|
||||||
|
auto leaseSet = i2p::client::context.GetSharedLocalDestination ()->FindLeaseSet (destination);
|
||||||
|
if (leaseSet && leaseSet->HasNonExpiredLeases ())
|
||||||
|
SendToDestination (leaseSet, buf, len);
|
||||||
|
else
|
||||||
|
// still no LeaseSet
|
||||||
|
SendReply (leaseSet ? "<html>" + itoopieImage + "<br>Leases expired</html>" : "<html>" + itoopieImage + "LeaseSet not found</html>", 504);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HTTPConnection::SendToDestination (const i2p::data::LeaseSet * remote, const char * buf, size_t len)
|
||||||
|
{
|
||||||
if (!m_Stream)
|
if (!m_Stream)
|
||||||
m_Stream = i2p::client::context.GetSharedLocalDestination ()->CreateNewOutgoingStream (*leaseSet);
|
m_Stream = i2p::client::context.GetSharedLocalDestination ()->CreateNewOutgoingStream (*remote);
|
||||||
if (m_Stream)
|
if (m_Stream)
|
||||||
{
|
{
|
||||||
m_Stream->Send ((uint8_t *)buf, len);
|
m_Stream->Send ((uint8_t *)buf, len);
|
||||||
AsyncStreamReceive ();
|
AsyncStreamReceive ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTTPConnection::AsyncStreamReceive ()
|
void HTTPConnection::AsyncStreamReceive ()
|
||||||
{
|
{
|
||||||
if (m_Stream)
|
if (m_Stream)
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <thread>
|
#include <thread>
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
#include <boost/array.hpp>
|
#include <boost/array.hpp>
|
||||||
|
#include "LeaseSet.h"
|
||||||
#include "Streaming.h"
|
#include "Streaming.h"
|
||||||
|
|
||||||
namespace i2p
|
namespace i2p
|
||||||
@ -12,6 +13,7 @@ namespace i2p
|
|||||||
namespace util
|
namespace util
|
||||||
{
|
{
|
||||||
const size_t HTTP_CONNECTION_BUFFER_SIZE = 8192;
|
const size_t HTTP_CONNECTION_BUFFER_SIZE = 8192;
|
||||||
|
const int HTTP_DESTINATION_REQUEST_TIMEOUT = 10; // in seconds
|
||||||
class HTTPConnection
|
class HTTPConnection
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
@ -43,7 +45,8 @@ namespace util
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
HTTPConnection (boost::asio::ip::tcp::socket * socket):
|
HTTPConnection (boost::asio::ip::tcp::socket * socket):
|
||||||
m_Socket (socket), m_Stream (nullptr), m_BufferLen (0) { Receive (); };
|
m_Socket (socket), m_Timer (socket->get_io_service ()),
|
||||||
|
m_Stream (nullptr), m_BufferLen (0) { Receive (); };
|
||||||
virtual ~HTTPConnection() { delete m_Socket; }
|
virtual ~HTTPConnection() { delete m_Socket; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -74,6 +77,7 @@ namespace util
|
|||||||
protected:
|
protected:
|
||||||
|
|
||||||
boost::asio::ip::tcp::socket * m_Socket;
|
boost::asio::ip::tcp::socket * m_Socket;
|
||||||
|
boost::asio::deadline_timer m_Timer;
|
||||||
i2p::stream::Stream * m_Stream;
|
i2p::stream::Stream * m_Stream;
|
||||||
char m_Buffer[HTTP_CONNECTION_BUFFER_SIZE + 1], m_StreamBuffer[HTTP_CONNECTION_BUFFER_SIZE + 1];
|
char m_Buffer[HTTP_CONNECTION_BUFFER_SIZE + 1], m_StreamBuffer[HTTP_CONNECTION_BUFFER_SIZE + 1];
|
||||||
size_t m_BufferLen;
|
size_t m_BufferLen;
|
||||||
@ -85,7 +89,8 @@ namespace util
|
|||||||
virtual void RunRequest ();
|
virtual void RunRequest ();
|
||||||
void HandleDestinationRequest(const std::string& address, const std::string& uri);
|
void HandleDestinationRequest(const std::string& address, const std::string& uri);
|
||||||
void SendToAddress (const std::string& address, const char * buf, size_t len);
|
void SendToAddress (const std::string& address, const char * buf, size_t len);
|
||||||
void SendToDestination (const i2p::data::IdentHash& destination, const char * buf, size_t len);
|
void HandleDestinationRequestTimeout (const boost::system::error_code& ecode, i2p::data::IdentHash destination, const char * buf, size_t len);
|
||||||
|
void SendToDestination (const i2p::data::LeaseSet * remote, const char * buf, size_t len);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user