Vort
[16:22:41] <tetrimer> type = client
Vort
[22:22:48] <tetrimer> На входе в i2pd http туннель
Vort
это разные вещи
Vort
в http баг, недавно обсуждали. в обычном пробросе портов бага быть не должно
Vort
если type=client, то в httpproxy ловить проблему смысла нету
Vort
если type=httpproxy, то её не ловить надо, а чинить
tetrimer
На одной из машин вылезла какая-то грабля при запуске i2pd:
tetrimer
"unrecognised option 'ssu2.bandwidth'"
tetrimer
Оказалось, что секции [ssu2] надо располагать ниже "основного конфига". Кто бы мог подумать и как оно работало до этого? :)
orignal
так если client то все передается как есть
orignal
так формат ini такой
orignal
снчала перечисляются просто поля потом уже секции
orignal
почему ini? потому что я старый замшелый пень )))
tetrimer
Vort: > если type=client, то в httpproxy ловить проблему смысла нету
tetrimer
Ну да, поэтому за полдня ничего и не поймалось...
tetrimer
Вроде бы отчасти помогла смена типа серверной стороны с http на server.
orignal
так я же тебя спрашивал
orignal
где проблема
tetrimer
Ну, видимо я плохо объяснил. :(
orignal
лови то же самое в серверном тоннеле если типа http
tetrimer
libi2pd_client/I2PService.cpp ?
orignal
I2Tuneel.cpp
orignal
счас покажу строчку
orignal
вот перед этой печтать
tetrimer
Выводить m_OutHeader или m_OutHeader.str ?
orignal
m_OutHeader.str ()
tetrimer
Ok.
orignal
m_OutHeader это э stringstream
orignal
это не строка
orignal
ну и если увидишь проблему все делается в этой функции
Vort
хочу сказать одну вещь. хоть скорее всего это и не при чём
Vort
в C++ есть специальная обработка для переводов строк 0a / 0d0a
Vort
и если не знать об этих особенностях можно запросто получить лишний символ где не надо
Vort
чтобы такого не было надо внимательно следить за бинарными/текстовыми режимами
orignal
это только касается gets и текстовых файлов
Vort
ну и для HTTP там должен быть однозначно только один из видов перевода строк. смешивать там нельзя
orignal
а вот это интересно
orignal
возмоджно я смешиваю
Vort
"HTTP/1.1 defines the sequence CR LF as the end-of-line marker for all protocol elements except the entity-body"
Vort
то есть, CR LF всегда и независимо от ОС
orignal
ну вот я так и делаю в коде
Vort
tetrimer: всегда ли в "нормальных" дампах перевод строки - 0d0a или где-то есть одинокие 0a ?
Vort
orignal: если печатать строку в лог, печаталка в лог не поменяет ли случаем 0a на 0d0a ?
Vort
мне кажется, что если печатать, то в хекс варианте
orignal
не знаю
orignal
возможно
tetrimer
Vort: Вот те, что я смотрел - исправно идут парами.
tetrimer
Но там проблема-то не в этом, а в том, что на каком-то этапе вдруг в середину строки с данными попадает одинокий символ 0x0a, что и работает, как перевод строки.
Vort
то есть, везде и всегда 0d 0a кроме одного багованного случая когда влазит одинокий 0a ?
Vort
и вот этот попадающий в средину символ он забивает какой-то другой символ или как бы "раздвигает" строку?
tetrimer
Раздвигает строку...
Vort
интересный эффект
Vort
то есть, ни дублирования ни исчезновения символов нету?
tetrimer
Вот так примерно это выглядит:
tetrimer
accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.
tetrimer
7
tetrimer
И вот строка в hex: "3d30 2e38 2c65 6e3b 713d 302e 0a37 0d0a =0.8,en;q=0..7.."
Vort
если туннели делать чисто client и server, без http и httpproxy - такое тоже возникает? (правда, я не уверен, что правильно спрашиваю)
tetrimer
Потом идет:
tetrimer
Connection: close
tetrimer
X-I2P-DestB32:
tetrimer
Ну и так далее...
tetrimer
Нет, я сегодня сменил с http на server - эффект пропал.
Vort
эффект? баг исчез то есть?
tetrimer
Ну, IIS сразу перестал давать 400-ю ошибку, скорее всего и баг исчез.
tetrimer
На днях, если будет время - на тестовой машинке попробую воспроизвести с печатью отладки...
tetrimer
До этого - пробовали переводить трафик минуя i2pd туннели - тоже не было ошибки "HTTP Error 400. The request has an invalid header name".
tetrimer
Вот еще строчка:
tetrimer
1. accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,e
tetrimer
2. n;q=0.7
Vort
да похоже разбитый на кусочки хедер i2pd нормально не скеливает
Vort
а разбитый он потому что длинный
Vort
а у других юзеров не вылазило потому что длинный - это редкость
tetrimer
Ну да, проблема вылезла почти через год после начала эксплуатации этой схемы...
Vort
тут похоже опять загадка вида "и почему оно вообще работало?"
tetrimer
:)
tetrimer
Хотя максимальный размер хидеров - 8 килобайт. Не должно оно фрагментироваться-то...
whothefuckami
Vort: не особо слежу за этим чатом. Вы фрагментацию памяти победили?
Vort
нет, тут http обработка где-то в i2pd глючит
Vort
когда жирные заголовки, то портит данные. ну похоже на то точнее
orignal
tetrimer распечатай как 0ч
orignal
0x
orignal
Vort еще раз
tetrimer
Кого распечатать? Последний пример?
orignal
одна строка заголовка в разных блках
Vort
orignal: теоретически, ситуация, когда хедер приходит несколькими кусками, должна работать нормально?
Vort
я вот смотрю на m_InHeader.clear (); в I2PServerTunnelConnectionHTTP::Write и что-то ничего не понимаю (
Vort
ну это я туплю, понятно. но код какой-то загадочный всё таки
orignal
sprintf (str, "%02x ", s[i]);
orignal
должна но я проверю
orignal
попозже
tetrimer
orignal: >одна строка заголовка в разных блках
tetrimer
Вот это как понять? В tcpdump есть пакеты, есть заголовки (которые он расшифровывает). Блоков - нету.
orignal
такое да возможно
orignal
в одном пакете пришла половина строки а в вторая в след
tetrimer
Насколько я смотрел - они в одном пакете уходят в туннель и выходят из него. Т.е. я не вижу фрагментов в разных TCP пакетах.
orignal
Vort да похоже так и есть
orignal
std::getline(m_InHeader, line);
tetrimer
Правда однозначно идентифицировать, что вот он - входящий, и вот он же - исходящий - я пока не могу.
orignal
а не прочиталось и хуй с ним
orignal
дальше чистим
orignal
m_InHeader.clear ();
orignal
так что Vort правильно диагностирвоал проблему
orignal
буду чинить
tetrimer
Я настолько не умею код с листа читать. :)
orignal
ну так это то мой код
orignal
правда старый ))
tetrimer
Я на сегодня сворачиваюсь. Если что потестить - пишите, я у майоров вечером почитаю...
orignal
сегодня вряд ли