mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 08:14:15 +00:00
persist etag for addressbook subscription
This commit is contained in:
parent
4934fc8809
commit
1a894abcff
@ -24,7 +24,7 @@ namespace client
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
i2p::fs::HashedStorage storage;
|
i2p::fs::HashedStorage storage;
|
||||||
std::string indexPath;
|
std::string etagsPath, indexPath;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AddressBookFilesystemStorage (): storage("addressbook", "b", "", "b32") {};
|
AddressBookFilesystemStorage (): storage("addressbook", "b", "", "b32") {};
|
||||||
@ -35,11 +35,18 @@ namespace client
|
|||||||
bool Init ();
|
bool Init ();
|
||||||
int Load (std::map<std::string, i2p::data::IdentHash>& addresses);
|
int Load (std::map<std::string, i2p::data::IdentHash>& addresses);
|
||||||
int Save (const std::map<std::string, i2p::data::IdentHash>& addresses);
|
int Save (const std::map<std::string, i2p::data::IdentHash>& addresses);
|
||||||
|
|
||||||
|
void SaveEtag (const i2p::data::IdentHash& subsciption, const std::string& etag, const std::string& lastModified);
|
||||||
};
|
};
|
||||||
|
|
||||||
bool AddressBookFilesystemStorage::Init()
|
bool AddressBookFilesystemStorage::Init()
|
||||||
{
|
{
|
||||||
storage.SetPlace(i2p::fs::GetDataDir());
|
storage.SetPlace(i2p::fs::GetDataDir());
|
||||||
|
// init ETags
|
||||||
|
etagsPath = storage.GetRoot() + i2p::fs::dirSep + "etags";
|
||||||
|
if (!i2p::fs::Exists (etagsPath))
|
||||||
|
i2p::fs::CreateDirectory (etagsPath);
|
||||||
|
// init storage
|
||||||
indexPath = storage.GetRoot() + i2p::fs::dirSep + "addresses.csv";
|
indexPath = storage.GetRoot() + i2p::fs::dirSep + "addresses.csv";
|
||||||
return storage.Init(i2p::data::GetBase32SubstitutionTable(), 32);
|
return storage.Init(i2p::data::GetBase32SubstitutionTable(), 32);
|
||||||
}
|
}
|
||||||
@ -146,6 +153,14 @@ namespace client
|
|||||||
return num;
|
return num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AddressBookFilesystemStorage::SaveEtag (const i2p::data::IdentHash& subscription, const std::string& etag, const std::string& lastModified)
|
||||||
|
{
|
||||||
|
std::string fname = etagsPath + i2p::fs::dirSep + subscription.ToBase32 () + ".txt";
|
||||||
|
std::ofstream f (fname, std::ofstream::out | std::ofstream::trunc);
|
||||||
|
if (f)
|
||||||
|
f << etag << lastModified;
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
AddressBook::AddressBook (): m_Storage(new AddressBookFilesystemStorage), m_IsLoaded (false), m_IsDownloading (false),
|
AddressBook::AddressBook (): m_Storage(new AddressBookFilesystemStorage), m_IsLoaded (false), m_IsDownloading (false),
|
||||||
m_DefaultSubscription (nullptr), m_SubscriptionsUpdateTimer (nullptr)
|
m_DefaultSubscription (nullptr), m_SubscriptionsUpdateTimer (nullptr)
|
||||||
@ -337,7 +352,7 @@ namespace client
|
|||||||
LogPrint (eLogError, "Addressbook: subscriptions already loaded");
|
LogPrint (eLogError, "Addressbook: subscriptions already loaded");
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddressBook::DownloadComplete (bool success)
|
void AddressBook::DownloadComplete (bool success, const i2p::data::IdentHash& subscription, const std::string& etag, const std::string& lastModified)
|
||||||
{
|
{
|
||||||
m_IsDownloading = false;
|
m_IsDownloading = false;
|
||||||
int nextUpdateTimeout = CONTINIOUS_SUBSCRIPTION_RETRY_TIMEOUT;
|
int nextUpdateTimeout = CONTINIOUS_SUBSCRIPTION_RETRY_TIMEOUT;
|
||||||
@ -561,7 +576,7 @@ namespace client
|
|||||||
if (!success)
|
if (!success)
|
||||||
LogPrint (eLogError, "Addressbook: download hosts.txt from ", m_Link, " failed");
|
LogPrint (eLogError, "Addressbook: download hosts.txt from ", m_Link, " failed");
|
||||||
|
|
||||||
m_Book.DownloadComplete (success);
|
m_Book.DownloadComplete (success, ident, m_Etag, m_LastModified);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AddressBookSubscription::ProcessResponse (std::stringstream& s, bool isGzip)
|
bool AddressBookSubscription::ProcessResponse (std::stringstream& s, bool isGzip)
|
||||||
|
@ -38,6 +38,8 @@ namespace client
|
|||||||
virtual bool Init () = 0;
|
virtual bool Init () = 0;
|
||||||
virtual int Load (std::map<std::string, i2p::data::IdentHash>& addresses) = 0;
|
virtual int Load (std::map<std::string, i2p::data::IdentHash>& addresses) = 0;
|
||||||
virtual int Save (const std::map<std::string, i2p::data::IdentHash>& addresses) = 0;
|
virtual int Save (const std::map<std::string, i2p::data::IdentHash>& addresses) = 0;
|
||||||
|
|
||||||
|
virtual void SaveEtag (const i2p::data::IdentHash& subscription, const std::string& etag, const std::string& lastModified) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AddressBookSubscription;
|
class AddressBookSubscription;
|
||||||
@ -56,7 +58,7 @@ namespace client
|
|||||||
void InsertAddress (std::shared_ptr<const i2p::data::IdentityEx> address);
|
void InsertAddress (std::shared_ptr<const i2p::data::IdentityEx> address);
|
||||||
|
|
||||||
void LoadHostsFromStream (std::istream& f);
|
void LoadHostsFromStream (std::istream& f);
|
||||||
void DownloadComplete (bool success);
|
void DownloadComplete (bool success, const i2p::data::IdentHash& subscription, const std::string& etag, const std::string& lastModified);
|
||||||
//This method returns the ".b32.i2p" address
|
//This method returns the ".b32.i2p" address
|
||||||
std::string ToAddress(const i2p::data::IdentHash& ident) { return GetB32Address(ident); }
|
std::string ToAddress(const i2p::data::IdentHash& ident) { return GetB32Address(ident); }
|
||||||
std::string ToAddress(std::shared_ptr<const i2p::data::IdentityEx> ident) { return ToAddress(ident->GetIdentHash ()); }
|
std::string ToAddress(std::shared_ptr<const i2p::data::IdentityEx> ident) { return ToAddress(ident->GetIdentHash ()); }
|
||||||
|
7
FS.cpp
7
FS.cpp
@ -102,6 +102,13 @@ namespace fs {
|
|||||||
return boost::filesystem::remove(path);
|
return boost::filesystem::remove(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CreateDirectory (const std::string& path)
|
||||||
|
{
|
||||||
|
if (boost::filesystem::exists(path) &&
|
||||||
|
boost::filesystem::is_directory (boost::filesystem::status (path))) return true;
|
||||||
|
return boost::filesystem::create_directory(path);
|
||||||
|
}
|
||||||
|
|
||||||
void HashedStorage::SetPlace(const std::string &path) {
|
void HashedStorage::SetPlace(const std::string &path) {
|
||||||
root = path + i2p::fs::dirSep + name;
|
root = path + i2p::fs::dirSep + name;
|
||||||
}
|
}
|
||||||
|
2
FS.h
2
FS.h
@ -108,6 +108,8 @@ namespace fs {
|
|||||||
* @return true if file exists, false otherwise
|
* @return true if file exists, false otherwise
|
||||||
*/
|
*/
|
||||||
bool Exists(const std::string & path);
|
bool Exists(const std::string & path);
|
||||||
|
|
||||||
|
bool CreateDirectory (const std::string& path);
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void _ExpandPath(std::stringstream & path, T c) {
|
void _ExpandPath(std::stringstream & path, T c) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user