|
|
|
@ -242,40 +242,8 @@ namespace http
@@ -242,40 +242,8 @@ namespace http
|
|
|
|
|
// User-Agent is needed to get the server list routerInfo files.
|
|
|
|
|
site << "GET " << u.path_ << " HTTP/1.1\r\nHost: " << u.host_ |
|
|
|
|
<< "\r\nAccept: */*\r\n" << "User-Agent: Wget/1.11.4\r\n" << "Connection: close\r\n\r\n"; |
|
|
|
|
// read response
|
|
|
|
|
std::string version, statusMessage; |
|
|
|
|
site >> version; // HTTP version
|
|
|
|
|
int status; |
|
|
|
|
site >> status; // status
|
|
|
|
|
std::getline (site, statusMessage); |
|
|
|
|
if (status == 200) // OK
|
|
|
|
|
{ |
|
|
|
|
bool isChunked = false; |
|
|
|
|
std::string header; |
|
|
|
|
while (!site.eof () && header != "\r") |
|
|
|
|
{ |
|
|
|
|
std::getline(site, header); |
|
|
|
|
auto colon = header.find (':'); |
|
|
|
|
if (colon != std::string::npos) |
|
|
|
|
{ |
|
|
|
|
std::string field = header.substr (0, colon); |
|
|
|
|
if (field == i2p::util::http::TRANSFER_ENCODING) |
|
|
|
|
isChunked = (header.find ("chunked", colon + 1) != std::string::npos); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::stringstream ss; |
|
|
|
|
if (isChunked) |
|
|
|
|
MergeChunkedResponse (site, ss); |
|
|
|
|
else |
|
|
|
|
ss << site.rdbuf(); |
|
|
|
|
return ss.str(); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
LogPrint ("HTTP response ", status); |
|
|
|
|
return ""; |
|
|
|
|
} |
|
|
|
|
// read response and extract content
|
|
|
|
|
return GetHttpContent (site); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
@ -290,6 +258,43 @@ namespace http
@@ -290,6 +258,43 @@ namespace http
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::string GetHttpContent (std::istream& response) |
|
|
|
|
{ |
|
|
|
|
std::string version, statusMessage; |
|
|
|
|
response >> version; // HTTP version
|
|
|
|
|
int status; |
|
|
|
|
response >> status; // status
|
|
|
|
|
std::getline (response, statusMessage); |
|
|
|
|
if (status == 200) // OK
|
|
|
|
|
{ |
|
|
|
|
bool isChunked = false; |
|
|
|
|
std::string header; |
|
|
|
|
while (!response.eof () && header != "\r") |
|
|
|
|
{ |
|
|
|
|
std::getline(response, header); |
|
|
|
|
auto colon = header.find (':'); |
|
|
|
|
if (colon != std::string::npos) |
|
|
|
|
{ |
|
|
|
|
std::string field = header.substr (0, colon); |
|
|
|
|
if (field == i2p::util::http::TRANSFER_ENCODING) |
|
|
|
|
isChunked = (header.find ("chunked", colon + 1) != std::string::npos); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::stringstream ss; |
|
|
|
|
if (isChunked) |
|
|
|
|
MergeChunkedResponse (response, ss); |
|
|
|
|
else |
|
|
|
|
ss << response.rdbuf(); |
|
|
|
|
return ss.str(); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
LogPrint ("HTTP response ", status); |
|
|
|
|
return ""; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void MergeChunkedResponse (std::istream& response, std::ostream& merged) |
|
|
|
|
{ |
|
|
|
|
while (!response.eof ()) |
|
|
|
|