333.i2p

Форум, посвященный разработке и поддержке i2pd
Серверный HTTP туннель и клиентский SOCKS прокси « Книга жалоб и предложений « Разработка i2pd
 
Sat, 28 May 2022, 03:19pm #1
Люк
Участник
Registered: May 2022
Последний раз: Tue, 07 Jun 2022
Сообщения: 4

Выяснили, что когда клиент заходит на сайт через socks прокси, на некоторых запросах серверный роутер не проставляет заголовки HTTP_X_I2P_DESTB32.

Я провел эксперимент на i2pd 2.42.1. Что выяснил: когда клиент сидит через socks прокси, на некоторых запросах не проставляется b32. На моем сервере из 75 запрсов только 6 содержали b32. Предположу, что проблема возникает из-за http keep-alive. Когда несколько запросов приходят через одно соединение, i2pd на сервере проставляет HTTP_X_I2P_***-заголовки только в первом запросе, в последующие не проставляет.

Offline
Sat, 28 May 2022, 03:47pm #2
Люк
Участник
Registered: May 2022
Последний раз: Tue, 07 Jun 2022
Сообщения: 4

Как я понял, этот код обрабатывает входящие соединения? Получается, что здесь один раз обрабатывается заголовок с добавлением X_I2P_DEST_B32, X_I2P_DEST_HASH, X_I2P_DEST_B64, а все, что идет дальше, передается как есть. Не учитвается возможный http keep-alive. Если дальше идет новый http заголовок, то он будет передан в неизменном виде. Тут можно даже подменить X_I2P_DEST_B32, X_I2P_DEST_HASH, X_I2P_DEST_B64. Я правильно понял?

void I2PServerTunnelConnectionHTTP::Write (const uint8_t * buf, size_t len)
{
if (m_HeaderSent)
I2PTunnelConnection::Write (buf, len);
else
{
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 == "\r") endOfHeader = true;
else
{
if (m_Host.length () > 0 && !line.compare(0, 5, "Host:"))
m_OutHeader << "Host: " << m_Host << "\r\n"; // override host
else
m_OutHeader << line << "\n";
}
}
else
break;
}

if (endOfHeader)
{
// add X-I2P fields
if (m_From)
{
m_OutHeader << X_I2P_DEST_B32 << ": " << context.GetAddressBook ().ToAddress(m_From->GetIdentHash ()) << "\r\n";
m_OutHeader << X_I2P_DEST_HASH << ": " << m_From->GetIdentHash ().ToBase64 () << "\r\n";
m_OutHeader << X_I2P_DEST_B64 << ": " << m_From->ToBase64 () << "\r\n";
}

m_OutHeader << "\r\n"; // end of header
m_OutHeader << m_InHeader.str ().substr (m_InHeader.tellg ()); // data right after header
m_InHeader.str ("");
m_From = nullptr;
m_HeaderSent = true;
I2PTunnelConnection::Write ((uint8_t *)m_OutHeader.str ().c_str (), m_OutHeader.str ().length ());
}
}
}

Offline
Sat, 28 May 2022, 06:08pm #3
orignal
Директор
Wlm
Registered: February 2016
Последний раз: день назад
Сообщения: 209

>Когда несколько запросов приходят через одно соединение, i2pd на сервере проставляет HTTP_X_I2P_***-заголовки только в первом запросе, в последующие не проставляет.

Через одно соединение должен проходить только один запрос, возможно фрагментированный. Разумеется добавляются только для первого.

>Не учитвается возможный http keep-alive

Считалось что в I2P он не используется. Возможно что то изменилось, надо спросить.

Last edited: Sat, 28 May 2022, 06:15pm от orignal

Offline