Skip to content
Назад в блог

Как curl вырос из httpget в сетевую инфраструктуру

5 мин. чтения
Как curl вырос из httpget в сетевую инфраструктуру

Команду curl часто встречают в документации к API: её можно вставить в терминал, быстро проверить запрос, а затем перенести его в код приложения. За привычной командой скрывается более длинная история. Проект начинался как маленькая программа для загрузки данных из интернета, несколько раз менял имя вслед за своими возможностями, а затем получил библиотеку libcurl, благодаря которой тот же сетевой движок оказался внутри множества других программ.

Задача для IRC-бота и чужой исходный код

В конце 1996 года шведский разработчик Даниэль Стенберг писал IRC-бота для канала об Amiga в сети EFnet. Он хотел добавить пересчёт валют, а нужные курсы уже публиковались в интернете, поэтому оставалось автоматически загрузить страницу и извлечь данные. Вместо разработки HTTP-клиента с нуля Стенберг взял открытую программу HttpGet, версию 0.1 которой бразильский разработчик Рафаэл Сагула выпустил 11 ноября 1996 года.

Стенберг внёс необходимые изменения, а 17 декабря вышла версия 0.2 с его доработками. Вскоре он стал сопровождающим проекта, однако первоначальная практическая задача продолжила определять его развитие: программе требовалось получать данные из разных источников, а не демонстрировать один конкретный протокол. Эта последовательность подробно зафиксирована в официальной истории curl.

Почему httpget сначала стал urlget, а затем curl

Название httpget точно описывало раннюю версию, пока программа работала главным образом с HTTP-загрузками. Затем к ней добавились Gopher и FTP, поэтому в августе 1997 года проект получил более общее имя urlget: теперь он обращался к ресурсу по URL, а не только загружал страницу по HTTP. Поддержка FTP upload и HTTP POST вскоре сделала тесным и это название, поскольку программа уже не ограничивалась получением данных.

20 марта 1998 года Стенберг выпустил curl 4, сохранив нумерацию предыдущих версий. Новое имя связывали с выражением «client for URLs», а слово curl одновременно напоминало о том, что программа работает с URL. Важнее самого переименования была логика развития: каждый новый протокол, способ аутентификации или режим передачи превращал небольшой загрузчик в универсальный клиент, пригодный не только для исходного IRC-бота.

Во второй половине 1990-х проект быстро набирал практические возможности. Появились SSL, cookies, Telnet, сборки для разных операционных систем и пакеты для Linux. Пользователи получили удобную команду, но её можно было применять только как отдельную программу: другой продукт либо запускал процесс curl, либо заново решал те же сетевые задачи внутри собственного кода.

libcurl превратил программу в строительный блок

Весной 2000 года внутреннее устройство curl серьёзно переработали ради библиотечного интерфейса, а в августе версия 7.1 принесла первый неэкспериментальный API libcurl. Уже в том же месяце появилась сторонняя привязка для PHP. Это был более существенный шаг, чем добавление очередного протокола, потому что разработчики получили возможность встроить сетевой движок в свою программу и управлять им через функции библиотеки.

Командная утилита и библиотека решают близкие, но не одинаковые задачи. CLI удобна человеку, shell-скрипту или системе сборки: команда описывает передачу, выполняется и возвращает результат. libcurl работает внутри длительно живущего приложения, где программа сама управляет соединениями, обработчиками данных, параллельными операциями и ошибками. При этом ей не приходится отдельно реализовывать URL, прокси, аутентификацию, TLS, cookies и особенности каждого поддерживаемого протокола.

Именно библиотека позволила curl выйти далеко за пределы терминала. Пользователь приложения может никогда не видеть это название, хотя передача данных внутри программы выполняется libcurl. Командная версия тоже продолжила распространяться как стандартная системная утилита, но подсчитать все установки невозможно: curl входит в операционные системы, поставляется через многочисленные зеркала и приезжает как часть другого программного обеспечения. Долговечность проекта при этом нельзя приписывать одному человеку. Стенберг остаётся ведущим разработчиком, а изменения, тестирование и разбор ошибок давно выполняет международное сообщество.

WebSocket решает другую сетевую задачу

HTTP-запрос удобно представить как законченную операцию: клиент задаёт метод, адрес, заголовки и тело, а сервер возвращает ответ. Современный HTTP допускает повторное использование соединений и потоковую передачу, поэтому различие с WebSocket нельзя свести к фразе «HTTP закрывается, а WebSocket остаётся открытым». Разница прежде всего в модели взаимодействия.

RFC 6455, опубликованный IETF в декабре 2011 года и подготовленный Иэном Фетте и Алексеем Мельниковым, стандартизовал протокол для двустороннего обмена сообщениями между браузерным клиентом и сервером. Соединение начинается с HTTP/1.1-запроса с заголовками Upgrade: websocket и Connection: Upgrade. Если сервер принимает переход, дальнейший обмен идёт уже кадрами WebSocket поверх того же TCP-соединения, а каждая сторона может отправлять сообщения независимо от другой.

Такая модель подходит чатам, совместным редакторам, панелям с живыми показателями и другим интерфейсам, где новые данные появляются не только в ответ на очередной запрос пользователя. WebSocket не заменяет HTTP API: обычно приложение использует обычные запросы для загрузки и изменения ресурсов, а постоянное соединение оставляет для событий, которые должны приходить без регулярного опроса сервера.

Что именно делает API Sandbox

API & Web Sandbox объединяет эти две повседневные задачи в соседних вкладках. cURL Converter не выполняет запрос и не пытается воспроизвести весь curl. Он разбирает URL, метод -X или --request, заголовки -H, несколько вариантов --data, Basic Auth через -u и явный --url, а затем переносит получившуюся структуру запроса в один из двадцати вариантов. Среди них Fetch API, Axios, нативный Node.js, Python, PHP, Go, C#, Java, Swift, Rust, HTTPie, Wget, PowerShell и коллекция Postman.

Неизвестный параметр приводит к понятной ошибке, но некоторые флаги командной строки, например --location, --insecure, --silent, --include, --verbose и --compressed, пропускаются, поскольку они описывают выполнение curl или вывод, а не базовую структуру запроса. Поэтому результат следует читать как заготовку для кода. Конвертер не переносит файлы и multipart-формы, cookies, клиентские сертификаты, прокси, сложные схемы аутентификации и все особенности shell. Кроме того, сгенерированный браузерный fetch подчиняется CORS и другим ограничениям браузера, даже если исходная команда успешно работает в терминале.

WebSocket Tester, напротив, действительно открывает соединение через браузерный API WebSocket. Он принимает адрес ws:// или wss://, отправляет текстовые сообщения, показывает время и направление событий, хранит до 200 последних записей и по желанию форматирует JSON. Двоичные сообщения отмечаются в журнале без просмотра содержимого; произвольные заголовки, выбор подпротокола и настройка кадров интерфейс не поддерживает. На странице, открытой по HTTPS, также следует использовать защищённый адрес wss://, иначе браузер может заблокировать смешанный контент.

Для быстрой проверки вставьте в конвертер простую команду с -X, -H и -d, сравните сгенерированные варианты и обратите внимание, какая часть запроса сохраняется в каждом языке. Во второй вкладке лучше подключаться к собственному тестовому WS/WSS-серверу: тогда журнал покажет открытие соединения, отправленные сообщения, ответы и код закрытия без передачи данных через промежуточный сервис API Sandbox.

Похожие инструменты

Частые вопросы

Кто создал curl и когда?

Рафаэл Сагула выпустил HttpGet 0.1 11 ноября 1996 года. Даниэль Стенберг доработал программу для IRC-бота, вскоре стал её сопровождающим и продолжил развивать проект. После названия urlget первая версия под именем curl, сохранившая прежнюю нумерацию, вышла как curl 4 20 марта 1998 года.

Чем curl отличается от libcurl?

curl представляет собой готовую программу командной строки, которой управляет пользователь или скрипт. libcurl является библиотекой того же проекта: приложение подключает её и использует сетевые возможности через API, не запуская отдельный процесс и не реализуя передачу данных самостоятельно.

Почему curl получил такое широкое распространение?

Проект сочетает переносимость, поддержку разных протоколов и многолетнюю совместимость. Командная утилита удобна для терминала и автоматизации, а libcurl можно встроить в другие программы, поэтому технологией пользуются даже люди, которые никогда не вводили команду curl вручную.

Что такое WebSocket?

WebSocket стандартизован в RFC 6455 в декабре 2011 года. Соединение начинается с HTTP-совместимого открывающего рукопожатия, после которого стороны обмениваются кадрами поверх TCP и могут независимо отправлять сообщения в обоих направлениях.

Что умеет API Sandbox?

Конвертер разбирает базовую структуру команды curl: URL, метод, заголовки, тело и Basic Auth, после чего предлагает двадцать вариантов кода и форматов. WebSocket Tester открывает WS/WSS-соединение из браузера, отправляет текстовые сообщения и ведёт журнал событий. Это учебный конвертер, а не полная реализация всех параметров curl или специализированный WebSocket-клиент.

Автор

Fullstack Engineer

В коммерческой разработке с 2011 года — больше 15 лет. Автор двух SaaS-продуктов: TeleGo.io и LingvoHabit.com. Статьи здесь выросли из реальной клиентской и продуктовой работы.

Подробнее об автореНаписать в Telegram

Похожие статьи

GZIP VS BROTLI
GZIP VS BROTLI · '26

Как патенты на LZW привели к gzip, а веб к Brotli

История gzip, DEFLATE и Brotli, устройство двух форматов сжатия и практический выбор между размером результата, скоростью кодирования и совместимостью.

#GZip vs Brotli #история сжатия данных #Jean-loup Gailly #Brotli Google #Deflate алгоритм #LZ77 Huffman
5 мин. чтения
ФОРМАТИРОВАНИЕ RTL ТЕКСТА
ФОРМАТИРОВАНИЕ RTL ТЕКСТА · '26

Почему иврит и английский меняются местами

Как Unicode BiDi отображает иврит и арабский вместе с латиницей и кириллицей и когда использовать isolates, LRM или RLM.

#Форматирование RTL текста #Иврит и английский #Unicode BiDi controls #LRM и RLM #LRI RLI PDI #Смешанное направление текста
3 мин. чтения
СЖАТИЕ ИЗОБРАЖЕНИЙ
СЖАТИЕ ИЗОБРАЖЕНИЙ · '26

Оптимизация SVG, экспорт кода и сжатие изображений

Оптимизируйте и трансформируйте SVG, экспортируйте React, React Native, Vue, PNG или Data URI и сжимайте растровые изображения локально в браузере.

#сжатие изображений #WebP формат #оптимизация SVG #PNG vs JPEG #AVIF #SVGO
4 мин. чтения