diff --git a/Reseed.cpp b/Reseed.cpp index e8969583..1091ef0a 100644 --- a/Reseed.cpp +++ b/Reseed.cpp @@ -15,7 +15,6 @@ #include "Identity.h" #include "NetDb.h" #include "HTTP.h" -#include "util.h" namespace i2p { @@ -405,15 +404,31 @@ namespace data s.write_some (boost::asio::buffer (req.to_string())); // read response std::stringstream rs; - char response[1024]; size_t l = 0; - do - { - l = s.read_some (boost::asio::buffer (response, 1024), ecode); - if (l) rs.write (response, l); - } - while (!ecode && l); + char recv_buf[1024]; size_t l = 0; + do { + l = s.read_some (boost::asio::buffer (recv_buf, sizeof(recv_buf)), ecode); + if (l) rs.write (recv_buf, l); + } while (!ecode && l); // process response - return i2p::util::http::GetHttpContent (rs); + std::string data = rs.str(); + i2p::http::HTTPRes res; + int len = res.parse(data); + if (len <= 0) { + LogPrint(eLogWarning, "Reseed: incomplete/broken response from ", url.host); + return ""; + } + data.erase(0, len); /* drop http headers from response */ + LogPrint(eLogDebug, "Reseed: got ", data.length(), " bytes of data from ", url.host); + if (res.is_chunked()) { + std::stringstream in(data), out; + if (!i2p::http::MergeChunkedResponse(in, out)) { + LogPrint(eLogWarning, "Reseed: failed to merge chunked response from ", url.host); + return ""; + } + LogPrint(eLogDebug, "Reseed: got ", data.length(), "(", out.tellg(), ") bytes of data from ", url.host); + data = out.str(); + } + return data; } else LogPrint (eLogError, "Reseed: SSL handshake failed: ", ecode.message ());