Libcurl библиотека для HTTP/HTTPS на FreePascal - CurlCross

Описание кросс-платформенной обёртки для GET/POST запросов на Libcurl (FreePascal) - CurlCross.

Libcurl довольно популярный и надежный инструмент. В нем есть поддержка протоколов HTTP/HTTPS. В нем также удобно работать с Cookie и редиректами. Страница проекта https://curl.haxx.se/libcurl/

Для Libcurl уже описана библиотека в FPC, сейчас подключается только в ОС Линукс. Для windows существуют библиотека FPC с официального сайта проекта Libcurl. Но пока не было универсальной кроссплатформенной библиотеки FPC для GET/POST. Решено написать обёртку, чтобы возможно было использовать Libcurl на разных ОС. Для этого использованы эти разные реализации и объединены в одну универсальную. К сожалению эти обёртки уже прилично устарели и многие возможности просто не реализованы, но для выполнения GET- POST-запросов и работы с куками вполне достаточно. Название библиотеки - CurlCross.

Код CurlCross

Скачайте библиотеку CurlCross (700кб) и пример (FPC 3.0).

Архив содержит пример CurlCross (папка example) и файлы библиотек FreePascal (папка lib), скомпилированный Libcurl для Windows 64 bit. Всё в одном с SSL+ZLIB, адрес проекта http://home.arcor.de/skanthak/curl.html, здесь же вы найдете и 32-битную версию библиотеки (для Windows 32 bit можете скачать вот этот набор файлов). Можно скопировать файл libcurl.dll в системную папку Windows /system32, чтобы библиотека подключалась оттуда.  На этот момент была доступна версия 7.4.9.

Основная подключаемая библиотека называется curlcross.pas, это необходимо прописывать в uses вашего проекта.

Функции

CurlCross содержит 2 функции:

GET запросы

function crossget(url,cook:string; var err,data,newcook:string; redir:boolean=TRUE):boolean;

При успешном выполнении функция crossget возвращает TRUE, FALSE при ошибках
url это адрес страницы (http/https)
cook - строка cookie в формате HTTP заголовка
err - содержит текст ошибки, если ошибок нет то переменная пуста
data - содержит код страницы, текст ответа
newcook - возвращает содержимое куков в формате HTTP заголовка
redir - указывает, что Libcurl будет следовать по перенаправлениям, по умолчанию включено (TRUE)

 

POST запросы

function crosspost(url,cook,post:string; var err,data,newcook:string; redir:boolean = TRUE):boolean;

Функция делает почти тоже самое что и crossget, но имеет переменную post для отправки POST-данных.

Функция dowrite вспомогательная, необходима для приема данных и используется предыдущими двумя функциями.

В коде функции вы можете осуществить настройку параметров работы библиотеки, такие как таймауты подключения, тип запроса, компрессия файлов (по умолчанию включен GZIP). Вы можете указывать различные параметры в Headers (user-agent, формат файла и т.д.).

В разных ОС подключаются разные библиотеки: в Linux стандартная libcurl из пакета FPC, для Windows использована библиотека, которую я нашел на ГитХабе https://github.com/Ruzzz/CurlPas и внесены некоторыми дополнения в код. Какие были исправления? В основном с названием функции в файле Curl_h. Они различаются от тех что сейчас есть в файле libcurl.dll. Например, было в описании Сurl_global_init, а в файле  curl_global_init, т.е. был прописан с заглавной буквой, но в Си оба названия являются разными. В итоге функция не запускается и программа завершается ошибкой. Не все названия функций были исправлены, только те что необходимы для CurlCross.

В запросе содержимое cookie возвращается не во внутреннем формате libcurl. Cookie конвертируется в шаблон, как те что в HTTP-заголовках, т.е. param1=texttexttext;

Особенности в Linux

Для установки Libcurl в ОС Debian/Ubuntu используется команда:

sudo apt-get install libcurl3

Сообщение APT если пакет уже установлен:

Для установки Libcurl в ОС RedHat/Centos/Fedora используется команда YUM с правами пользователя root:

yum install libcurl

Однако при компиляции проекта в ОС RedHat/Centos/Fedora может возникнуть ошибка:

/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
/usr/bin/ld: cannot find -lcurl

Ошибка означает, что компилятору не удалось найти файл скомпилированной библиотеки libcurl.so. Это при том, что пакет библиотеки уже установлен. Она должна находиться в папке /usr/lib64/ (или /usr/lib/). На самом деле скомпилированная библиотека находится в этой папке, но называется по-другому libcurl.so.4 и libcurl.so.4.1.1 как в данном примере (в соответствии с версией библиотеки):

Есть несколько вариантов решить проблему, либо скопировать файл libcurl.so.4.1.1 в папку с программой и переименовать её, либо создать символическую ссылку на этот файл с необходимым именем. Файл libcurl.so.4 является символической ссылкой (в данной ситуации), но нам необходим "libcurl.so".

Команда для создания ссылки на библиотеку:

ln -s /usr/lib64/libcurl.so.4.1.1 /usr/lib64/libcurl.so

Здесь нужно уточнить, что ОС на которой я выполняю примеры, является 64-битной и библиотеки располагаются в 64-битной папке /usr/lib64/.

Установка из исходного кода в Debian/Ubuntu/Mint. На странице загрузки, вы можете скачать свежую версию Libcurl. На данный момент доступная версия 7.50.3, что является актуальной и рекомендуемой версией. 

Особенности в Windows

Для подключения Libcurl в среде Windows необходима скомпилированная версия libcurl.dll. Данный файл уже есть в архиве CurlCross (64-битная версия с поддержкой SSL и ZLIB). Вы можете поискать другие библиотеки, либо скомпилировать сами.

Демо программа

В архиве есть пример работы кроссплатформенной обвёртки. Это исходный код программы CurlCross. Программа выполняет GET- POST-запросы.

Приложение необходимо скомпилировать в Лазарус (FPC 3.0). В ОС типа Linux файл libcurl.dll не нужен, он необходим только в Windows.

Обновления

2016.10.02 - В библиотеку была добавлена опция для ограничения максимального количества редиректов CURLOPT_MAXREDIRS, не более 3 редиректов по умолчанию.

2016.10.03 - Добавлена глобальная очистка свойств curl_global_cleanup.

 

Art!P,
2016