Иконка ресурса

AmxxCurl 1.1.1

Нет прав для скачивания
Сообщения
40
Реакции
1
круто!
27 Янв 2019
наверное:sorry:
27 Янв 2019
как проверить что он работает?:blush2:
 
Сообщения
144
Реакции
276
Помог
1 раз(а)
Приветствую господа.

Может у кого-то есть прямые контакты автора или акк на гитхабе ?

Если можно, сообщите ему, что начиная с версии 1.0.3 данный модуль крашит сервер, при попытке вызова curl_easy_perform внутри кэлбека самого curl_easy_perform на тот же CurlID. В предыдущих версиях такой проблемы не наблюдалось:

#3 0xf774a9d9 in operator delete (ptr=0xea3b1950) at /valve/build/targets/src/gcc-4.6.1/libstdc++-v3/libsupc++/del_op.cc:47
#4 0xf774aa23 in operator delete[] (ptr=0xea3b1950) at /valve/build/targets/src/gcc-4.6.1/libstdc++-v3/libsupc++/del_opv.cc:32
#5 0xedabb2e9 in AmxCurlTask::ThreadFunction() () from addons/amxmodx/modules/curl_amxx_i386.so
#6 0xedabb358 in AmxCurlTask::ThreadFunctionStatic(void*) () from addons/amxmodx/modules/curl_amxx_i386.so
#7 0xf76a5f5b in start_thread (arg=0xe9effb40) at pthread_create.c:312
#8 0xf75de36e in clone () from /lib32/libc.so.6

Фактически невозможно использовать несколько передач данных на один curl дескриптор.
 
Сообщения
144
Реакции
276
Помог
1 раз(а)
SISA, пофикшу в конце недели
в качестве воркэраунда можно использовать таск на 0 сек
Спасибо большое.

Ещё два момента:

1. В кэлбек функции curl_easy_perform не передается 4й аргумент в виде размера массива (всегда приходит нулевое значение, по крайней мере на винде).

2. Есть ли какая-то возможность связать логически работу кэлбеков CURLOPT_WRITEFUNCTION и curl_easy_perform ? Конечно, можно вкорячить ассоциативный Trie массив, но это дело такое, на любителя. Проще говоря, получить данные внутри CURLOPT_WRITEFUNCTION можно, а произвести с ними какие-то манипуляции внутри кэлбека curl_easy_perform без дополнительных костылей нельзя.
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Polarhigh, еще добавлю что есть нативы
Код:
native curl_slist:curl_slist_append(curl_slist:list, buffer[])
native void:curl_slist_free_all(curl_slist:list)
Но натива для создания/удаления curl_slist нету
 
Сообщения
47
Реакции
194
Помог
1 раз(а)
SISA,
1. в описании и не сказано что должен передаваться, я когда давно делал, рассчитывал что этот массив, как правило, будет фиксированного размера, у тебя нет? можно тогда размер добавить

2. хороший вопрос) тут надо подумать, тебе было бы как удобно пользоваться?

fantom, это такой api у libcurl https://curl.haxx.se/libcurl/c/httpcustomheader.html
на amx будет то же самое:
C:
new curl_slist:headers;
headers = curl_slist_append(headers, "Accept:");
headers = curl_slist_append(headers, "Another: yes");
headers = curl_slist_append(headers, "Host: example.com");
headers = curl_slist_append(headers, "X-silly-header;");
для очистки тоже просто curl_slist_free_all(headers);
 
Сообщения
1,176
Реакции
2,144
Помог
57 раз(а)
Polarhigh, http://amx-x.ru/viewtopic.php?f=21&t=31672
curl_easy_perform(CURL:handle, callbackComplite[], data[] = {}, data_len = 0)
Начинает передачу данных.
Имеет отличие от оригинальной функции. Так во 2-ом параметре нужно указать имя функции, которая вызовется по завершении передачи, в 3-ем параметре можно указать массив, который будет передан в функцию колбэк (в этом случае необходимо указать 4-ый параметр - размер массива).
Прототип функции колбэка: public CurlCallback(CURLcode:code, CURL:curl, data[], data_size)
Примечание: Вызов функции не блокирует сервер, выполнение передачи идёт в отдельном потоке.
Наверно это имеется ввиду. Многие путаются выходя на модуль через гугл. Это конечно не критично, но с толку сбивает. Можно при написании плагина не учесть этот момент, и столкнуться с тем, что data_size всегда будет нулевым (отработка в каллбеке будет неправильной).
 
Последнее редактирование:
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Polarhigh, без вашего ответа фиг бы сам догадался. Спасибо.
 
Сообщения
144
Реакции
276
Помог
1 раз(а)
SISA,
1. в описании и не сказано что должен передаваться, я когда давно делал, рассчитывал что этот массив, как правило, будет фиксированного размера, у тебя нет? можно тогда размер добавить

2. хороший вопрос) тут надо подумать, тебе было бы как удобно пользоваться?

fantom, это такой api у libcurl https://curl.haxx.se/libcurl/c/httpcustomheader.html
на amx будет то же самое:
C:
new curl_slist:headers;
headers = curl_slist_append(headers, "Accept:");
headers = curl_slist_append(headers, "Another: yes");
headers = curl_slist_append(headers, "Host: example.com");
headers = curl_slist_append(headers, "X-silly-header;");
для очистки тоже просто curl_slist_free_all(headers);
1. У меня фиксированный массив и проблем с этим нет, но в примерах кода (выше дали ссылку) 4й аргумент упоминается.

2. Касательно данного пункта, мне сложно сказать. Я так понимаю, там есть некий глобальный массив, который привязывается к третьему аргументу в функции curl_easy_perform, но изменить в нем данные в процессе выполнения запроса нельзя. Или нужна какая-то возможность внутри кэлбека CURLOPT_WRITEFUNCTION работать с данным массивов или один общий кэлбек. Получается так, что у нас для полноценного чтения данных надо отработать два кэлбека, и в случае CURLOPT_WRITEFUNCTION у нас лысая поляна и если мы захотим на основе полученных данных произвести дополнительные запросы в кэлбеке curl_easy_perform, нам придется очень круто изворачиваться.

P.S. У себя я эту задачу конечно решил, передав CurlID в CURLOPT_WRITEDATA и создал многомерный Trie массив с номером CurlID. Костыльно конечно, но оно работает. Но опять же, надо страдать.
 
Последнее редактирование:
Сообщения
47
Реакции
194
Помог
1 раз(а)
Я посмотрел, для дата опций, таких как CURLOPT_WRITEDATA и т.п. у меня нет поддержки массивов. Если сделать их поддержку, то можно будет один и тот же массив передать и в CURLOPT_WRITEDATA и в перформ.

Тогда сигнатуру колбэка writefunction можно сделать такой public write_callback(data[], size, nmemb, userdata[], const user_len), если в опцию передан был массив.

Еще есть опция https://curl.haxx.se/libcurl/c/CURLOPT_PRIVATE.html , но сейчас она не очень полезна т.к. опять же в нее не передать массив.
 
Последнее редактирование:
Сообщения
144
Реакции
276
Помог
1 раз(а)
Polarhigh, Если данные в этом массивен нельзя будет менять, то смысл от него не много. Наверное есть смысл оставить как есть, так или иначе решения на уровне амх всегда найдутся.
 
Сообщения
47
Реакции
194
Помог
1 раз(а)
я и предлагаю реализацию, в которой этот массив можно менять из колбэков
31 Янв 2019
я так прикинул, реализация будет нетривиальна.., не буду так делать
 
Сообщения
47
Реакции
194
Помог
1 раз(а)
fantom, сейчас сбилдить этот модуль не так уж и просто) нужно сначала самому собрать premake5, потом скачать сорсы метамода и hlsdk, ещё сбилдить все необходимые зависимости (или скачать где-нибудь). Поэтому планирую как-нибудь упростить этот процесс, необходимые инклуды метамода и hlsdk уже добавил в проект, и думаю прямо в репозитории держать скомпиленные либы, но это не точно.

SISA, добавил виндовую версию

Версию для винды не стал сначала выкладывать т.к она плохо работала), не хотел тратить время на фикс, т.к. скоро уже выложу новую версию, "без потоков", там всё норм и работает НАМНОГО быстрее, и проц не грузит, так что ждите)

А ошибка в винде такая: запуск в одном фрейме двух (и более) хэндлов курл, у которых задан путь к бандлу сертификатов, гарантированно фэйлит одну из передач. Хотя, с другой стороны, можно просто не указывать путь бандлам в винде, сейчас проверил и это работает нормально.
 
Сообщения
432
Реакции
409
Помог
14 раз(а)
(или скачать где-нибудь)
Увы, скачать бинарник libcurl негде, вчера пытался, нашел только версию 2012 года, естественно она не завелась) Поэтому было бы неплохо, если б они лежали в архивах с релизами)
 
Сообщения
47
Реакции
194
Помог
1 раз(а)
voed, может пригодится, тут всё оч. свежее https://windows.php.net/downloads/php-sdk/deps/vc15/x86/
но как сделать в проекте пока подумаю, у меня была идея включить в билд-скрипт загрузку исходников и сборку необходимых библиотек
 
Последнее редактирование:

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу