# libcurl

Мощная кроссплатформенная библиотека для передачи данных по URL, поддерживающая множество сетевых протоколов. Она предоставляет простой и эффективный интерфейс для выполнения сетевых запросов, обработки ответов и работы с сетевыми протоколами. Библиотека широко используется в клиентских и серверных приложениях для реализации сетевых операций.

## Особенности

- поддержка множества протоколов: HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, LDAP, TELNET и других;
- поддержка SSL/TLS через различные backends (OpenSSL, LibreSSL, Schannel, Secure Transport и др.);
- возможность работы через прокси (HTTP, SOCKS, HTTPS);
- поддержка аутентификации (Basic, Digest, NTLM, Kerberos, OAuth и др.);
- возможность работы с cookies, заголовками и перенаправлениями.

## Основные компоненты

libcurl предоставляет богатый набор функций для выполнения сетевых операций, управления соединениями и обработки данных (подробнее с документацией можно ознакомиться [здесь](https://curl.se/libcurl/)).

### Инициализация и управление сессиями

Библиотека использует концепцию "easy interface" для простых синхронных операций и "multi interface" для асинхронных операций. Каждая операция начинается с создания сессии (CURL handle), которая настраивается параметрами и затем выполняется.

Основные функции управления сессиями:

- `curl_easy_init()` — создание нового easy handle для синхронных операций;
- `curl_easy_setopt()` — настройка параметров запроса (URL, заголовки, данные и др.);
- `curl_easy_perform()` — выполнение запроса (блокирующий вызов);
- `curl_easy_cleanup()` — освобождение ресурсов easy handle;
- `curl_global_init()` и `curl_global_cleanup()` — глобальная инициализация и деинициализация библиотеки.

### Поддержка множества протоколов

libcurl поддерживает широкий спектр протоколов, что позволяет использовать единый API для различных сетевых операций. Для каждого протокола библиотека предоставляет специфические настройки и возможности.

Ключевые протоколы:

- **HTTP/HTTPS**: полная поддержка HTTP/1.1, HTTP/2, HTTP/3 (QUIC), методы запросов, заголовки, cookies, аутентификация;
- **FTP/FTPS**: загрузка и выгрузка файлов, работа с директориями, пассивный и активный режимы;
- **SCP/SFTP**: безопасная передача файлов через SSH;
- **SMTP/IMAP/POP3**: отправка и получение электронной почты;
- **LDAP**: работа с каталогами;
- **RTSP**: потоковое мультимедиа;
- **MQTT**: обмен сообщениями для IoT.

### Работа с данными и callback-функции

libcurl использует callback-функции для обработки полученных данных, что позволяет эффективно работать с большими объемами информации без необходимости сохранения всего ответа в памяти.

Основные callback-функции:

- `CURLOPT_WRITEFUNCTION` — callback для записи полученных данных (например, в файл или буфер);
- `CURLOPT_HEADERFUNCTION` — callback для обработки заголовков ответа;
- `CURLOPT_READFUNCTION` — callback для чтения данных, отправляемых на сервер (например, при POST);
- `CURLOPT_PROGRESSFUNCTION` — callback для отслеживания прогресса передачи;
- `CURLOPT_DEBUGFUNCTION` — callback для отладочной информации.

### Управление соединениями и производительностью

Библиотека предоставляет множество настроек для оптимизации производительности и управления сетевыми соединениями. Это включает пул соединений, keep-alive, таймауты и лимиты.

Функции управления соединениями:

- `curl_easy_setopt()` с `CURLOPT_TIMEOUT`, `CURLOPT_CONNECTTIMEOUT` — установка таймаутов;
- `CURLOPT_MAXCONNECTS` — ограничение количества соединений в пуле;
- `CURLOPT_TCP_KEEPALIVE` — включение keep-alive для TCP-соединений;
- `CURLOPT_BUFFERSIZE` — размер буфера для чтения/записи;
- `CURLOPT_ACCEPT_ENCODING` — поддержка сжатия данных (gzip, deflate).

### Безопасность и SSL/TLS

libcurl поддерживает различные backends для SSL/TLS, что позволяет использовать библиотеку в разных средах. Библиотека также предоставляет настройки для проверки сертификатов и управления безопасностью соединений.

Функции безопасности:

- `CURLOPT_SSL_VERIFYPEER` и `CURLOPT_SSL_VERIFYHOST` — проверка сертификатов сервера;
- `CURLOPT_CAINFO` и `CURLOPT_CAPATH` — указание CA-сертификатов;
- `CURLOPT_SSLCERT` и `CURLOPT_SSLKEY` — использование клиентских сертификатов;
- `CURLOPT_SSL_CIPHER_LIST` — выбор шифров;
- Поддержка TLS 1.2, TLS 1.3 и других протоколов.

### Асинхронные операции и multi interface

Для выполнения нескольких сетевых операций одновременно или в асинхронном режиме libcurl предоставляет multi interface. Этот интерфейс позволяет управлять несколькими easy handles в одном потоке или нескольких потоках.

Функции multi interface:

- `curl_multi_init()` — создание multi handle;
- `curl_multi_add_handle()` — добавление easy handle к multi handle;
- `curl_multi_perform()` — выполнение операций (неблокирующий вызов);
- `curl_multi_fdset()` — получение файловых дескрипторов для использования с select/poll;
- `curl_multi_wait()` — ожидание активности на соединениях;
- `curl_multi_info_read()` — получение информации о завершенных операциях;
- `curl_multi_remove_handle()` и `curl_multi_cleanup()` — удаление handles и очистка.

### Работа с заголовками и cookies

libcurl предоставляет удобные средства для работы с HTTP-заголовками и cookies. Библиотека может автоматически обрабатывать cookies, сохраняя их между запросами, и позволяет управлять заголовками запросов и ответов.

Функции для заголовков и cookies:

- `CURLOPT_HTTPHEADER` — установка пользовательских заголовков запроса;
- `CURLOPT_COOKIEFILE` и `CURLOPT_COOKIEJAR` — загрузка и сохранение cookies из/в файл;
- `CURLOPT_COOKIELIST` — прямое управление списком cookies;
- `curl_easy_getinfo()` с `CURLINFO_COOKIELIST` — получение списка cookies;
- `CURLOPT_HEADER` — включение заголовков ответа в тело данных.
