diff --git a/HTTPProxy.cpp b/HTTPProxy.cpp
index f0166a4a..160c27f6 100644
--- a/HTTPProxy.cpp
+++ b/HTTPProxy.cpp
@@ -12,6 +12,7 @@
#include "ClientContext.h"
#include "I2PEndian.h"
#include "I2PTunnel.h"
+#include "Config.h"
namespace i2p
{
@@ -36,6 +37,7 @@ namespace proxy
void Terminate();
void AsyncSockRead();
void HTTPRequestFailed(/*std::string message*/);
+ void RedirectToJumpService();
void ExtractRequest();
bool ValidateHTTPRequest();
void HandleJumpServices();
@@ -95,6 +97,17 @@ namespace proxy
std::bind(&HTTPProxyHandler::SentHTTPFailed, shared_from_this(), std::placeholders::_1));
}
+ void HTTPProxyHandler::RedirectToJumpService(/*HTTPProxyHandler::errTypes error*/)
+ {
+ std::stringstream response;
+ std::string httpAddr; i2p::config::GetOption("http.address", httpAddr);
+ uint16_t httpPort; i2p::config::GetOption("http.port", httpPort);
+
+ response << "HTTP/1.1 302 Found\r\nLocation: http://" << httpAddr << ":" << httpPort << "/?jumpservices=&address=" << m_address << "\r\n\r\n";
+ boost::asio::async_write(*m_sock, boost::asio::buffer(response.str (),response.str ().length ()),
+ std::bind(&HTTPProxyHandler::SentHTTPFailed, shared_from_this(), std::placeholders::_1));
+ }
+
void HTTPProxyHandler::EnterState(HTTPProxyHandler::state nstate)
{
m_state = nstate;
@@ -168,6 +181,13 @@ namespace proxy
ExtractRequest(); //TODO: parse earlier
if (!ValidateHTTPRequest()) return false;
HandleJumpServices();
+
+ i2p::data::IdentHash identHash;
+ if (!i2p::client::context.GetAddressBook ().GetIdentHash (m_address, identHash)){
+ RedirectToJumpService();
+ return false;
+ }
+
m_request = m_method;
m_request.push_back(' ');
m_request += m_path;
diff --git a/HTTPServer.cpp b/HTTPServer.cpp
index 3b92d4bc..b0281692 100644
--- a/HTTPServer.cpp
+++ b/HTTPServer.cpp
@@ -203,6 +203,9 @@ namespace util
const char HTTP_COMMAND_SAM_SESSION[] = "sam_session";
const char HTTP_PARAM_SAM_SESSION_ID[] = "id";
const char HTTP_COMMAND_I2P_TUNNELS[] = "i2p_tunnels";
+ const char HTTP_COMMAND_JUMPSERVICES[] = "jumpservices=";
+ const char HTTP_PARAM_ADDRESS[] = "address";
+
namespace misc_strings
{
@@ -393,6 +396,7 @@ namespace util
else
s << "Start accepting tunnels
\r\n
\r\n";
s << "Run peer test
\r\n
\r\n";
+ s << "Jump services
\r\n
\r\n";
s << "