From 09fd0baf7885acd02c5d107bca79f72f672438e2 Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 3 Jun 2015 12:30:15 -0400 Subject: [PATCH] replace Host: for server http tunnels --- I2PTunnel.cpp | 32 +++++++++++++++++++++++++++----- I2PTunnel.h | 3 ++- 2 files changed, 29 insertions(+), 6 deletions(-) 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; };