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

[Модуль 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.0
Описание:
Модуль является обёрткой над библиотекой libcurl. В общем он похож на этот Вы должны зарегистрироваться, чтобы видеть ссылки., некоторые примечания и рекомендации справедливы и для этого модуля.

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

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


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

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


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

Если data установлена, тогда callback должен иметь такую сигнатуру:
Код: Выделить всё
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 для изменения вывода)

Скачать: Вы должны зарегистрироваться, чтобы видеть ссылки.
Исходники: Вы должны зарегистрироваться, чтобы видеть ссылки.
Последний раз редактировалось Polarhigh 28 авг 2016, 00:29, всего редактировалось 3 раз(а).
Аватара пользователя
Polarhigh
 
Сообщения: 998
Зарегистрирован: 04 май 2010, 17:41
Благодарил (а): 131 раз.
Поблагодарили: 376 раз.

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

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

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


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

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

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

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

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

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

Polarhigh, Curl это socket+ поддержка различных протоколов? Что лучше юзать его или socket?
Skype revcrew77
https://vk.com/cssuite
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1476
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 254 раз.
Поблагодарили: 314 раз.
Языки программирования: Unkown

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

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

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

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

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

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


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

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)
 


Или не надо?
Skype revcrew77
https://vk.com/cssuite
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1476
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 254 раз.
Поблагодарили: 314 раз.
Языки программирования: Unkown

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

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

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

>>

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

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

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

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

Subb98, я скрыл данные звездочками) там строка стоит. Я по примеру делал.
Skype revcrew77
https://vk.com/cssuite
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1476
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 254 раз.
Поблагодарили: 314 раз.
Языки программирования: 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
 
Сообщения: 998
Зарегистрирован: 04 май 2010, 17:41
Благодарил (а): 131 раз.
Поблагодарили: 376 раз.

След.

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

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

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