powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Content-Length не ставится для Msxml2.XMLHTTP
15 сообщений из 15, страница 1 из 1
Content-Length не ставится для Msxml2.XMLHTTP
    #40131587
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Пытаюсь отправить 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
Content-Length не ставится для Msxml2.XMLHTTP
    #40131592
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Content-Length не ставится для Msxml2.XMLHTTP
    #40131593
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
if sendfile <> false
...
Рейтинг: 0 / 0
Content-Length не ставится для Msxml2.XMLHTTP
    #40131595
Фотография _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 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
Content-Length не ставится для Msxml2.XMLHTTP
    #40131597
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,
...
Рейтинг: 0 / 0
Content-Length не ставится для Msxml2.XMLHTTP
    #40131601
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
Content-Length не ставится для Msxml2.XMLHTTP
    #40131653
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из интереса спрошу: а зачем так извращаться? OLE либо для убогих недоязыков типа vba, либо если нет нормального API. Почему бы не использовать winhttp через API?
...
Рейтинг: 0 / 0
Content-Length не ставится для Msxml2.XMLHTTP
    #40131680
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,
спасибо, дружище!

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


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



, то норм.
...
Рейтинг: 0 / 0
Content-Length не ставится для Msxml2.XMLHTTP
    #40131681
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fr0sT-Brutal, можно сделать тысячью способов.
Вам нравится api. Мне например нет. Надо извратиться и написать куча кода для простых операций. Я к API прибегаю по необходимости. Можно скачать компонент типа Indy и сделать в нём.
...
Рейтинг: 0 / 0
Content-Length не ставится для Msxml2.XMLHTTP
    #40131687
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
evgen29, ну, как говорится, каждый человек сам кузнец собственного геморроя
...
Рейтинг: 0 / 0
Content-Length не ставится для Msxml2.XMLHTTP
    #40131704
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evgen29
, то норм.
Нет не норм. Вы получили утечку
evgen29
, то при CoUnInitialize выдает Access Violation,
Сделайте явно
Код: pascal
1.
2.
StrmIntf := nil;
Request = null;
...
Рейтинг: 0 / 0
Content-Length не ставится для Msxml2.XMLHTTP
    #40131738
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_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
Content-Length не ставится для Msxml2.XMLHTTP
    #40131739
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fr0sT-Brutal,
это да. Просто когда я вижу код чужой из WINAPI, чтобы его понять нужно гораздо больше времени и лазания по справочникам. А когда я вижу простой код, его понять и поддерживать гораздо проще и приятнее.
...
Рейтинг: 0 / 0
Content-Length не ставится для Msxml2.XMLHTTP
    #40131750
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите, эта строка
evgen29
Код: pascal
1.
 FreeAndNil(StrmObj);

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


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