URLLIB3 – популярная библиотека клиента HTTP в Python, для которой я был сопровождающим в течение последних 2 лет. Несколько месяцев назад были поддержаны сопровождающие Urllib3 Gitcoin с Грант возможности Для финансируемой работы на Urllib3. В этом посту я буду документировать работу, которую я закончил в результате этого гранта.
Квентин Прадет Также писал о своем опыте работы по тому же гранту. Проверьте свой блог здесь Отказ 🎉
Я сосредоточил свои усилия по развитию на URL-анализате Urllib3, который был недавно обновлен для совместимого на RFC 3986 с RFC3986
упаковка.
Оказывается, что пакет слишком тяжелый для платформ с меньшим количеством процессорных процессоров и ресурсов памяти, таких как Raspberry Pi, и время импорта пострадали из-за количества регулярных разборки экспрессии в пределах RFC3986
Отказ Эффекты, вызванные Urllib3
взять 800 мс для импорта вместо 250 мс Отказ
Я читаю RFC и с выяснением, какие компоненты пакета нам нужны, и повторно реализовали их проще, и с меньшими сложными регулярными выражениями, чтобы избежать дорогой компиляции, по-прежнему поддерживая уровень правильности, необходимого для обеспечения безопасного анализатора URL Отказ
Оказывается, нам не нужно строго разбирать имя пользователя
, пароль
, путь
, запрос
или Фрагмент
Компоненты, вместо этого мы разделяемся на разделителях компонентов, а затем проценты кодируют все недопустимые символы в компоненте, поскольку все вышеуказанные компоненты принимают процентные закодированные значения.
В основном единственные компоненты, которые мы строго разбираем, являются схема, хост и порт. Все остальные компоненты, которые мы принимаем символы, которые передаются в Urllib3 и процента, кодируют их, чтобы избежать атак CRLF-впрыскивания и атак на основе Unicode, которые первоначально употребляют разработку анализатора URL-анализатора RFC 3986 для URLLIB3.
Это позволяет нам продолжать поддерживать «технически» неправильные URL-адреса безопасным способом, что приводит к лучшему удобству использования, пока все еще безопасны. К сожалению, хозяин
Компонент является самым сложным и до сих пор нужна некоторая работа для меня, чтобы быть полностью счастливыми с этим.
Второе незначительное открытие, которое я сделал, это то, что наши ConnectionPool.request ()
Метод не применял одну и ту же диабаусную логию URL, как верхний уровень Poolmanager.request ()
И так будет несовместимо. Я добавил логику в ConnectionPool.request ()
для относительных URL.
Список запросов по тяги в результате гранта:
Работа, которую я сделал в результате этого гранта, вдохновил меня начать работу над анализатором URL под названием IRL
Специально нацелены на простоту, правильность, удобство использования и интерфейс, который поддается использование клиентов HTTP.
Я хотел бы поблагодарить всех, кто пожертвовал средства в Gitcoin для поддержки моей работы по этому гранту. ❤ ️
Оригинал: “https://dev.to/sethmlarson/sponsored-work-on-urllib3-5aip”