Русское сообщество по скриптингу

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

Файлы и модули, которые пригодятся при скриптинге для AMX Mod X или SourceMod.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено выкладывать файлы или модули для AMXX/SM, которые пригодятся при программировании.

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

Сообщение Polarhigh » 26 июл 2016, 14:59

Автор: Polarhigh
Версия: 1.0.3
Описание:
Модуль является обёрткой над библиотекой libcurl. Поддерживает ssl и позволяет делать передачи в неблокирующем режиме.
В новой версии отсутствует необходимость использования SoLoader (обязательно нужно отключить). Работает как с ReHLDS, так и с HLDS

Примечание для старых Linux:
Если в системе стоит версиия glibc ниже 2.17 (Ubuntu 12.04, CentOS 6.10 и др.) вы можете использовать библиотеку из архива amxx_curl_linux_v1.0.3.glibc.2.12.c-ares.zip.

Функции:
Все нативы выполняет ровно то, что и их Вы должны зарегистрироваться, чтобы видеть ссылки., за исключением некоторых:
Код: Выделить всё
native void:curl_easy_perform(const CURL:handle, const callbackComplite[], const data[] = {}, const data_len = 0

Функция начинает передачу, и по завершении передачи будет вызван callbackComplite.
Третьим параметром можно указать массив с любыми, он будет передан без изменений в callbackComplite, четвертый параметр размер массива.

Если data установлена, тогда колбэк должен иметь такую сигнатуру:
Код: Выделить всё
public compliteCallback(CURL:curl, CURLcode:code, data[]) 


Если не установлена, тогда тогда сигнатура должна быть такой:
Код: Выделить всё
public compliteCallback(CURL:curl, CURLcode:code


Общие примечания:
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 для изменения вывода).

Roadmap:
1) Улучшение производительности: избавление от потоков, использование библиотеки asio, использование интерфейса curl multi;
2) Добавление более простых интерфейсов для amxx плагинов;
3) Улучшение скриптов сборки.

Скачать: Вы должны зарегистрироваться, чтобы видеть ссылки.
Исходники: Вы должны зарегистрироваться, чтобы видеть ссылки.
Последний раз редактировалось Polarhigh 29 янв 2019, 19:13, всего редактировалось 4 раз(а).
Аватара пользователя
Polarhigh
 
Сообщения: 1006
Зарегистрирован: 04 май 2010, 17:41
Благодарил (а): 131 раз.
Поблагодарили: 388 раз.
Опыт программирования: Больше трех лет

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

Сообщение Fedcomp » 26 июл 2016, 21:14

крутяк. Cmake не юзаешь?
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

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

Сообщение Polarhigh » 26 июл 2016, 21:25

Приходилось всего пару раз самому писать что-то по мелочи,
но здесь решил premake5 использовать и он очень даже ничего)
Аватара пользователя
Polarhigh
 
Сообщения: 1006
Зарегистрирован: 04 май 2010, 17:41
Благодарил (а): 131 раз.
Поблагодарили: 388 раз.
Опыт программирования: Больше трех лет

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

Сообщение RevCrew » 29 июл 2016, 23:35

Polarhigh, Curl это socket+ поддержка различных протоколов? Что лучше юзать его или socket?
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

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

Сообщение Polarhigh » 30 июл 2016, 01:36

RevCrew, если простые запросы по http, то сокеты; мне в свое время нужен был https и какбэ уже через сокеты делать неоправданно сложно) (нереально сложно)
Аватара пользователя
Polarhigh
 
Сообщения: 1006
Зарегистрирован: 04 май 2010, 17:41
Благодарил (а): 131 раз.
Поблагодарили: 388 раз.
Опыт программирования: Больше трех лет

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

Сообщение Fedcomp » 30 июл 2016, 09:21

Даже обычный http лучше не через сокеты.
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

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

Сообщение RevCrew » 28 авг 2016, 00:04

Ну вот, сделал первый тест=)

Код: Выделить всё
Welcome to the AMX Mod X 1.8.1-300 Compiler.
Copyright (c) 1997-2013 ITB CompuPhase, AMX Mod X Team

E:\Games\Counter-Strike 1.6\cstrike\addons\amxmodx\scripting\include\curl_consts.inc(497) : warning 200: symbol "CURLINFO_CONTENT_LENGTH_DOWNLOA" is truncated to 31 characters
E:\Games\Counter-Strike 1.6\cstrike\addons\amxmodx\scripting\include\curl_consts.inc(1033) : warning 200: symbol "CURLOPT_CONV_FROM_NETWORK_FUNCT" is truncated to 31 characters
E:\Games\Counter-Strike 1.6\cstrike\addons\amxmodx\scripting\include\curl_consts.inc(1037) : warning 200: symbol "CURLOPT_CONV_TO_NETWORK_FUNCTIO" is truncated to 31 characters
E:\Games\Counter-Strike 1.6\CS-Suite\2016\DiveBan Beta\v1\scripting\include/divebans/uid.inl(10) : warning 203: symbol is never used: "COMMAND"
E:\Games\Counter-Strike 1.6\CS-Suite\2016\DiveBan Beta\v1\scripting\include/divebans/uid.inl(10) : warning 203: symbol is never used: "id"
Warning: Symbol is never used: "g_Socket" on line 877
Header size:           4060 bytes
Code size:            84812 bytes
Data size:            98404 bytes
Stack/heap size:      16384 bytes; max. usage is unknown, due to recursion
Total requirements:  203660 bytes

6 Warnings.
Copied output file to: E:\Games\Counter-Strike 1.6\cstrike\addons\amxmodx\plugins\
Done.


первые варнинга с курлом связаны.

Дальше, код не работает.
Код: Выделить всё

const WRITE_SIZE 
= 512;
static buffer[256]
        formatex(buffer, charsmax(buffer), ***)
        new CURL:curl = curl_easy_init()

        curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, WRITE_SIZE)
        curl_easy_setopt(curl, CURLOPT_URL, buffer)
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, "write")
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1)
        curl_easy_perform(curl, "complite")

public write(data[], size, nmemb)
{
    
    if
(size>WRITE_SIZE)
        return 0
    add
(g_lData,charsmax(g_lData), data);    
    return size
;
}

public complite(CURLcode:code, CURL:curl) {

        curl_easy_cleanup(curl)
    CheckActivation(g_lData)
    
}


Ошибка:
Код: Выделить всё


L 08/27/2016 - 22:59:30: [CURL] Invalid curl handle
L 08/27/2016 - 22:59:30: [AMXX] Displaying debug trace (plugin "DiveBan.amxx")
L 08/27/2016 - 22:59:30: [AMXX] Run time error 10: native error (native "curl_easy_cleanup")
L 08/27/2016 - 22:59:30: [AMXX]    [0] license.inl::complite (line


Добавлено спустя 54 секунды:
Сразу вопрос, можно сделать так?

Код: Выделить всё
new len formatex(buffercharsmax(buffer), ***)
curl_easy_setopt(curlCURLOPT_BUFFERSIZElen)
 


Или не надо?
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

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

Сообщение Subb98 » 28 авг 2016, 00:06

Код: Выделить всё
formatex(buffercharsmax(buffer), ***) 

>>

Код: Выделить всё
formatex(buffercharsmax(buffer), "***"

Нет?
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

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

Сообщение RevCrew » 28 авг 2016, 00:20

Subb98, я скрыл данные звездочками) там строка стоит. Я по примеру делал.
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

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

Сообщение Polarhigh » 28 авг 2016, 00:32

RevCrew, поправил описание,
public compliteCallback(CURL:curl, CURLcode:code)

Добавлено спустя 1 минуту 44 секунды:
RevCrew писал(а):Ну вот, сделал первый тест=)
Добавлено спустя 54 секунды:
Сразу вопрос, можно сделать так?

Код: Выделить всё

new len 
= formatex(buffer, charsmax(buffer), ***)
curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, len)
 


Или не надо?

можно, но это не значит, что во write колбэк будет передано именно столько байт

первые варнинги будут отсутствовать на компиляторе 1.8.3, я чот решил пока ничего с этим не делать
Аватара пользователя
Polarhigh
 
Сообщения: 1006
Зарегистрирован: 04 май 2010, 17:41
Благодарил (а): 131 раз.
Поблагодарили: 388 раз.
Опыт программирования: Больше трех лет

След.

Вернуться в Файлы и модули

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4