Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Category:

Н - надёжность

https://github.com/nodejs/node/issues/14994

Короче http.get в ноде приходится обмазывать 100500 хендлерами и трайкетчами. Потому что блядь. Если пытаешься передавать ему поломанный punycode в качестве имени хоста он его зачем-то пытается декодировать. В-общем что там происходит на самом деле, никому не известно. А по факту написать работающий http.get достаточно проблематично. Там не эйленберга-мура, там блядь пизда, заборы и коровники, мама!

Upd: у них в HTTP-клиенте есть внутренний нормализатор урлов - типа президент.рф/путин_вв HTTP-клиент сам переводит в punycode и процентики. God function pattern, чо. Ну и если ему подсунуть строку в пуникоде, да ещё и в малформед пуникоде - то в кишках есть специальная функция с фантастическим названием toASCII(), у которой если на входе малформед punycode и включен lenient mode - то на выходе внезапно юникод. А в HTTP-клиенте этот внутренний лениент моде неотключаем т.к. захардкожен. А потом этот юникод с выхода toASCII попадает в поле Host:, где его ловит валидатор заголовков HTTP где уникод не положен. И ессно не эррор файрит как на ошибку коннекта, а бросает исключение. И исключение это называется TypeError, поскольку они экономят идентификаторы подклассы исключений. И это исключение задокументировано, но не везде, а только в трёх местах, а пролазит оно в куче мест в результате. Кафка!

Upd2: после 20 сообщений с 5 разрабами выяснилось, что у них в кишках лигаси-парсер урлов используется. И если перед вызовом http.get вызывать не url.parse(), а new url.Url() и ловить исключение - то проблема воркараундится.
Tags: programming, все пидарасы а я
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 3 comments