Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Content-Length не ставится для Msxml2.XMLHTTP / 15 сообщений из 15, страница 1 из 1
04.02.2022, 00:36
    #40131587
evgen29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
Здравствуйте! Пытаюсь отправить zip-файл на сервер и поставить его длину в Content-Length.
Сервер отвечает заголовком, который я шлю в запросе. Почему-то длина при отправке файла всегда отличается от той, которую я прописываю. Пробовал посылать те же заголовки через Postman. Там длина правильная отправляется.
Не пойму, в чем дело и почему при использовании com-объекта идет не та длина.
Из-за этого сервер не хочет файл читать

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
//    Request := CreateOleObject('WinHttp.WinHttpRequest.5.1');
//    Request := CreateOleObject('Msxml2.ServerXMLHTTP.6.0');
//  Request := CreateOleObject('Microsoft.XMLHTTP');
  Request := CreateOleObject('Msxml2.XMLHTTP');

//...

      if sendfile = True then
      begin
        filedata := '';
        fs := TFileStream.Create(data, fmOpenRead + fmShareDenyWrite);
        fs.Seek(0, soFromBeginning);
        repeat
          fs.Read(Symb, sizeof(symb));
          filedata := filedata + Symb;
        until fs.Position = fs.Size;
        fs.Free;
        j:=Length(filedata)*SizeOf(Char);



   //     Request.SetRequestHeader('Cache-Control', 'public');
       // Request.SetRequestHeader('Content-Description', 'File Transfer');

        Request.SetRequestHeader('Content-Type', 'application/zip');
//        Request.SetRequestHeader('Content-Disposition', 'attachment;filename="'+ExtractFileName(data)+'"');
        Request.SetRequestHeader('Content-Transfer-Encoding','Binary');
        Request.SetRequestHeader('Content-Length', Length(filedata)*SizeOf(Char));
       // Request.SetRequestHeader('Accept', '*/*');
        Request.SetRequestHeader('Accept-Encoding', 'gzip, deflate, br');
        Request.SetRequestHeader('Connection', 'keep-alive');

        TLogClass(lc).WriteLog('send...');
        //filedata := 'Content-Length: '+IntToStr(Length(filedata)*SizeOf(Char))+';'+#10+filedata;

        Request.Send(filedata);
...
Рейтинг: 0 / 0
04.02.2022, 01:35
    #40131592
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
var
  StrmObj: TStream;
  StrmIntf: IStream;
begin
  Request := CreateOleObject('Msxml2.XMLHTTP');

//...

      if sendfile = True then
      begin
        StrmObj := TFileStream.Create(data, fmOpenRead + fmShareDenyWrite);
        StrmIntf := TStreamAdapter.Create(StrmObj, soOwned);

        Request.SetRequestHeader('Content-Type', 'application/zip');
//        Request.SetRequestHeader('Content-Disposition', 'attachment;filename="'+ExtractFileName(data)+'"');
        Request.SetRequestHeader('Content-Transfer-Encoding','Binary');
        Request.SetRequestHeader('Content-Length', StrmObj.Size);
       // Request.SetRequestHeader('Accept', '*/*');
        Request.SetRequestHeader('Accept-Encoding', 'gzip, deflate, br');
        Request.SetRequestHeader('Connection', 'keep-alive');

        TLogClass(lc).WriteLog('send...');

        Request.Send(StrmIntf);
...
Рейтинг: 0 / 0
04.02.2022, 02:04
    #40131593
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
Код: pascal
1.
if sendfile <> false
...
Рейтинг: 0 / 0
04.02.2022, 02:37
    #40131595
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
ъъъъъ
Код: pascal
1.
if sendfile <> false

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TForm1.Button1Click(Sender: TObject);
var
  LTest: Boolean;
  LStr: string;
begin
  LStr := '';
  LTest := Boolean(5);
  if LTest then
    LStr := LStr + 'Test is true'#13#10;
  if LTest = True then
    LStr := LStr + 'Test equal true'#13#10;
  if LTest <> False then
    LStr := LStr + 'Test not equal false'#13#10;
  ShowMessage(LStr);
end;


Test is true
Test not equal false
...
Рейтинг: 0 / 0
04.02.2022, 03:08
    #40131597
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
_Vasilisk_,
...
Рейтинг: 0 / 0
04.02.2022, 04:58
    #40131601
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
_Vasilisk_
ъъъъъ
Код: pascal
1.
if sendfile <> false

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TForm1.Button1Click(Sender: TObject);
var
  LTest: Boolean;
  LStr: string;
begin
  LStr := '';
  LTest := Boolean(5);
  if LTest then
    LStr := LStr + 'Test is true'#13#10;
  if LTest = True then
    LStr := LStr + 'Test equals true'#13#10;
  if LTest <> False then
    LStr := LStr + 'Test is not equal false'#13#10;
  ShowMessage(LStr);
end;


Test is true
Test not equal false
...
Рейтинг: 0 / 0
04.02.2022, 11:54
    #40131653
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
Из интереса спрошу: а зачем так извращаться? OLE либо для убогих недоязыков типа vba, либо если нет нормального API. Почему бы не использовать winhttp через API?
...
Рейтинг: 0 / 0
04.02.2022, 13:54
    #40131680
evgen29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
_Vasilisk_,
спасибо, дружище!

ps: правда если писать
Код: pascal
1.
        StrmIntf := TStreamAdapter.Create(StrmObj, soOwned);


, то при CoUnInitialize выдает Access Violation,
а если по ссылке
Код: pascal
1.
        StrmIntf := TStreamAdapter.Create(StrmObj, soReference);



, то норм.
...
Рейтинг: 0 / 0
04.02.2022, 13:56
    #40131681
evgen29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
Fr0sT-Brutal, можно сделать тысячью способов.
Вам нравится api. Мне например нет. Надо извратиться и написать куча кода для простых операций. Я к API прибегаю по необходимости. Можно скачать компонент типа Indy и сделать в нём.
...
Рейтинг: 0 / 0
04.02.2022, 14:19
    #40131687
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
evgen29, ну, как говорится, каждый человек сам кузнец собственного геморроя
...
Рейтинг: 0 / 0
04.02.2022, 15:15
    #40131704
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
evgen29
, то норм.
Нет не норм. Вы получили утечку
evgen29
, то при CoUnInitialize выдает Access Violation,
Сделайте явно
Код: pascal
1.
2.
StrmIntf := nil;
Request = null;
...
Рейтинг: 0 / 0
04.02.2022, 16:48
    #40131738
evgen29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
_Vasilisk_, а разве Request не обнуляется после CoUnInitialize? Или перед ним его надо явно делать null? Я думал CoUnInitialize счётчик ссылок тоже уменьшает... Или я чето путаю...

вот так работает:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
  try
    CoInitialize(nil);
    errresponsetext:='';
  Request := CreateOleObject('Msxml2.XMLHTTP');
        StrmObj := TFileStream.Create(data, fmOpenRead + fmShareDenyWrite);
        StrmIntf := TStreamAdapter.Create(StrmObj, soReference);
        try
          Request.SetRequestHeader('Content-Type', 'application/zip');
          Request.SetRequestHeader('Content-Transfer-Encoding','Binary');
          Request.SetRequestHeader('Content-Length', StrmObj.Size);
          Request.SetRequestHeader('Accept-Encoding', 'gzip, deflate, br');
          Request.SetRequestHeader('Connection', 'keep-alive');

          TLogClass(lc).WriteLog('send...');

          Request.Send(StrmIntf);
        finally
          StrmIntf:=nil;
          FreeAndNil(StrmObj);

        end;
  finally
    CoUninitialize;
  end;



или надо так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
  try
    CoInitialize(nil);
    errresponsetext:='';
  Request := CreateOleObject('Msxml2.XMLHTTP');
        StrmObj := TFileStream.Create(data, fmOpenRead + fmShareDenyWrite);
        StrmIntf := TStreamAdapter.Create(StrmObj, soOwned);
        try
          Request.SetRequestHeader('Content-Type', 'application/zip');
          Request.SetRequestHeader('Content-Transfer-Encoding','Binary');
          Request.SetRequestHeader('Content-Length', StrmObj.Size);
          Request.SetRequestHeader('Accept-Encoding', 'gzip, deflate, br');
          Request.SetRequestHeader('Connection', 'keep-alive');

          TLogClass(lc).WriteLog('send...');

          Request.Send(StrmIntf);
        finally
          StrmIntf:=nil;
          FreeAndNil(StrmObj);

        end;
  finally
    Request := Null;
    CoUninitialize;
  end;



там же вроде интерфейсы и объекты должны сами уничтожаться при счетчике ссылок=0...
...
Рейтинг: 0 / 0
04.02.2022, 16:49
    #40131739
evgen29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
Fr0sT-Brutal,
это да. Просто когда я вижу код чужой из WINAPI, чтобы его понять нужно гораздо больше времени и лазания по справочникам. А когда я вижу простой код, его понять и поддерживать гораздо проще и приятнее.
...
Рейтинг: 0 / 0
04.02.2022, 17:31
    #40131750
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
Скажите, эта строка
evgen29
Код: pascal
1.
 FreeAndNil(StrmObj);

была у меня в коде? Так зачем вы ее лепите?
evgen29
там же вроде интерфейсы и объекты должны сами уничтожаться при счетчике ссылок=0...
Да. Только счетчик ссылок уменьшается при выходе из процедуры, а на момент вызова CoUninitialize все bynthatqcyst объекты должны быть уничтожены
...
Рейтинг: 0 / 0
04.02.2022, 17:53
    #40131758
evgen29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Content-Length не ставится для Msxml2.XMLHTTP
_Vasilisk_,
почитаю про это, спасибо за помощь и информацию!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Content-Length не ставится для Msxml2.XMLHTTP / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]