diff --git a/AddressBook.cpp b/AddressBook.cpp index c6a06490..b508e01e 100644 --- a/AddressBook.cpp +++ b/AddressBook.cpp @@ -33,18 +33,13 @@ const IdentHash * AddressBook::FindAddress (const std::string& address) void AddressBook::LoadHostsFromI2P () { std::string content; - - std::stringstream url_ss; - // TODO: hosts link in config - // TODO: url download via HTTPProxy - url_ss << "http://127.0.0.1:" << i2p::util::config::GetArg("-httpport", 7070) << "/udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna/hosts.txt"; while (true) { - content = i2p::util::http::httpRequest(url_ss.str()); - - // TODO: check http errors - if (! boost::starts_with(content, "") && content.size() > 0) - break; + // TODO: hosts link in config + int http_code = i2p::util::http::httpRequestViaI2pProxy("http://udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p/hosts.txt", content); + if (http_code ==200) + if (!boost::starts_with(content, "") && !content.empty()) // TODO: test and remove + break; std::this_thread::sleep_for(std::chrono::seconds(5)); } diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 0900ecee..961acbb1 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -133,7 +133,7 @@ namespace util case 500: buffers.push_back(boost::asio::buffer("HTTP/1.0 500 Internal Server Error\r\n")); break; case 502: buffers.push_back(boost::asio::buffer("HTTP/1.0 502 Bad Gateway\r\n")); break; case 503: buffers.push_back(boost::asio::buffer("HTTP/1.0 503 Not Implemented\r\n")); break; - case 504: buffers.push_back(boost::asio::buffer("HTTP/1.0 504 Gateway Timeou\r\n")); break; + case 504: buffers.push_back(boost::asio::buffer("HTTP/1.0 504 Gateway Timeout\r\n")); break; default: buffers.push_back(boost::asio::buffer("HTTP/1.0 200 OK\r\n")); } diff --git a/util.cpp b/util.cpp index e7e4af04..3fd60ca1 100644 --- a/util.cpp +++ b/util.cpp @@ -248,6 +248,65 @@ namespace http return ""; } } + + int httpRequestViaI2pProxy(const std::string& address, std::string &content) + { + content = ""; + try + { + boost::asio::ip::tcp::iostream site; + // please don't uncomment following line because it's not compatible with boost 1.46 + // 1.46 is default boost for Ubuntu 12.04 LTS + //site.expires_from_now (boost::posix_time::seconds(30)); + { + std::stringstream ss; ss << i2p::util::config::GetArg("-httpproxyport", 4446); + site.connect("127.0.0.1", ss.str()); + } + if (site) + { + i2p::util::http::url u(address); + std::stringstream ss; + ss << "GET " << address << " HTTP/1.0" << std::endl; + ss << "Host: " << u.host_ << std::endl; + ss << "Accept: */*" << std::endl; + ss << "User - Agent: Wget / 1.11.4" << std::endl; + ss << "Connection: close" << std::endl; + ss << std::endl; + site << ss.str(); + + // read response + std::string version, statusMessage; + site >> version; // HTTP version + int status; + site >> status; // status + std::getline(site, statusMessage); + if (status == 200) // OK + { + std::string header; + while (std::getline(site, header) && header != "\r"){} + std::stringstream ss; + ss << site.rdbuf(); + content = ss.str(); + return status; + } + else + { + LogPrint("HTTP response ", status); + return status; + } + } + else + { + LogPrint("Can't connect to proxy"); + return 408; + } + } + catch (std::exception& ex) + { + LogPrint("Failed to download ", address, " : ", ex.what()); + return 408; + } + } url::url(const std::string& url_s) { diff --git a/util.h b/util.h index 09123f70..8b335648 100644 --- a/util.h +++ b/util.h @@ -35,6 +35,8 @@ namespace util namespace http { std::string httpRequest(const std::string& address); + int httpRequestViaI2pProxy(const std::string& address, std::string &content); // return http code + struct url { url(const std::string& url_s); // omitted copy, ==, accessors, ... private: