Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

[Модуль Amxx] Curl (Windows & Linux)

Статус пользователя trofian
сообщение 26.7.2016, 16:50
Сообщение #1


Стаж: 11 лет

Сообщений: 72
Благодарностей: 41
Полезность: 438

Автор: Polarhigh (aka trofian)
Версия: 1.0.0
Описание:
Модуль является обёрткой над библиотекой libcurl.

Установка Linux версии:
Модуль слинкован динамически с openssl, поэтому, если в системе он отсутствует, то curl модуль не загрузится.

Поэтому нужно:
1) установить metamod плагин SoLoader и прописать его в самый верх addons/metamod/plugins.ini.
2) в addons/soloader/libraries.cfg добавить строчки:
Цитата
libcrypto.so.1.0.0
libssl.so.1.0.0


Эти библиотеки есть в архиве для linux версии, взяты из моего debian.

Функции:
Смотри здесь)
Однако отсутствуют следующие: curl_easy_recv, curl_easy_send

Общие примечания:
1) Вы НЕ должны вызывать curl_easy_cleanup и другие функции очистки пока передача не завершилась!
2) Пока нет возможности реально установить/получить значение переменной типа curl_off_t, сейчас происходит преобразование типа к cell (обычная ячейка amxx), но это не очень правильно. Значения зачастую будут некорректными.
3) Всегда определяйте опцию CURLOPT_BUFFERSIZE, если используете колбэк WRITEFUNCTION укажите в качестве параметра размер буфера не более 1024, иначе рискуете получить ошибки stack error, возможно даже повесить сервер. Если вы получаете ошибки stack error при использовании других колбэков, то можно определить в плагине #pragma dynamic 30000.
4) Не забывайте, что вам необходимо очищать память по указателям для curl_slist и curl_httppost с помощью функций curl_slist_free_all и curl_formfree соответственно.
5) Если к моменту смены карты остались незавершенные передачи, то будет прерван вызов всех установленных колбэков и модуль встанет в ожидание завершения всех передач.

Рекомендации:
1) Если планируется "долгосрочная" передача, то можно временно убрать лимит игры на карте, когда передача завершится восстановить;
2) Вы можете использовать 1 дескриптор curl несколько раз для одного url.
3) Используйте curl_easy_setopt(curl, CURLOPT_VERBOSE, 1) для отладки плагина, если затрудняетесь определить причину неполадки в плагине. (По-умолчания вывод дебаг информации будет осуществляться в консоль сервера, вы можете определить колбэк CURLOPT_DEBUGFUNCTION для изменения вывода)

Примеры:

http_get.sma
Cкрытый текст
Код:
#include <amxmodx>
#include <amxmisc>
#include <curl>

#define CURL_BUFFER_SIZE 512

public plugin_init()
{
register_plugin("curl http get", "1.0", "Polarhigh")

new data[1]
data[0] = fopen("addons/amxmodx/alliedmods_main_page.html", "wb")
server_print("curl start")

new CURL:curl = curl_easy_init()
curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, CURL_BUFFER_SIZE)
curl_easy_setopt(curl, CURLOPT_URL, "https://forums.alliedmods.net")
curl_easy_setopt(curl, CURLOPT_WRITEDATA, data[0])
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, "write")
curl_easy_perform(curl, "complite", data, sizeof(data))
}

public write(data[], size, nmemb, file)
{
new actual_size = size * nmemb;

fwrite_blocks(file, data, actual_size, BLOCK_CHAR)

return actual_size
}

public complite(CURL:curl, CURLcode:code, data[])
{
if(code == CURLE_WRITE_ERROR)
server_print("transfer aborted")
else
server_print("curl complete")

fclose(data[0])
curl_easy_cleanup(curl)
}


ftp_upload.sma
Cкрытый текст
Код:
#pragma dynamic 16536

#include <amxmodx>
#include <amxmisc>
#include <curl>

#define CURL_BUFFER_SIZE 512

public plugin_init()
{
register_plugin("FTP Upload", "1.0", "Polarhigh")

// for an example we will send today's amxx log to the our ftp server
new log_str[14], log_full_path[128], conn_string[256]
get_time("L%Y%m%d.log", log_str, charsmax(log_str))
formatex(log_full_path, charsmax(log_full_path), "addons/amxmodx/logs/%s", log_str)
formatex(conn_string, charsmax(conn_string), "ftp://user:password@127.0.0.1:21/amx_logs/%s", log_str)

transfer_file(log_full_path, conn_string)
}

public transfer_file(file_path[], ftp_uri[])
{
if(file_exists(file_path))
{
new CURL:curl = curl_easy_init()
if(curl)
{
new data[1], fsize
fsize = file_size(file_path)
data[0] = fopen(file_path, "rb")


curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, CURL_BUFFER_SIZE)
curl_easy_setopt(curl, CURLOPT_URL, ftp_uri)
curl_easy_setopt(curl, CURLOPT_READFUNCTION, "read_callback")
curl_easy_setopt(curl, CURLOPT_READDATA, data[0])
curl_easy_setopt(curl, CURLOPT_INFILESIZE, fsize)
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1)
curl_easy_perform(curl, "curl_complete", data, sizeof(data))

server_print("transfer begin %s", file_path)
}
else
server_print("curl init error")
}
else
server_print("transfer err, file not found: %s", file_path)
}

public read_callback(buffer[], size, nmemb, file)
{
return fread_blocks(file, buffer, nmemb, BLOCK_BYTE) // we consider size == 1
}

public curl_complete(CURL:curl, CURLcode:code, data[])
{
if(code == CURLE_READ_ERROR)
server_print("transfer aborted")
else if(code == CURLE_OK)
server_print("transfer complete")
else
{
new err[64]
curl_easy_strerror(code, err, charsmax(err))
server_print("transfer error: %s", err)
}

fclose(data[0])
curl_easy_cleanup(curl)
}


Скачать: GitHub releases
Исходники: https://github.com/Polarhigh/AmxxCurl
Официальная ветка: http://amx-x.ru/viewtopic.php?f=21&t=36068&p=286085

Отредактировал: trofian, - 27.7.2016, 0:40
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 3 раз
   Цитировать сообщение
Статус пользователя ALIK
сообщение 26.7.2016, 17:16
Сообщение #2


Стаж: 10 лет

Сообщений: 33
Благодарностей: 13
Полезность: 300

Вчера на голде появилась скомпилированная версия модуля под линукс, которая хранилась до этого на амх-х и не компилировалась. Смотрел?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя trofian
сообщение 26.7.2016, 17:54
Сообщение #3


Стаж: 11 лет

Сообщений: 72
Благодарностей: 41
Полезность: 438

Нет, только сейчас узнал)
Вообще я на гитхабе еще 1 модуль нашел https://github.com/alldroll/curl_module, правда уже после того, как почти закончил свой
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ALIK
сообщение 26.7.2016, 20:41
Сообщение #4


Стаж: 10 лет

Сообщений: 33
Благодарностей: 13
Полезность: 300

trofian, что посоветуешь из них?)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя wopox3
сообщение 26.7.2016, 21:01
Сообщение #5


Стаж: 11 лет

Сообщений: 333
Благодарностей: 222
Полезность: 902

Цитата(ALIK @ 26.7.2016, 21:41) *
trofian, что посоветуешь из них?)

Версию от Garey, хотя бы потому, что имеется поддержка.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя trofian
сообщение 26.7.2016, 21:07
Сообщение #6


Стаж: 11 лет

Сообщений: 72
Благодарностей: 41
Полезность: 438

wopox3, а я что, не поддержка?
ALIK, не знаю, не затрагивая https://github.com/alldroll/curl_module,
обе другие версии имеют идентичный интерфейс и поведение; тесты производительности я не делал) но ни там ни там не используются threadpool или еще какие-то существенные опитимизации
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Garey
сообщение 26.7.2016, 21:56
Сообщение #7
Стаж: 15 лет

Сообщений: 4
Благодарностей: 12
Полезность: 0

Привет! Попробую использовать ваш модуль в своем плагине, модуль от Morning Rainbow коряво работает с Windows < Vista (например Windows XP), Как ваш модуль работает с данной ОС? =)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя trofian
сообщение 26.7.2016, 23:07
Сообщение #8


Стаж: 11 лет

Сообщений: 72
Благодарностей: 41
Полезность: 438

wopox3, мм, я кажется понял) Polarhigh это мой новый ник; только обратил внимание, что ничего здесь на это не указывало

Отредактировал: trofian, - 26.7.2016, 23:08
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя trofian
сообщение 27.7.2016, 10:44
Сообщение #9


Стаж: 11 лет

Сообщений: 72
Благодарностей: 41
Полезность: 438

Цитата(Garey @ 26.7.2016, 22:56) *
Привет! Попробую использовать ваш модуль в своем плагине, модуль от Morning Rainbow коряво работает с Windows < Vista (например Windows XP), Как ваш модуль работает с данной ОС? =)

Привет, прошу прощения, вчера видел, что есть новый ответ, но в упор не видел твоего сообщения,
по правде говоря не тестировал, проверял только на win10, но проблем не должно возникнуть, попробую сегодня-завтра поставить виртуалку с xp
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: