libcurl for Clarion

Программы на Clarion, шаблоны, библиотеки и пр.
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2643
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

libcurl for Clarion

Сообщение Дед Пахом »

Вообще-то полезнее было бы посмотреть не на декларацию метода XFerInfo, а на его реализацию.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

libcurl for Clarion

Сообщение Игорь Столяров »

Там ничего военного, правда есть один спорный момент с использованием xIndicator_ ...
Но сразу хочу сказать, что проблему наблюдаю при вызове с xIndicator_ = 0.

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

LoadFileHTTP         PROCEDURE  (LocalFile_,URL_,xIndicator_)

TCurlHTTPClassEx  Class(TCurlHTTPClass),Type
XFerInfo            PROCEDURE(REAL dltotal, REAL dlnow, REAL ultotal, REAL ulnow), LONG, DERIVED
                  end
MyCurl            TCurlHTTPClassEx

  Code
  MyCurl.Init()
  ...
  CurlRes = MyCurl.ReadFile(URL_, LocalFile_)
  ... ! Обработка ошибок и завершение
  
  ! --- Собственно переопределение индикации загрузки

TCurlHTTPClassEx.XFerInfo  PROCEDURE(REAL dltotal, REAL dlnow, REAL ultotal, REAL ulnow)

  Code

  If xIndicator_ > 0

     If dlnow
        If dltotal           
           xIndicator_{Prop:Progress} = dlnow * 100 / dltotal
        else
           xIndicator_{Prop:Progress} = dlnow / 1000
        end
     end
  end

  RETURN 0
«V» значит Вендетта !
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2643
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

libcurl for Clarion

Сообщение Дед Пахом »

Очень похоже на проблему, на которую многие жалуются (например здесь) - вызов функции без проверки возвращаемого значения. То есть к примеру объявлена функция

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

Proc1 PROCEDURE(), LONG
а в коде она вызывается

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

  Proc1()   !- вместо ret = Proc1()
В базовом классе TCurlClass XFerInfo имеет атрибут PROC, а у Вас в наследнике его нет, попробуйте добавить:

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

XFerInfo                        PROCEDURE(REAL dltotal, REAL dlnow, REAL ultotal, REAL ulnow), LONG, PROC, VIRTUAL
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

libcurl for Clarion

Сообщение Игорь Столяров »

Спасибо ! Понял, сейчас буду исправлять и тестировать ...
Я это сообщение на CHUB видел, но пропустил, т.к. всегда слежу за типизацией параметров процедур (сложно отлавливаемые проблемы).
А переопределение XFerInfo брал из примера к LibCurl и наверно пропустил изменения параметров при обновлении библиотеки. :(
«V» значит Вендетта !
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2643
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

libcurl for Clarion

Сообщение Дед Пахом »

Игорь Столяров писал(а): 02 Октябрь 2020, 14:58 сейчас буду исправлять и тестировать ...
Держите в курсе...
С уважением, ДП
IKSoft
Посетитель
Сообщения: 39
Зарегистрирован: 27 Май 2010, 12:38

libcurl for Clarion

Сообщение IKSoft »

Доброго всем дня!

Читаю доку по одному сайту (RestAPI, JSON)
При вызове любого метода сервиса для установления защищенного по ГОСТ https-соединения необходимо передавать сведения о сертификате инициатора запроса (тот же сертификат, который используется для входа в защищенный Личный кабинет на официальном сайте ).
Например, на языке программирования C# это будет выглядеть следующим образом:

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

public HttpClient CreateHttpClient (X509Certificate2 cert) {
  var handler = new WebRequestHandler();
  handler.ClientCertificates.add(cert);
  return new HttpClient(handler);
}

В curl это будет так?:

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

curl.SetOpt(CURLOPT_POSTFIELDS, 'Двоичное DER-представление X.509-сертификата пользователя')
curl.SetOpt(CURLOPT_POSTFIELDSIZE, LEN(CLIP('Двоичное DER-представление X.509-сертификата пользователя')))
Это я выискал в этой ветке...
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2643
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

libcurl for Clarion

Сообщение Дед Пахом »

Не пробовал, но логичнее использовать CURLOPT_SSLCERT, CURLOPT_SSLCERTTYPE:

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

sCertFile  STRING(256), AUTO
sCertType STRING(20), AUTO
  sCertFile = 'estcert.pem'
  sCertType = 'PEM'
  curl.SetOpt(CURLOPT_SSLCERT, sCertFile)
  curl.SetOpt(CURLOPT_SSLCERTTYPE, sCertType)
С уважением, ДП
IKSoft
Посетитель
Сообщения: 39
Зарегистрирован: 27 Май 2010, 12:38

libcurl for Clarion

Сообщение IKSoft »

Cgfcb,j
Дед Пахом писал(а): 14 Октябрь 2020, 15:56 Не пробовал, но логичнее использовать CURLOPT_SSLCERT, CURLOPT_SSLCERTTYPE:

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

sCertFile  STRING(256), AUTO
sCertType STRING(20), AUTO
  sCertFile = 'estcert.pem'
  sCertType = 'PEM'
  curl.SetOpt(CURLOPT_SSLCERT, sCertFile)
  curl.SetOpt(CURLOPT_SSLCERTTYPE, sCertType)
Спасибо, просто меня смутила фраза "передавать сведения "
Если бы просто написали, надо использовать свой сертификат для SSL, тогда понятно

Если смогу подключиться - отпишу (не скоро, рутины много...)
IKSoft
Посетитель
Сообщения: 39
Зарегистрирован: 27 Май 2010, 12:38

libcurl for Clarion

Сообщение IKSoft »

на
CURLOPT_SSLCERT
unable to set private key file: 'SSL\MyCert.pem' type PEM

Ведь для SSL нужен и секретный ключ, кроме самого сертификата
получается, надо и
CURLOPT_SSLKey
Аватара пользователя
Alex
Старожил
Сообщения: 200
Зарегистрирован: 29 Август 2005, 13:54
Откуда: Белоруссия

libcurl for Clarion

Сообщение Alex »

Прошу совета. Для решения задачи получения данных от веб сервиса использую libcurl. Ответ возвращается в виде строки JSON.
Часть JSON ответа кодирована Esc кодировкой( не латинские буквы).
Чем воспользоваться для превращения JSON ответа в QUEUE?
= FromJSON , описанным в хелпе нашего IDE (CW11)
= cJSON библиотекой
= Capesoft JSON
= или что-то иное
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

libcurl for Clarion

Сообщение Игорь Столяров »

Наверно, ответить по существу можно только видя распарсиваемый JSON.
Инструмент выбирается по задаче, нам вполне хватает штатного FromJSON.

P/S: А что JSON ключница делала ? Почему только часть ответа в ESC кодировке ? ;)
«V» значит Вендетта !
Аватара пользователя
Alex
Старожил
Сообщения: 200
Зарегистрирован: 29 Август 2005, 13:54
Откуда: Белоруссия

libcurl for Clarion

Сообщение Alex »

Игорь Столяров писал(а): 23 Март 2021, 14:23 P/S: А что JSON ключница делала ? Почему только часть ответа в ESC кодировке ?
Например, при запросе по API получить список брэндов, латинобуквенные не кодируются , остальные кодируются.
Пример (фрагмент) ответа API:
Spoiler

{"STATUS":200,"MESSAGES":[],"RESP":["1-2-PRO","1000 MIGLIA","16F","1AAAPARTS","1NEW","2X3","3F QUALITY","3GTTP","3M","3RG","3TON","4CR","4MAX","4RIDE","4SEASONS","4U","4WALLS","555","5BITES","5M","7 DAYS","77","888","A-ENGINEERING","A-GIST","A-GRESSOR","A-KOR","A-LIFT","A-MEGA","A-N PARTS","A-ONE","A-SPORT","A-TECH","A-VM","A.B.S.","A.D.M.","A.D.R.","A.S.DIXON","A2DM","A4TECH","AA","AA-TOP","AB TRUCK PARTS","AB-FILTER","AB-PARTS","ABA","ABAC","ABAKUS","ABAL","ABB","ABE","ABESTA","ABEX","ABG","ABLTON","ABRAFLEX","ABRO","ABSCO","ABSOLUT","ABT","ABW","AC","AC DELCO","AC-ACCESSORIES","AC\/DC","ACA","ACADEMY","ACADEMY STYLE","ACAR","ACCURIDE","ACE TRI-STAR","ACER","ACERBI","ACERMANN","ACHEMA","ACHILLES","ACHIM","ACHR","ACKOJA","ACL","ACME","ACME-TRUMP","ACN","ACQ","ACR","ACROLCAR","ACS","ACTIO","ACTION","ACTION!","ACTIVEAVTO","ACTIVPROFI","ACTM","ACTUAL","ACUMEN","ACURA","ACV","AD","AD KUHNER","AD RADIATORS","AD-PARTS","ADAICO","ADAMAL","ADBLUE","ADDAX-Q","ADDBLUEOFF","ADDINOL","ADELTECH","ADI","ADIDAS","ADK","ADL","ADMAL","ADR","ADRIAUTO","ADVAN-TECH","ADVICS","ADVOCAM","AE","AE&T","AE-LUS","AEBI","AEG","AEOLUS","AEP","AER DIESEL","AERO","AERO COMFORT","AEROCDM","AEROSTAR","AES","AEZ","AFA","AFAM","AFB","AFK","AFTERMARKET CHINA","AG","AG CHEM EQUIPMENT","AG DIESEL","AGA","AGAMA","AGAT AVTO","AGATEK","AGC","AGCO","AGG","AGIP","AGIS","AGRIA","AG\u0421","AHMAD TEA","\u0410\u0420\u0422\u0418","\u0410\u0420\u0422\u0424\u041e\u0420\u041c","\u0410\u0421\u041e\u041c\u0418","\u0410\u0421\u0422\u0415\u041a\u0421","\u042f \u0420\u041e\u0414\u0418\u041b\u0421\u042f","\u042f\u0412\u0412\u0410","\u042f\u0412\u0422\u0423\u0428\u0415\u041d\u041a\u041e","\u042f\u0417\u0414\u0410","\u042f\u0417\u0422\u041e-\u0410\u0412\u0422\u041e","\u042f\u0420\u041a\u0418\u0419 \u041b\u0423\u0427","\u042f\u0420\u041f\u041e\u0416\u0418\u041d\u0412\u0415\u0421\u0422","\u042f\u0420\u0422\u0418","\u042f\u0421\u041c\u0410","\u042f\u0428\u041a\u0418\u041d\u041e","\u042f\u0428\u0424","\u21161 SCHOOL"]}
Поля не разделяются фигурными скобками. Нет имен полей. Только значения.
Последний раз редактировалось Alex 23 Март 2021, 14:38, всего редактировалось 1 раз.
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1229
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

libcurl for Clarion

Сообщение RaFaeL »

Alex писал(а): 23 Март 2021, 12:58 Прошу совета. Для решения задачи получения данных от веб сервиса использую libcurl. Ответ возвращается в виде строки JSON.
Часть JSON ответа кодирована Esc кодировкой( не латинские буквы).
Чем воспользоваться для превращения JSON ответа в QUEUE?
= FromJSON , описанным в хелпе нашего IDE (CW11)
= cJSON библиотекой
= Capesoft JSON
= или что-то иное
Использую FromJSON от С10, но несколько раз его правил, так как сервисов уже десятки, везде разные "приколы" скажем так
Плюс для перекодировки разного, что встречается в ответах, написал (или откуда-то скопировал) всякие свои мелкие процедуры

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

DecodeStr            PROCEDURE(*string sIn)

c2        STRING(16)
c3        CSTRING(16)
c4        CSTRING(16)
sOut      &CSTRING

Blength   LONG
Slength   LONG
  CODE
  Blength = len(clip(sIn)) + 100
  sOut &= NEW(CSTRING(Blength))
  clear(sOut)
  loop 
    i# += 1
    if len(clip(sIn)) < i# then break.
    case sIn[i#]
    of '\'
      if len(clip(sIn)) < i#+1 then break.
      case sIn[i#+1]
      of 'b'
        sOut = sOut &'<08>'
      of 't'
        sOut = sOut &'<09>'
      of 'n'
        sOut = sOut &'<10>'
      of 'f'
        sOut = sOut &'<12>'
      of 'r'
        sOut = sOut &'<13>'
      of 'u'
        clear(c2)
        c3 = sub(sIn,i#+4,2)
        ccc1# = strtol(c3,ccc2#,16)
        c2[1] = chr(ccc1#)
        c3 = sub(sIn,i#+2,2)
        ccc1# = strtol(c3,ccc2#,16)
        c2[2] = chr(ccc1#)

        c3 = all('<0>',size(c3))
        c4 = all('<0>',size(c4))

        c4 = clip(c2)
        Blength = size(c4)
        Slength = size(c3)
        RetCode# = winapi::WideCharToMultiByte (1251, 0, address(c4), Blength, address(c3), Slength, 0, 0)
        sOut = sOut & clip(c3)

        i#+= 4
      else 
        sOut = sOut & sIn[i#+1]
      end 
      i#+= 1
    else 
      sOut = sOut & sIn[i#]
    end 
  end
  sIn = sOut
  dispose(sOut)

Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1229
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

libcurl for Clarion

Сообщение RaFaeL »

Alex писал(а): 23 Март 2021, 14:28 Поля не разделяются фигурными скобками. Нет имен полей. Только значения.
В квадратных скобках это массив одномерный, там и не должно быть ничего, кроме значений
Аватара пользователя
Alex
Старожил
Сообщения: 200
Зарегистрирован: 29 Август 2005, 13:54
Откуда: Белоруссия

libcurl for Clarion

Сообщение Alex »

Т.е. стОит попробовать встроенный класс JSON. Посмотрел examples, не пойму как указывать разметку перед парсингом FromJSON.. Как я понимаю, надо ведь указать разделители ...
Ответить