diff --git a/I2PTunnel.cpp b/I2PTunnel.cpp index b6cabd30..a33a536d 100644 --- a/I2PTunnel.cpp +++ b/I2PTunnel.cpp @@ -165,7 +165,7 @@ namespace client I2PTunnelConnectionHTTP::I2PTunnelConnectionHTTP (I2PService * owner, std::shared_ptr stream, std::shared_ptr socket, const boost::asio::ip::tcp::endpoint& target, const std::string& host): - I2PTunnelConnection (owner, stream, socket, target), m_HeaderSent (false) + I2PTunnelConnection (owner, stream, socket, target), m_Host (host), m_HeaderSent (false) { } @@ -174,10 +174,32 @@ namespace client if (m_HeaderSent) I2PTunnelConnection::Write (buf, len); else - { - m_Header.write ((const char *)buf, len); - I2PTunnelConnection::Write ((uint8_t *)m_Header.str ().c_str (), m_Header.str ().length ()); - m_HeaderSent = true; + { + m_InHeader.clear (); + m_InHeader.write ((const char *)buf, len); + std::string line; + bool endOfHeader = false; + while (!endOfHeader) + { + std::getline(m_InHeader, line); + if (!m_InHeader.fail ()) + { + if (line.find ("Host:") != std::string::npos) + m_OutHeader << "Host: " << m_Host << "\r\n"; + else + m_OutHeader << line << "\n"; + if (line == "\r") endOfHeader = true; + } + else + break; + } + + if (endOfHeader) + { + m_OutHeader << m_InHeader.str (); // data right after header + m_HeaderSent = true; + I2PTunnelConnection::Write ((uint8_t *)m_OutHeader.str ().c_str (), m_OutHeader.str ().length ()); + } } } diff --git a/I2PTunnel.h b/I2PTunnel.h index 127f5c4f..2071b89d 100644 --- a/I2PTunnel.h +++ b/I2PTunnel.h @@ -71,7 +71,8 @@ namespace client private: - std::stringstream m_Header; + std::string m_Host; + std::stringstream m_InHeader, m_OutHeader; bool m_HeaderSent; };