Когда жить интересно, время летит незаметно. 20 марта curl исполнилось 25 лет.
Проект curl начался очень скромно: это был небольшой переименованный инструмент передачи URL, о котором почти никто не знал в первые годы его существования.
▍ Я в то время
Я создал самый первый релиз curl, и с тех пор выпускал пакеты каждого нового релиза. В день, когда я впервые выпустил curl, мне было 27 лет, я работал разработчиком ПО в Frontec Tekniksystem, где в основном занимался разработкой встроенных систем для более крупных шведских компаний-разработчиков. Например, в течение нескольких лет в конце 90-х я работал над довольно большим количеством проектов для телекоммуникационного гиганта Ericsson.
Мне нравились программирование и разработка с тех пор, как в середине 80-х у меня появился первый компьютер. В 1990-х у меня уже был устоявшийся ежедневный график: когда моя вторая половина ложилась спать, я продолжал бодрствовать, час-два занимаясь разработкой. По сути, именно так мне удавалось находить время для своих проектов в первые несколько десятков лет. Меньше сна. Меньше других дел.
▍ Постепенное и постоянное улучшение
В основе разработки curl всегда лежала концепция постепенного итеративного улучшения всех его аспектов. Сохранить поведение, но улучшать код, добавлять тестовые случаи, совершенствовать документацию. Раз за разом, год за годом. Этот процесс никогда не останавливается.
Точно так же нельзя назвать конкретного внезапного момента, когда curl стал популярным и количество пользователей взлетело до небес. Количество пользователей и популярность инструмента и библиотеки росли постепенно и непрерывно. В 1998 году у curl было несколько пользователей. К 2010 году их стало сотни миллионов.
На самом деле мы понятия не имеем, сколько пользователей или установок у libcurl на данный момент. Легко прикинуть, что она работает в более чем в десяти миллиардах установок, просто исходя их того факта, что в мире 7 миллиардов смартфонов и 1 миллиард планшетов, и мы знаем, что в каждом из них есть как минимум одна, но, скорее, гораздо больше установок curl.
▍ До curl
Моя эпопея с передачей данных по интернету началась в конце 1996 года, когда я скачал httpget 0.1 для автоматического скачивания ежедневных курсов валют, чтобы мой конвертер курсов валют для IRC-бота работал правильно. httpget имел некоторые недостатки, поэтому я отправил исправления, однако автор утилиты Рафаэль быстро решил, что пусть лучше я займусь поддержкой проекта. Так я и поступил.
Я добавил поддержку GOPHER, изменил название проекта, добавил поддержку FTP, а в начале 1998 года начал добавлять и поддержку загрузки на FTP.
▍ 1998 год
Первый логотип curl
20 марта 1998 года был выпущен curl 4.0. В его день рождения проект содержал уже 2,2 тысячи строк кода, потому что был построен на основе проектов, ранее называвшихся httpget и urlget. Тогда он поддерживал три протокола: HTTP, GOPHER и FTP и имел 24 великолепные опции командной строки.
Первый релиз curl не стал каким-то особым событием, потому что я уже больше года выпускал релизы httpget и urlget, поэтому, несмотря на смену имени, это был всего лишь «ещё один релиз», какие я уже много раз делал.
В первый год curl мы уже добавили поддержку HTTPS и TELNET, а также первую страницу man curl. Изначально curl имел лицензию GPL, но в его первый календарный год (1998) я поменял её на MPL.
Первая поддержка SSL была реализована при помощи SSLeay. Позже в том же году проект перешёл на зарождающийся OpenSSL.
В августе 1998 года мы добавили curl на сайт-каталог опенсорсных проектов freshmeat.net.
Первая веб-страница curl была опубликована на
http://www.fts.frontec.se/~dast
(самая старая версия, архивированная Wayback Machine, датируется декабрём 1998 года).В ноябре 1998 года я добавил на веб-сайт заметку о потрясающем успехе: последний релиз скачали 300 раз за месяц! Успех и популярность были далеко не мгновенными.
За этот первый год мы выпустили 20 релизов curl. С тех пор этого достижения мы так и не повторили.
▍ 1999 год
Мы создали первый скрипт конфигурирования, добавили поддержку куки и появились в виде пакета в Debian Linux.
Веб-сайт curl переехал на
http://curl.haxx.nu
.В течение этого года мы добавили поддержку DICT, LDAP и FILE. Теперь проект поддерживал 8 протоколов.
В последние дни 1999 года мы импортировали код curl на новый крутой сервис под названием Sourceforge. Весь дальнейший отсчёт коммитов в curl начинается с этого импорта. 29 декабря 1999 года.
▍ 2000 год
В начале 2000 года я скрытно сменил место работы, но продолжил заниматься подрядной разработкой встроенных систем.
Правила домена верхнего уровня
.se
изменились и мы переместили веб-сайт curl на curl.haxx.se
.Я женился.
В августе 2000 года мы выпустили curl 7.1, и многое изменилось. В этом релизе мы представили библиотеку, которую решили назвать libcurl, потому что не смогли придумать названия получше. На этом этапе проект состоял из 17,2 тысячи строк кода.
Источником вдохновения для libcurl API стало то, как работает
fopen()
, возвращая непрозрачный идентификатор, и как ioctl()
можно использовать для задания опций.Идея создания библиотеки из curl присутствовала у меня почти с самого начала, потому что я уже осознал ту мощь, которую хорошая библиотека может дать приложениям.
Был отправлен первый CVE для curl.
Пользователи признали библиотеку полезной, популярность curl увеличилась. Одним из первых проектов, начавших использовать libcurl, стал язык PHP, разработчики которого решили применять библиотеку в качестве движка передачи HTTP/URL по умолчанию.
Мы создали первый набор тестов.
▍ 2001 год
Мы изменили лицензию curl и начали распространять его под новой лицензией curl (по сути, MIT), а также MPL. Идея слегка изменить лицензию curl была безумной, но причина этого уже была забыта.
Мы добавили поддержку HTTP/1.1 и IPv6.
В июне файл THANKS содержал имена 67 контрибьюторов. Над проектом начала работать целая команда. В марте мы преодолели планку в 1100 коммитов, а в июле curl содержал 20 тысяч строк.
Apple начала поставлять curl в составе Mac OS X: curl 7.7.2 был выпущен в Mac OS X 10.1.
▍ 2002 год
Набор тестов содержит 79 тестовых случаев.
Мы отказались от лицензии MPL. Больше мы никогда не будем играть в смену лицензий.
Мы добавили поддержку сжатия gzip по HTTP и научили пользоваться прокси SOCKS.
▍ 2003 год
Добавлена система «автосборки» curl: волонтёры выполняют на своих машинах скрипты, которые часто скачивают, собирают и выполняют тесты curl, отправляя результаты по электронной почте на наш центральный сервер для отчётности и анализа. Это было задолго до того, как современные системы CI существенно всё упростили.
Мы добавили аутентификацию Digest, NTLM и Negotiate для HTTP.
В августе у нас было 40 отдельных страниц man.
Добавлена поддержка FTPS, протокол номер 9.
Родился мой первый ребёнок, дочь Агнес.
Я форкнул проект ares и запустил проект c-ares для создания и поддержки библиотеки, выполняющей асинхронный ресолвинг имён для curl и других программ. С тех пор этот проект тоже стал довольно популярным и широко используемым.
▍ 2004 год
В начале 2003 года curl состоял из 32,7 тысяч строк кода.
Мы добавили в curl поддержку «больших файлов», что в то время означало поддержку файлов больше 2 и 4 гигабайтов.
Реализована поддержка IDN, International Domain Names.
▍ 2005 год
GnuTLS стала второй поддерживаемой библиотекой TLS. Пользователи теперь могли выбирать, какую библиотеку TLS должна использовать их сборка.
Благодаря гранту шведского Internetfonden, я взял на работе отпуск за свой счёт и смог реализовать первую версию multi_socket() API, позволяющего быстрее выполнять больше параллельных передач.
Был создан git, разработчики почти сразу начали использовать curl для передачи по HTTP(S).
TFTP стал десятым протоколом, поддерживаемым curl.
▍ 2006 год
Мы решили отказаться от поддержки «сторонних передач по FTP», что заставило нас выполнять bumping SONAME из-за модифицированного ABI. Это самый последний такой бамп. Он вызывал проблемы с аргументами. Мы узнали, насколько неудобен bumping SONAME может быть для пользователей.
Предшественница wolfSSL под названием cyassl стала третьей библиотекой SSL, поддерживаемой curl.
Мы добавили поддержку HTTP/1.1 Pipelining, а во второй половине года я устроился на подрядную работу для Adobe и добавил поддержку SCP и SFTP.
В рамках работы над SCP и SFTP я сделал довольно серьёзный шаг и стал мейнтейнером проекта libssh2. Этот проект тоже довольно широко используется.
У меня появился второй ребёнок, сын Рекс.
▍ 2007 год
51,5 тысячи строк кода, добавлена поддержка четвёртой библиотеки SSL: NSS
Мы добавили поддержку LDAPS и смёрджили первый порт на OS/400.
Для curl 7.16.1 мы добавили поддержку
--libcurl
. Наверно, это моя самая любимая опция командной строки curl. Она добавляется к любой команде curl, позволяя выводить код на C, используемый libcurl для указанной опции.В апреле curl имел 348 тестовых случаев.
▍ 2008 год
К этом времени инструмент командной строки разросся до 126 опций командной строки. Пятикратный рост за первые десять лет curl.
В марте мы преодолели планку в 10 тысяч коммитов.
Я присоединился к списку рассылки рабочей группы httpbis и постепенно начал активно участвовать в IETF в работе над протоколом HTTP.
В составе Solaris поставляются curl и libcurl. Adobe Flash Player в Linux использует libcurl.
В сентябре общее количество контрибьюторов curl достигло 654 человек.
▍ 2009 год
На шоу FLOSS Weekly 51 я впервые рассказывал о curl в подкасте.
Мы добавили поддержку сборки curl при помощи cmake. До сих пор вызывает споры и обсуждения, действительно ли это решение помогло нам. И чтобы завершить круг, нужно сказать, что сам cmake использует libcurl.
В июле в моём родном Стокгольме проводилась конференция IETF 75, и тогда я впервые лично встретил многих своих личных героев-разработчиков протоколов, создавших HTTP и продолжавших работать над ним: Марка, Роя, Ларри, Джулиана и так далее.
В августе я уволился с работы, чтобы работать на собственную компанию Haxx, но всё равно продолжая выполнять подрядную работу. Тогда я в основном занимался встроенным Linux.
Благодаря ещё одному подряду, я добавил в curl поддержку IMAP(S), SMTP(S) and POP3(S), увеличив количество поддерживаемых протоколов до 19.
За мою работу над curl, c-ares и libssh2 меня наградили Nordic Free Software Award 2009.
▍ 2010 год
Мы добавили поддержку RTSP и RTMP(S).
PolarSSL стала шестой поддерживаемой библиотекой SSL.
Мы сменили систему контроля версий с CVS на git и в то же время сменили хостинг с Sourceforge на GitHub. С этого момента мы отслеживаем авторство коммитов правильно, в CVS это было делать гораздо сложнее.
Добавлена поддержка библиотеки AxTLS (седьмой).
▍ 2011 год
Больше 80 тысяч строк кода.
Выпущен cookie RFC 6265. Я участвовал в этом и внёс небольшой вклад.
Мы представили скрипт
checksrc
, проверяющий, соответствует ли исходный код стилю оформления кода curl. Изначально он был простым, однако со временем улучшился и стал строже.Я получил от Google купоны в благодарность за развитие опенсорса, что позволило мне разжиться футболками Google.
Мы превзошли планку в 100 разработчиков, создающих коммиты.
▍ 2012 год
149 опций командной строки.
Добавлена поддержка Schannel and Secure Transport для TLS.
Когда я попытался из тщеславия подсчитать количество пользователей curl, то получил примерную оценку в 550 миллионов. Тогда я практически впервые осознал, что curl используют везде!
На протяжении всего 2012 года было 67 авторов коммитов.
▍ 2013 год
Добавлена поддержка GSKit — библиотеки TLS, в основном используемой в OS/400. Десятая поддерживаемая библиотека TLS.
В апреле количество контрибьюторов перевалило за тысячу и мы перешагнули черту в 800 тестовых случаев.
Мы отрефакторили внутреннее устройство проекта, чтобы части кода были неблокируемыми. Также мы создали простой интерфейс, являющийся простой обёрткой для множественной передачи.
Смёрджены первые попытки поддержки HTTP/2 (на основе отличной библиотеки nghttp2), а также поддержка выполнения соединений при помощи Happy Eyeballs.
Мы создали первые две задачи CI.
▍ 2014 год
Удалённо из своего дома в Швеции я начал работать на Mozilla в команде сетевого кода Firefox. Впервые за всю свою карьеру я работал в основном с сетью и HTTP, и моя работа сильно пересекалась с тем, что делает curl. До этого момента две стороны моей жизни были странным образом разделены. Mozilla позволила мне в рабочие часы трудиться над curl.
161 опций командной строки и 20 отчётов о CVE.
В июле 59 страниц man разрослись до 270 страниц man, когда каждая опция libcurl получила собственную страницу.
Мы добавили поддержку форка OpenSSL под названием libressl OpenSSL и убрали поддержку QsoSSL. По-прежнему десять поддерживаемых библиотек TLS.
В сентябре проект содержал 105 тысяч строк кода.
Добавлена поддержка SMB(S). 24 протокола.
▍ 2015 год
Добавлена поддержка BoringSSL и mbedTLS.
Появилась поддержка мультиплексированной передачи при помощи HTTP/2. Довольно серьёзная смена парадигмы в архитектуре, внезапно множественные передачи используют общее соединение. Много рефакторинга: чтобы поддержка HTTP/2 стала стабильной, потребовалось много времени.
За этим последовала наша первая поддержка HTTP/2 server push.
Мы полностью переключились на рабочую модель GitHub, используя issue tracker и выполняя пул-реквесты.
В мае опубликован первый HTTP/2 RFC. Мне хочется думать, что я внёс свой небольшой вклад в труд создававшей его рабочей группы.
Моя работа над HTTP/2 в этом году частично спонсировалась Netflix, было сложно выполнять её, по-прежнему работая на Mozilla.
20 тысяч коммитов.
Я начал писать руководство everything curl.
Также добавлена поддержка libpsl с использованием Public Suffix List для улучшения обработки куки.
▍ 2016 год
curl начал по умолчанию использовать HTTP/2 для HTTPS-передач.
В мае у curl стало уже 185 опций командной строки.
У нас появился новый логотип, который используется сейчас. Его дизайн разработан Эдрианом Бурсеа из Soft Dreams.
Добавлена поддержка прокси HTTPS и TLS 1.3.
Компанией Cure 53 был выполнен аудит безопасности curl.
Благодаря моей работе над curl, шведский технологический сайт присвоил мне второе место в списке лучших разработчиков Швеции.
В конце года в проекте 115,5 тысячи строк кода.
▍ 2017 год
curl получил поддержку сборки с несколькими библиотеками TLS. Выбор их использования выполняется при запуске.
Со мной связалась Fastly, любезно и щедро предложив хостить веб-сайт curl, а также мой личный веб-сайт. Эта помощь положила конец нестабильности, когда посты в моём блоге становились слишком популярными и сайт этого не выдерживал. Теперь сайт curl стал более доступным для людей со всего света. С тех пор компания остаётся преданным спонсором проекта.
Весной 2017 года мы провели первую конференцию разработчиков curl up: более двадцати фанатов и разработчиков curl приехали в Нюрнберг, чтобы в эти выходные не заниматься ничем, кроме curl.
В июне мне было отказано во въезде в США. Это привело к длительному и мучительному получению визы США.
Появилась первая поддержка SSLKEYLOGFILE, мы добавили новый MIME API и поддержку сжатия brotli.
Проект curl был принят в проект OSS-Fuzz, который сразу же начал указывать на ошибки в нашем коде. С тех мы постоянно выполняем фаззинг curl.
В октябре меня наградили премией Polhem, самой старой и, вероятно, самой престижной наградой Швеции за инженерию. Эта премия была учреждена в 1876 году. Это медаль из чистого золота, вручённая мне никем иным, как его величеством королём Швеции. На медали даже выгравировано моё имя.
▍ 2018 год
Добавлена поддержка DNS через HTTPS и появился новый URL API, позволяющий приложениям парсить URL точно так же, как это делает curl.
Я поучаствовал в подкасте Changelog, где рассказывал о curl, которому исполнялось уже 20 лет.
Microsoft начала поставлять curl в комплекте Windows. Однако curl alias сохранился.
Мы добавили поддержку второй библиотеки SSH, поэтому теперь SCP и SFTP могли работать с libssh в дополнение к уже поддерживаемой библиотеке libssh2.
Мы добавили поддержку MesaLink, однако отказались от поддержки AxTLS. Теперь библиотек TLS стало 12.
129 тысяч строк кода. Достигли 10000 звёзд в GitHub.
Чтобы получать пожертвования, мы должны были создать учётную запись Open Collective, что мы и сделали. С тех пор это стало хорошим каналом для получения пожертвования и спонсорской помощи проекту.
В ноябре 2018 года было решено, что протокол HTTP-over-QUIC должен официально стать HTTP/3.
В конце года у нас уже есть 27 задач CI. Выполняется более 1200 тестовых случаев.
▍ 2019 год
Я начал работать над wolfSSL, занимаясь curl в рабочее время. Чтобы сделать curl моей основной работой, понадобился всего 21 год.
Мы добавили поддержку Alt-Svc и удалили поддержку всегда такого проблематичного HTTP/1.1 Pipelining.
Мы внедрили нашу первую программу баг-баунти curl и, по сути, с тех пор продолжаем заниматься ею совместно с hackerone. Мы заплатили почти 50 тысяч долларов за 45 уязвимостей (на февраль 2023 года).
Добавлена поддержка AmiSSL и BearSSL: стало 14 библиотек.
Мы смёрджили поддержку HTTP/3 на основе библиотеки quiche, а чуть позже и на основе второй библиотеки: ngtcp2. Потому что почему бы не сделать много бэкендов?
Мы начали распространять curl в «официальном» образе docker.
▍ 2020 год
Инструмент curl получил мощь параллельной передачи и способность выводить данные в формате JSON при помощи опции
-w
. Был подчищен пугающий вывод --help
и его упорядочили в более удобные подкатегории.В марте я начал создавать идущие в прямой трансляции видеопрезентации релизов, начиная с curl 7.69.0.
Веб-сайт curl переехал на
curl.se
, а everything curl переехал на домен curl.dev
.MQTT стал 25-м поддерживаемым протоколом.
Добавлена первая поддержка HSTS, а также поддержка сжатия zstd.
wolfSSH стала третьей поддерживаемой библиотекой SSH.
Мы убрали поддержку PolarSSL.
Первая версия поддержки hyper как альтернативного бэкенда для HTTP/1 и HTTP/2.
В ноябре, посреди эпидемии Covid, я наконец получил визу США.
Перед самым концом года была создана 90-я задача CI.
▍ 2021 год
Убрана поддержка MesaLink, однако добавлена поддержка rustls. 13 библиотек TLS.
Ingenuity приземлился на Марсе, а curl помог ему в этом.
Получил очень неприятное электронное письмо с угрозами убийства от кого-то очень сбитого с толку. Он обвинял меня во всём плохом, что с ним произошло.
Добрались до 20 000 звёзд на GitHub.
Поддержка GOPHERS. 26 протоколов.
187 человек создали коммиты, которые были смёрджены в течение года.
▍ 2022 год
Смерджена первая версия поддержки WebSocket (URL с
WS://
и WSS://
) и новый API для его обработки. Уже 28 протоколов.Мы добавили новую опцию командной строки
--json
, а libcurl получила новый header API, благодаря чему инструмент командной строки затем получил новую способность «получения заголовков», добавленную к -w
. Также мы добавили --rate
и --url-query
.В июне был опубликован HTTP/3 RFC.
msh3 стала третьей поддерживаемой библиотекой HTTP/3.
Компания Trail of Bits выполнила аудит безопасности curl, проспонсированный OpenSSF.
В декабре вышел 212-й релиз curl. В GitHub создана issue под номером 10000.
▍ 2023 год
В начале года: 155100 строк кода. 486 страниц man. 1560 тестовых случаев. 2771 контрибьютор. 1105 авторов коммитов. 132 CVE. 122 задачи CI. 29733 коммита. 48580 долларов выплачено как баг-баунти. 249 опций командной строки. 28 протоколов. 13 библиотек TLS. 3 библиотеки SSH. 3 библиотеки HTTP/3.
Добавлена поддержка HTTP/3 с откатом до старых версий, благодаря чему при использовании возникает меньше ошибок.
13 марта мы преодолели планку в 30 000 коммитов.
20 марта мы выпустили curl 8.0.0. Ровно 25 лет спустя после первого релиза curl.
▍ Оставаться актуальными
За последние 25 лет мы перестали использовать множество ПО, инструментов и сервисов, о многих полностью забыв. Всё приходит и уходит. Всему своё время, многие проекты просто не поспевают за ним, и в определённый момент их заменяет что-то другое.
Я люблю думать, что curl — это по-прежнему очень актуальный проект ПО со множеством пользователей и сфер применения. Мне хочется думать, что частично это вызвано тем, что мы активно его поддерживаем с любовью и заботой. Благодаря нам он делает то, что нужно пользователям. Быть актуальным, быть современным, работать с новыми версиями, поддерживать самые новые меры безопасности, быть проектом, который вам захочется использовать и в котором захочется участвовать. Вдохновлять собственным примером.
▍ Моя жизнь навсегда окрашена в цвета curl
Такое долгое развитие curl и возможность трудиться над своим хобби-проектом на основной работе — это мечта, ставшая реальностью. curl — огромная часть моей жизни.
Тем не менее, нужно сказать, что curl — это командный проект, и он ни за что бы не обрёл популярность и не стал чем-то реальным без всех наших потрясающих контрибьюторов. Меня называют «создателем curl» и кто-то даже может сказать, что это «мой» проект, но любой, кто касался его, знает, что в команде гораздо больше людей.
▍ 25 лет
В день, когда я нашёл httpget, мне было 26 лет. Когда я выпустил curl, мне уже было 27. В ноябре мне исполнилось 52.
Я работал над curl дольше, чем на какую-либо из компаний. Оба моих ребёнка младше него. 25 лет назад я ещё не жил в своём доме. 25 лет назад ещё не было Google, как и Firefox.
Многие из современных пользователей curl ещё даже не родились, когда я начал над ним работать.
▍ После двадцати пяти
Я чувствую, что обязан добавить этот раздел, потому что люди будут задавать вопросы.
Я не знаю, что ждёт в будущем. Мне всегда плохо давались прогнозы и предсказания, и, честно говоря, я всегда избегаю гаданий на кофейной гуще. Надеюсь, что по-прежнему буду активно участвовать в проекте и продолжу работать над клиентской интернет-передачей данных, пока это мне интересно и люди хотят пользоваться результатами моей работы.
Буду ли я участвовать в проекте ещё 25 лет? Будет ли curl по-прежнему актуален тогда? Я не знаю. Давайте это выясним!
Telegram-канал с розыгрышами призов, новостями IT и постами о ретроиграх ?️