idHTTP на 2 сайта запрос уходит,на 2х ошибка 400 Bad Request

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

idHTTP на 2 сайта запрос уходит,на 2х ошибка 400 Bad Request

Сообщение jsa » 28.09.2022 08:52:57

Здравствовать всем.

Столкнулся с такой странной ситуацией.
Служба написанная на Lazarus работала с API одной организации. Периодически забрасывая туда сообщения на HTTPS с помощью TidHTTP
Потом они поменяли URL_1 адрес своего API на URL_2, и утверждают что более ничего не делали (хотя подозреваю что LAMP части там все таки других версий)
Причем 1 метод API продолжает работать со старым адресом URL_1.
Это только из моей программы.
Из Google ARC client на оба адреса запросы идут нормально.
Сообщения полностью идентичные и простые это POST запрос с телом {"imType": "test"}, т.е. никакой кириллицы

Разобраться не получилось. ТП организации дали сайты для проверки
webhook.site
httpdump.io

На них так же из ARC всё уходит , а из программы выдает "400 Bad Request" на сайте webhook.site, и "403 Forbidden" на сайте httpdump.io
Посоветовали с заголовками по разбираться.
в итоге если прописать
Код: Выделить всё
IdHTTPpostMsg.Request.ContentLength:=1000; (Длина сама корректируется до правильной) и
IdHTTPpostMsg.Request.UserAgent:='Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36';

запрос стал приходить на httpdump.io с любым Body
а на webhook.site по прежнему ничего недоходит и ошибка возвращается "400 Bad Request"

В теме плохо разбираюсбь по этому накопал разные заголовки Headers и попробовал их добавлять.
Код: Выделить всё
IdHTTPpostMsg.Request.Host:='webhook.site';
IdHTTPpostMsg.Request.Accept:='application/json';
IdHTTPpostMsg.Request.AcceptLanguage:='en-US,en;q=0.8';
IdHTTPpostMsg.Request.AcceptEncoding:='gzip, deflate';
IdHTTPpostMsg.Request.AcceptCharSet:= 'ISO-8859-1,utf-8;q=0.7,*;q=0.7';
IdHTTPpostMsg.Request.CustomHeaders.AddValue('keep-alive', '300');
IdHTTPpostMsg.Request.CustomHeaders.AddValue('connection', 'keep-alive');
IdHTTPpostMsg.Request.CustomHeaders.AddValue('pragma', 'no-cache');
IdHTTPpostMsg.Request.CustomHeaders.AddValue('cache-control', 'no-cache');   


На отправку на сайт httpdump.io они не влияют никак вообще (ни наличие, ни отсутсвие).
и ситуацию с webhook.site тоже не исправляют.

В итоге имеется программа которая на 2 адреса работает httpdump.io и URL_1 , а на 2 не работает webhook.site и URL_2

Может кто сталкивался и может подсказать решение или зацепку?
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: idHTTP на 2 сайта запрос уходит,на 2х ошибка 400 Bad Req

Сообщение grot » 28.09.2022 15:29:46

Если "из ARC всё уходит",
надо разгадать детскую загадку: чем Ваш запрос отличается от запроса ARC и
устранить эти отличия...

Заодно и матчасть подучите !
grot
новенький
 
Сообщения: 74
Зарегистрирован: 13.02.2010 16:33:03

Re: idHTTP на 2 сайта запрос уходит,на 2х ошибка 400 Bad Req

Сообщение Alex2013 » 29.09.2022 13:18:12

Если Google ARC client жужжит посмотрите запрос через отладку в браузере ( F12 -> network) и/или в коде страницы .
Еще (маловероятно но вдруг) возможны проблемы с HTTPS. ( Реализации как-бы одних и тех-же библиотек на самом деле бывают разные ) + URL_2 мог "даунгрейдится" до примитивного HTTP ( пирчем URL вроде верный но браузер эти коллизии решает автоматом, а программа так скорее всего не умеет )

Еще в Лазаре есть загадочные проблемы с HTTPS в 64 бита ( приходится перебрать версии DLL и на удивление могут работать версии 32-бита тогда как "родные" (для 64-х бит) мрачно глючат )+ Настоятельно рекомендую не полагаться на библиотеки SSL зарегистрированные в системе ( Не знаю как в Линуксе но в Винде одному черту известно что именно из библиотечной помойки подключиться в текущий момент ) .

Запрос POST штука хитрая, там на результат могут влиять вроде бы совершенно незначительные вещи вроде лишнего пробела или практически не заметного в "дампе отладчика" ( то бишь при использовании опции "исследовать элемент" в браузере ) перевода строки в конце запроса .
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: idHTTP на 2 сайта запрос уходит,на 2х ошибка 400 Bad Req

Сообщение Снег Север » 30.09.2022 08:57:47

Alex2013 писал(а): в Винде одному черту известно что именно из библиотечной помойки подключиться в текущий момент

Как раз в винде абсолютно гарантировано подключаются те длл, которые лежат рядом с экзешником. В отличии от линуксовских "помоек", в которых невесть что всегда.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: idHTTP на 2 сайта запрос уходит,на 2х ошибка 400 Bad Req

Сообщение Alex2013 » 02.10.2022 09:08:15

Снег Север писал(а):Как раз в винде абсолютно гарантировано подключаются те длл, которые лежат рядом с экзешником. В отличии от линуксовских "помоек", в которых невесть что всегда.

Ага но "кто-же его посадит - он же памятник"... То есть в винде если положил DLL "рядом с экзешником" то это более менее гарантирует от странностей поисков DLL. Но вот в чем беда, можно использовать некий пакет, в котором используются редкие функции якобы "системных" DLL . И поскольку все вроде бы работает то можно этого не заметить ( авторы пакта в описании обычно забывают упоминать, что они использовали например некую comctl32.dll или libeay32.dll ) вот только в разных версиях DLL есть "тонкие эффекты", что вылезают в самый неподходящий момент. Тут-то и замечаешь, что программа "живет" даже не в "зоопарке", а в "джунглях".

Поэтому я и написал, что для использования "опен SSL" очень желательно проследить, что нужные библиотеки лежат "под боком" (Обычно это ssleay32.dll и libeay32.dll ).
А в Линуксе по идее можно просто обозвать "свои" библиотеки МуProg_XXXX.so (разумеется если это не библиотеки условного "ядра ОС" ) и тогда после их регистрации на проблему разных версий, обычно тоже можно забить.
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: idHTTP на 2 сайта запрос уходит,на 2х ошибка 400 Bad Req

Сообщение jsa » 03.10.2022 13:13:03

grot писал(а):Если "из ARC всё уходит",
надо разгадать детскую загадку: чем Ваш запрос отличается от запроса ARC и
устранить эти отличия...

Если вам не достаточно, этого утверждения - "Сообщения полностью идентичные и простые это POST запрос с телом {"imType": "test"}, т.е. никакой кириллицы "
Дополню - Моя прогарамма пишет в log файл всё.
Я копирую из лога URL, заголовки, и тело сообщения, в ARC.
Как предлагаете найти отличия в этом случае? и разгадать эту детскую загадку?

grot писал(а):Заодно и матчасть подучите !
Можете уточнить, о каком матчасти идет речь, а то ее самой разной столько много... не знаю с чего начать чтобы приобщиться к мудрости наимудрейшего советчика.

Добавлено спустя 4 минуты 51 секунду:
Alex2013 писал(а):Еще (маловероятно но вдруг) возможны проблемы с HTTPS. ( Реализации как-бы одних и тех-же библиотек на самом деле бывают разные ) + URL_2 мог "даунгрейдится" до примитивного HTTP ( пирчем URL вроде верный но браузер эти коллизии решает автоматом, а программа так скорее всего не умеет )


Если бы дело было только в программе и ARC клиенте. Но ведь и два разных вебхук сервера ведут себя по разному, один принимает запросы. а другой нет.

Alex2013 писал(а):Еще в Лазаре есть загадочные проблемы с HTTPS в 64 бита ( приходится перебрать версии DLL и на удивление могут работать версии 32-бита тогда как "родные" (для 64-х бит) мрачно глючат )+ Настоятельно рекомендую не полагаться на библиотеки SSL зарегистрированные в системе ( Не знаю как в Линуксе но в Винде одному черту известно что именно из библиотечной помойки подключиться в текущий момент ) .

Обе библиотеки лежят рядом с программой. 32хбитные. Причем я и другие сборки накачал, попробовал несколько пар dll, на результат не влияет.

Alex2013 писал(а):Запрос POST штука хитрая, там на результат могут влиять вроде бы совершенно незначительные вещи вроде лишнего пробела или практически не заметного в "дампе отладчика" ( то бишь при использовании опции "исследовать элемент" в браузере ) перевода строки в конце запроса .

я пока не понял о каком браузере речь. Я сообщил о своей программе и программе ARC , поищу там отладчик. но он примитивные там похоже нет такого.
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: idHTTP на 2 сайта запрос уходит,на 2х ошибка 400 Bad Req

Сообщение Alex2013 » 05.10.2022 22:24:47

jsa писал(а):я пока не понял о каком браузере речь. Я сообщил о своей программе и программе ARC , поищу там отладчик. но он примитивные там похоже нет такого.

Хром или Яндекс ( что почти одно и тоже но есть нюансы )..
Зы
Я кстати сам намедни idHTTP поюзал. Для проверки существования файла в интернете не много из "пушки по воробьям" но работает .
Код: Выделить всё
Function  TForm1.URLCheck(URL:String):Boolean;
begin
try
result:=true;
IdHTTP1.HTTPOptions := IdHTTP1.HTTPOptions + [hoNoProtocolErrorException];
IdHTTP1.Head(URL);
result := IdHTTP1.Response.ResponseCode = 200;
except
result:=False;
end;
end;

В Дельфи работала вот такая зигагулина!
Код: Выделить всё
uses wininet;

function CheckUrl(url: string): boolean;
var
  hSession, hfile, hRequest: hInternet;
  dwindex, dwcodelen: dword;
  dwcode: array [1..20] of char;
  res: pchar;
begin
  if pos('http://', lowercase(url)) = 0 then
    url := 'http://'+url;
  Result := false;
  hSession := InternetOpen('InetURL:/1.0', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if assigned(hsession) then
  begin
    hfile := InternetOpenUrl(hsession, pchar(url), nil, 0, INTERNET_FLAG_RELOAD, 0);
    dwIndex := 0;
    dwCodeLen := 10;
    HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE, @dwcode, dwcodeLen, dwIndex);
    res := pchar(@dwcode);
    result := (res = '200') or (res = '302');
    if assigned(hfile) then
      InternetCloseHandle(hfile);
    InternetCloseHandle(hsession);
  end;
end;

Но в Лазарусе wininet нет ...
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: idHTTP на 2 сайта запрос уходит,на 2х ошибка 400 Bad Req

Сообщение jsa » 10.02.2023 13:19:05

Проблему так и не смог решить.
Загадка остается.
из одной и той же программы. один и тот же запрос
на
webhook.site - не приходит
httpdump.io - приходит нормально.
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: idHTTP на 2 сайта запрос уходит,на 2х ошибка 400 Bad Req

Сообщение delphius » 11.02.2023 01:13:51

jsa писал(а):Проблему так и не смог решить.
Загадка остается.
из одной и той же программы. один и тот же запрос
на
webhook.site - не приходит
httpdump.io - приходит нормально.

Добрый!
Исходных данных маловато все равно :)
Я взял для теста загрузил последнюю версию Indy с гитхаба https://github.com/IndySockets/Indy (вроде как 10.6.2.0, но это не точно :D )
Собрал ее под fpc 3.2.2 64bit в vscode, без лазаря
Взял libeay32.dll и ssleay32.dll под 64bit отсюда https://github.com/IndySockets/OpenSSL-Binaries, вернее, они у меня уже были.

Написал простенькую программу, получив предварительно идентификатор с https://webhook.site
Код: Выделить всё
program apitest;

uses Classes, SysUtils, IdHTTP;

var IdHTTP1 : TIdHTTP;
    s : string;
    JsonToSend: TStringStream;

begin
  JsonToSend := TStringStream.Create('{"imType": "test"}');
  try
    try
      IdHTTP1 := TIdHTTP.Create( nil );
      IdHTTP1.Request.ContentType := 'application/json';
      s := IdHTTP1.Post( 'https://webhook.site/cb9e2c92-40c7-475c-80c6-889361d8d3e8', JsonToSend);
      s := 'Responce code: ' + IntToStr(IdHTTP1.ResponseCode) + LineEnding + 'Responce text: ' + IdHTTP1.ResponseText;
    except
      on E: EIdHTTPProtocolException do s := 'Error code: ' + IntToStr(E.ErrorCode) + LineEnding + 'Message: ' + E.Message + LineEnding + 'Error message: ' + E.ErrorMessage;
    end;
    writeln(s);
  finally
    IdHTTP1.Free;
  end;
  JsonToSend.Free;
end.


Получил уверенный ответ от тестового сайта, что все ок.
https://ibb.co/R3x0Dnk

Поигрался с https://petstore.swagger.io/#/, чтобы получать и обрабатывать ошибки...

Так в чем конкретно ВАША проблема :?:
Какой точный набор хедеров используется в ошибочном запросе?
Как нам воспроизвести вашу проблему, чтобы помочь с ее решением?)
delphius
постоялец
 
Сообщения: 122
Зарегистрирован: 18.03.2020 13:40:11

Re: idHTTP на 2 сайта запрос уходит,на 2х ошибка 400 Bad Req

Сообщение jsa » 15.02.2023 13:10:55

delphius писал(а):Так в чем конкретно ВАША проблема :?:
Какой точный набор хедеров используется в ошибочном запросе?
Как нам воспроизвести вашу проблему, чтобы помочь с ее решением?)


1. Спасибо, из-за этого сообщения я снова переделал код и в этот раз в какой-то момент сообщения стали доходить.
т.е. сегодня тестов 5 выдавало "400 бедреквест", а потом запрос стал проходить на сайт.
2. Ситуацию по прежнему не понимаю. Т.к. я и до этого перебрал на наличие и отсутствие всех заголовкой по списку.
3. Сейчас возможно сработало потому что я нетолько убрал всё что писал в заголовки. (это не сработало) Но и добавил то что в компоненте уже прописано по умолчанию и так
Код: Выделить всё
IdHTTP1.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
IdHTTP1.Request.UserAgent:='Mozilla/3.0 (compatible; Indy Library)'; 

4. Проблема в том что сработав раз, работает и после того как я убираю эти строки и перекомпилирую приложение.
Скадывает абсурдное ощущение, что сайт получив эти заголовки 1 раз в дальнейшем в них не нуждается.
5. Так же не понятно, почему не было достаточно того, что в компоненте уже прописано по умолчанию.


В общем ситуация глупая.
Почему не работало, не понятно.
Почему заработало точно тоже не известно, есть только предположения.
И воспроизвести работу с ошибкой тоже не могу.
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: idHTTP на 2 сайта запрос уходит,на 2х ошибка 400 Bad Req

Сообщение Alex2013 » 15.02.2023 17:33:34

jsa писал(а):
delphius писал(а):Так в чем конкретно ВАША проблема :?:
Какой точный набор хедеров используется в ошибочном запросе?
Как нам воспроизвести вашу проблему, чтобы помочь с ее решением?)


1. Спасибо, из-за этого сообщения я снова переделал код и в этот раз в какой-то момент сообщения стали доходить.
т.е. сегодня тестов 5 выдавало "400 бедреквест", а потом запрос стал проходить на сайт.
2. Ситуацию по прежнему не понимаю. Т.к. я и до этого перебрал на наличие и отсутствие всех заголовкой по списку.
3. Сейчас возможно сработало потому что я нетолько убрал всё что писал в заголовки. (это не сработало) Но и добавил то что в компоненте уже прописано по умолчанию и так
Код: Выделить всё
IdHTTP1.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
IdHTTP1.Request.UserAgent:='Mozilla/3.0 (compatible; Indy Library)'; 

4. Проблема в том что сработав раз, работает и после того как я убираю эти строки и перекомпилирую приложение.
Скадывает абсурдное ощущение, что сайт получив эти заголовки 1 раз в дальнейшем в них не нуждается.
5. Так же не понятно, почему не было достаточно того, что в компоненте уже прописано по умолчанию.


В общем ситуация глупая.
Почему не работало, не понятно.
Почему заработало точно тоже не известно, есть только предположения.
И воспроизвести работу с ошибкой тоже не могу.

Подсказка Indy умеет "играть в куки", а куки разумеется один раз появившись дальше работают как "аусвайс" ... ( впрочем это неточно, но возможно куки запоминаются где-то в системе или даже кэшируются на промежуточном сервере )+ есть система сертификатов SSL ( если все в порядке она совершенно прозрачна, но стоит сети "зарубить запрос" моментально эту "прозрачность" теряет. ) .
Зы
Кстати все-же wininet нашел (искал winnet а этого модуля разумеется в лазарусе нет )
"...lazarus\fpc\3.0.4\source\packages\winceunits\src\wininet.pp "
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: idHTTP на 2 сайта запрос уходит,на 2х ошибка 400 Bad Req

Сообщение delphius » 15.02.2023 23:11:35

jsa писал(а):Проблема в том что сработав раз, работает и после того как я убираю эти строки и перекомпилирую приложение.
Скадывает абсурдное ощущение, что сайт получив эти заголовки 1 раз в дальнейшем в них не нуждается.

Что-то я не верю в чудеса :)
Есть RFC 7230 https://efim360.ru/rfc-7230-protokol-peredachi-giperteksta-http-1-1-sintaksis-soobshheniya-i-marshrutizacziya/#3-Message-Format, там все четко описано кто, что, как и когда должен говорить с одной и с другой стороны и как интерпретировать ответы

Alex2013 писал(а):Indy умеет "играть в куки", а куки разумеется один раз появившись дальше работают как "аусвайс"

При общении с тестовым сайтом, который вываливал 400, никаких куки точно не было и Indy тут не при чем в этом плане :D
https://developer.mozilla.org/ru/docs/Web/HTTP/Cookies

jsa писал(а):Сейчас возможно сработало потому что я нетолько убрал всё что писал в заголовки. (это не сработало) Но и добавил то что в компоненте уже прописано по умолчанию и так

Все верно, если убрать все заголовки, то остается Accept и UserAgent, которые выставляются по умолчанию самим Indy. Не забудьте, что если хотите ответы от сервера получать и парсить в json, то в Accept надо вместо всего прописать application/json, а в варианте по умолчанию Indy, как клиент, заявляет, что принимает и ответ и ошибки в xml (application/xml)
И соответственно нужно явно указывать, в каком формате вы отправляете на сервер body запроса post (ContentType := 'application/json' для json)

Ну это по канонам RFC, самописные сервера могут извращаться каждый по своему :)

jsa писал(а):Почему заработало точно тоже не известно, есть только предположения.

Работает - не трогай (с) :mrgreen:
Дело закрыто :!:
delphius
постоялец
 
Сообщения: 122
Зарегистрирован: 18.03.2020 13:40:11


Вернуться в Lazarus

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

Сейчас этот форум просматривают: Alex2013, Google [Bot], Yandex [Bot] и гости: 32

Рейтинг@Mail.ru