mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-13 01:20:22 +03:00
parse HTTP header fields
This commit is contained in:
parent
b1b72d2d33
commit
e1d445ab50
@ -290,7 +290,7 @@ namespace client
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddressBook::LoadHostsFromStream (std::istream& f)
|
void AddressBook::LoadHostsFromStream (std::istream& f, bool isChunked)
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> l(m_AddressBookMutex);
|
std::unique_lock<std::mutex> l(m_AddressBookMutex);
|
||||||
int numAddresses = 0;
|
int numAddresses = 0;
|
||||||
@ -376,9 +376,9 @@ namespace client
|
|||||||
request << "GET " << u.path_ << " HTTP/1.0\r\nHost: " << u.host_
|
request << "GET " << u.path_ << " HTTP/1.0\r\nHost: " << u.host_
|
||||||
<< "\r\nAccept: */*\r\n" << "User-Agent: Wget/1.11.4\r\n" << "Connection: close\r\n";
|
<< "\r\nAccept: */*\r\n" << "User-Agent: Wget/1.11.4\r\n" << "Connection: close\r\n";
|
||||||
if (m_Etag.length () > 0) // etag
|
if (m_Etag.length () > 0) // etag
|
||||||
request << HTTP_FIELD_ETAG << ": " << m_Etag << "\r\n";
|
request << i2p::util::http::ETAG << ": " << m_Etag << "\r\n";
|
||||||
if (m_LastModified.length () > 0) // if-modfief-since
|
if (m_LastModified.length () > 0) // if-modfief-since
|
||||||
request << HTTP_FIELD_IF_MODIFIED_SINCE << ": " << m_LastModified << "\r\n";
|
request << i2p::util::http::IF_MODIFIED_SINCE << ": " << m_LastModified << "\r\n";
|
||||||
request << "\r\n"; // end of header
|
request << "\r\n"; // end of header
|
||||||
auto stream = i2p::client::context.GetSharedLocalDestination ()->CreateStream (*leaseSet, u.port_);
|
auto stream = i2p::client::context.GetSharedLocalDestination ()->CreateStream (*leaseSet, u.port_);
|
||||||
stream->Send ((uint8_t *)request.str ().c_str (), request.str ().length ());
|
stream->Send ((uint8_t *)request.str ().c_str (), request.str ().length ());
|
||||||
@ -411,13 +411,28 @@ namespace client
|
|||||||
response >> status; // status
|
response >> status; // status
|
||||||
if (status == 200) // OK
|
if (status == 200) // OK
|
||||||
{
|
{
|
||||||
|
bool isChunked = false;
|
||||||
std::string header, statusMessage;
|
std::string header, statusMessage;
|
||||||
std::getline (response, statusMessage);
|
std::getline (response, statusMessage);
|
||||||
// read until new line meaning end of header
|
// read until new line meaning end of header
|
||||||
while (!response.eof () && header != "\r")
|
while (!response.eof () && header != "\r")
|
||||||
|
{
|
||||||
std::getline (response, header);
|
std::getline (response, header);
|
||||||
|
auto colon = header.find (':');
|
||||||
|
if (colon != std::string::npos)
|
||||||
|
{
|
||||||
|
std::string field = header.substr (0, colon);
|
||||||
|
header.resize (header.length () - 1); // delete \r
|
||||||
|
if (field == i2p::util::http::ETAG)
|
||||||
|
m_Etag = header.substr (colon + 1);
|
||||||
|
else if (field == i2p::util::http::LAST_MODIFIED)
|
||||||
|
m_LastModified = header.substr (colon + 1);
|
||||||
|
else if (field == i2p::util::http::TRANSFER_ENCODING)
|
||||||
|
isChunked = !header.compare (colon + 1, std::string::npos, "chunked");
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!response.eof ())
|
if (!response.eof ())
|
||||||
m_Book.LoadHostsFromStream (response);
|
m_Book.LoadHostsFromStream (response, isChunked);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LogPrint (eLogWarning, "Adressbook HTTP response ", status);
|
LogPrint (eLogWarning, "Adressbook HTTP response ", status);
|
||||||
|
@ -17,10 +17,6 @@ namespace i2p
|
|||||||
namespace client
|
namespace client
|
||||||
{
|
{
|
||||||
const char DEFAULT_SUBSCRIPTION_ADDRESS[] = "http://udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p/hosts.txt";
|
const char DEFAULT_SUBSCRIPTION_ADDRESS[] = "http://udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p/hosts.txt";
|
||||||
// TODO: move http fields to common http code
|
|
||||||
const char HTTP_FIELD_ETAG[] = "ETag";
|
|
||||||
const char HTTP_FIELD_IF_MODIFIED_SINCE[] = "If-Modified-Since";
|
|
||||||
const char HTTP_FIELD_LAST_MODIFIED[] = "Last-Modified";
|
|
||||||
|
|
||||||
class AddressBookStorage // interface for storage
|
class AddressBookStorage // interface for storage
|
||||||
{
|
{
|
||||||
@ -48,7 +44,7 @@ namespace client
|
|||||||
void InsertAddress (const std::string& address, const std::string& base64); // for jump service
|
void InsertAddress (const std::string& address, const std::string& base64); // for jump service
|
||||||
void InsertAddress (const i2p::data::IdentityEx& address);
|
void InsertAddress (const i2p::data::IdentityEx& address);
|
||||||
|
|
||||||
void LoadHostsFromStream (std::istream& f);
|
void LoadHostsFromStream (std::istream& f, bool isChunked = false);
|
||||||
void SetIsDownloading (bool isDownloading) { m_IsDownloading = isDownloading; };
|
void SetIsDownloading (bool isDownloading) { m_IsDownloading = isDownloading; };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -133,6 +133,7 @@ namespace data
|
|||||||
{
|
{
|
||||||
CryptoPP::AutoSeededRandomPool rnd;
|
CryptoPP::AutoSeededRandomPool rnd;
|
||||||
auto ind = rnd.GenerateWord32 (0, httpReseedHostList.size() - 1);
|
auto ind = rnd.GenerateWord32 (0, httpReseedHostList.size() - 1);
|
||||||
|
ind =5;
|
||||||
std::string reseedHost = httpReseedHostList[ind];
|
std::string reseedHost = httpReseedHostList[ind];
|
||||||
return ReseedFromSU3 (reseedHost);
|
return ReseedFromSU3 (reseedHost);
|
||||||
}
|
}
|
||||||
|
5
util.h
5
util.h
@ -39,6 +39,11 @@ namespace util
|
|||||||
|
|
||||||
namespace http
|
namespace http
|
||||||
{
|
{
|
||||||
|
const char ETAG[] = "ETag";
|
||||||
|
const char IF_MODIFIED_SINCE[] = "If-Modified-Since";
|
||||||
|
const char LAST_MODIFIED[] = "Last-Modified";
|
||||||
|
const char TRANSFER_ENCODING[] = "Transfer-Encoding";
|
||||||
|
|
||||||
std::string httpRequest(const std::string& address);
|
std::string httpRequest(const std::string& address);
|
||||||
int httpRequestViaI2pProxy(const std::string& address, std::string &content); // return http code
|
int httpRequestViaI2pProxy(const std::string& address, std::string &content); // return http code
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user