mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 21:37:17 +01:00
Compare commits
3 commits
9bc595a9a2
...
0086f8e27a
Author | SHA1 | Date | |
---|---|---|---|
0086f8e27a | |||
8a8277edda | |||
3f10f6651d |
|
@ -103,6 +103,7 @@ namespace http
|
||||||
|
|
||||||
bool URL::parse(std::string_view url)
|
bool URL::parse(std::string_view url)
|
||||||
{
|
{
|
||||||
|
if (url.empty ()) return false;
|
||||||
std::size_t pos_p = 0; /* < current parse position */
|
std::size_t pos_p = 0; /* < current parse position */
|
||||||
std::size_t pos_c = 0; /* < work position */
|
std::size_t pos_c = 0; /* < work position */
|
||||||
if(url.at(0) != '/' || pos_p > 0)
|
if(url.at(0) != '/' || pos_p > 0)
|
||||||
|
|
|
@ -412,16 +412,24 @@ namespace transport
|
||||||
" is semi-full (size = ", m_SendQueue.size (), ", lag = ", queueLag / 1000, ", rtt = ", (int)m_RTT, ")");
|
" is semi-full (size = ", m_SendQueue.size (), ", lag = ", queueLag / 1000, ", rtt = ", (int)m_RTT, ")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (auto it: msgs)
|
if (isSemiFull)
|
||||||
{
|
{
|
||||||
if (isSemiFull && it->onDrop)
|
for (auto it: msgs)
|
||||||
it->Drop (); // drop earlier because we can handle it
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
it->SetEnqueueTime (mts);
|
if (it->onDrop)
|
||||||
m_SendQueue.push_back (std::move (it));
|
it->Drop (); // drop earlier because we can handle it
|
||||||
|
else
|
||||||
|
{
|
||||||
|
it->SetEnqueueTime (mts);
|
||||||
|
m_SendQueue.push_back (std::move (it));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (auto& it: msgs) it->SetEnqueueTime (mts);
|
||||||
|
m_SendQueue.splice (m_SendQueue.end (), msgs);
|
||||||
|
}
|
||||||
if (IsEstablished ())
|
if (IsEstablished ())
|
||||||
{
|
{
|
||||||
SendQueue ();
|
SendQueue ();
|
||||||
|
|
|
@ -305,7 +305,7 @@ namespace client
|
||||||
identHash = hash;
|
identHash = hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
AddressBook::AddressBook (): m_Storage(nullptr), m_IsLoaded (false), m_IsDownloading (false),
|
AddressBook::AddressBook (): m_Storage(nullptr), m_IsLoaded (false),
|
||||||
m_NumRetries (0), m_DefaultSubscription (nullptr), m_SubscriptionsUpdateTimer (nullptr),
|
m_NumRetries (0), m_DefaultSubscription (nullptr), m_SubscriptionsUpdateTimer (nullptr),
|
||||||
m_IsEnabled (true)
|
m_IsEnabled (true)
|
||||||
{
|
{
|
||||||
|
@ -344,20 +344,28 @@ namespace client
|
||||||
delete m_SubscriptionsUpdateTimer;
|
delete m_SubscriptionsUpdateTimer;
|
||||||
m_SubscriptionsUpdateTimer = nullptr;
|
m_SubscriptionsUpdateTimer = nullptr;
|
||||||
}
|
}
|
||||||
if (m_IsDownloading)
|
bool isDownloading = m_Downloading.valid ();
|
||||||
|
if (isDownloading)
|
||||||
{
|
{
|
||||||
LogPrint (eLogInfo, "Addressbook: Subscriptions are downloading, abort");
|
if (m_Downloading.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
|
||||||
for (int i = 0; i < 30; i++)
|
isDownloading = false;
|
||||||
{
|
else
|
||||||
if (!m_IsDownloading)
|
{
|
||||||
|
LogPrint (eLogInfo, "Addressbook: Subscriptions are downloading, abort");
|
||||||
|
for (int i = 0; i < 30; i++)
|
||||||
{
|
{
|
||||||
LogPrint (eLogInfo, "Addressbook: Subscriptions download complete");
|
if (m_Downloading.wait_for(std::chrono::seconds(1)) == std::future_status::ready) // wait for 1 seconds
|
||||||
break;
|
{
|
||||||
|
isDownloading = false;
|
||||||
|
LogPrint (eLogInfo, "Addressbook: Subscriptions download complete");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
std::this_thread::sleep_for (std::chrono::seconds (1)); // wait for 1 seconds
|
}
|
||||||
}
|
if (!isDownloading)
|
||||||
LogPrint (eLogError, "Addressbook: Subscription download timeout");
|
m_Downloading.get ();
|
||||||
m_IsDownloading = false;
|
else
|
||||||
|
LogPrint (eLogError, "Addressbook: Subscription download timeout");
|
||||||
}
|
}
|
||||||
if (m_Storage)
|
if (m_Storage)
|
||||||
{
|
{
|
||||||
|
@ -582,16 +590,15 @@ namespace client
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogPrint (eLogInfo, "Addressbook: Loading subscriptions from config file");
|
LogPrint (eLogInfo, "Addressbook: Loading subscriptions from config");
|
||||||
// using config file items
|
// using config file items
|
||||||
std::string subscriptionURLs; i2p::config::GetOption("addressbook.subscriptions", subscriptionURLs);
|
std::string subscriptionURLs; i2p::config::GetOption("addressbook.subscriptions", subscriptionURLs);
|
||||||
std::vector<std::string> subsList;
|
std::vector<std::string> subsList;
|
||||||
boost::split(subsList, subscriptionURLs, boost::is_any_of(","), boost::token_compress_on);
|
boost::split(subsList, subscriptionURLs, boost::is_any_of(","), boost::token_compress_on);
|
||||||
|
|
||||||
for (const auto& s: subsList)
|
for (const auto& s: subsList)
|
||||||
{
|
if (!s.empty ())
|
||||||
m_Subscriptions.push_back (std::make_shared<AddressBookSubscription> (*this, s));
|
m_Subscriptions.push_back (std::make_shared<AddressBookSubscription> (*this, s));
|
||||||
}
|
|
||||||
LogPrint (eLogInfo, "Addressbook: ", m_Subscriptions.size (), " subscriptions urls loaded");
|
LogPrint (eLogInfo, "Addressbook: ", m_Subscriptions.size (), " subscriptions urls loaded");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -645,7 +652,6 @@ namespace client
|
||||||
|
|
||||||
void AddressBook::DownloadComplete (bool success, const i2p::data::IdentHash& subscription, const std::string& etag, const std::string& lastModified)
|
void AddressBook::DownloadComplete (bool success, const i2p::data::IdentHash& subscription, const std::string& etag, const std::string& lastModified)
|
||||||
{
|
{
|
||||||
m_IsDownloading = false;
|
|
||||||
m_NumRetries++;
|
m_NumRetries++;
|
||||||
int nextUpdateTimeout = m_NumRetries*CONTINIOUS_SUBSCRIPTION_RETRY_TIMEOUT;
|
int nextUpdateTimeout = m_NumRetries*CONTINIOUS_SUBSCRIPTION_RETRY_TIMEOUT;
|
||||||
if (m_NumRetries > CONTINIOUS_SUBSCRIPTION_MAX_NUM_RETRIES || nextUpdateTimeout > CONTINIOUS_SUBSCRIPTION_UPDATE_TIMEOUT)
|
if (m_NumRetries > CONTINIOUS_SUBSCRIPTION_MAX_NUM_RETRIES || nextUpdateTimeout > CONTINIOUS_SUBSCRIPTION_UPDATE_TIMEOUT)
|
||||||
|
@ -700,7 +706,13 @@ namespace client
|
||||||
LogPrint(eLogWarning, "Addressbook: Missing local destination, skip subscription update");
|
LogPrint(eLogWarning, "Addressbook: Missing local destination, skip subscription update");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!m_IsDownloading && dest->IsReady ())
|
bool isDownloading = m_Downloading.valid ();
|
||||||
|
if (isDownloading && m_Downloading.wait_for(std::chrono::seconds(0)) == std::future_status::ready) // still active?
|
||||||
|
{
|
||||||
|
m_Downloading.get ();
|
||||||
|
isDownloading = false;
|
||||||
|
}
|
||||||
|
if (!isDownloading && dest->IsReady ())
|
||||||
{
|
{
|
||||||
if (!m_IsLoaded)
|
if (!m_IsLoaded)
|
||||||
{
|
{
|
||||||
|
@ -709,17 +721,15 @@ namespace client
|
||||||
std::string defaultSubURL; i2p::config::GetOption("addressbook.defaulturl", defaultSubURL);
|
std::string defaultSubURL; i2p::config::GetOption("addressbook.defaulturl", defaultSubURL);
|
||||||
if (!m_DefaultSubscription)
|
if (!m_DefaultSubscription)
|
||||||
m_DefaultSubscription = std::make_shared<AddressBookSubscription>(*this, defaultSubURL);
|
m_DefaultSubscription = std::make_shared<AddressBookSubscription>(*this, defaultSubURL);
|
||||||
m_IsDownloading = true;
|
m_Downloading = std::async (std::launch::async,
|
||||||
std::thread load_hosts(std::bind (&AddressBookSubscription::CheckUpdates, m_DefaultSubscription));
|
std::bind (&AddressBookSubscription::CheckUpdates, m_DefaultSubscription));
|
||||||
load_hosts.detach(); // TODO: use join
|
|
||||||
}
|
}
|
||||||
else if (!m_Subscriptions.empty ())
|
else if (!m_Subscriptions.empty ())
|
||||||
{
|
{
|
||||||
// pick random subscription
|
// pick random subscription
|
||||||
auto ind = rand () % m_Subscriptions.size();
|
auto ind = rand () % m_Subscriptions.size();
|
||||||
m_IsDownloading = true;
|
m_Downloading = std::async (std::launch::async,
|
||||||
std::thread load_hosts(std::bind (&AddressBookSubscription::CheckUpdates, m_Subscriptions[ind]));
|
std::bind (&AddressBookSubscription::CheckUpdates, m_Subscriptions[ind]));
|
||||||
load_hosts.detach(); // TODO: use join
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -823,7 +833,7 @@ namespace client
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AddressBookSubscription::AddressBookSubscription (AddressBook& book, const std::string& link):
|
AddressBookSubscription::AddressBookSubscription (AddressBook& book, std::string_view link):
|
||||||
m_Book (book), m_Link (link)
|
m_Book (book), m_Link (link)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,10 +11,12 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
#include <future>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
#include "Base.h"
|
#include "Base.h"
|
||||||
|
@ -124,7 +126,8 @@ namespace client
|
||||||
std::mutex m_LookupsMutex;
|
std::mutex m_LookupsMutex;
|
||||||
std::map<uint32_t, std::string> m_Lookups; // nonce -> address
|
std::map<uint32_t, std::string> m_Lookups; // nonce -> address
|
||||||
AddressBookStorage * m_Storage;
|
AddressBookStorage * m_Storage;
|
||||||
volatile bool m_IsLoaded, m_IsDownloading;
|
volatile bool m_IsLoaded;
|
||||||
|
std::future<void> m_Downloading;
|
||||||
int m_NumRetries;
|
int m_NumRetries;
|
||||||
std::vector<std::shared_ptr<AddressBookSubscription> > m_Subscriptions;
|
std::vector<std::shared_ptr<AddressBookSubscription> > m_Subscriptions;
|
||||||
std::shared_ptr<AddressBookSubscription> m_DefaultSubscription; // in case if we don't know any addresses yet
|
std::shared_ptr<AddressBookSubscription> m_DefaultSubscription; // in case if we don't know any addresses yet
|
||||||
|
@ -136,7 +139,7 @@ namespace client
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
AddressBookSubscription (AddressBook& book, const std::string& link);
|
AddressBookSubscription (AddressBook& book, std::string_view link);
|
||||||
void CheckUpdates ();
|
void CheckUpdates ();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Reference in a new issue