Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2015, 02:13   #1
KomLit
Новичок
Джуниор
 
Регистрация: 11.01.2015
Сообщений: 2
По умолчанию WinInet - повторный вызов

Всем привет, прошу помощи. Решил отказаться от Indy и Синапса, и нашел неплохую функцию

Код:
function request(const AUrl, AData: AnsiString; blnSSL: Boolean = True): AnsiString;
var
  aBuffer     : Array[0..4096] of Char;
  Header      : TStringStream;
  BufStream   : TMemoryStream;
  sMethod     : AnsiString;
  BytesRead   : Cardinal;
  pSession    : HINTERNET;
  pConnection : HINTERNET;
  pRequest    : HINTERNET;
  parsedURL   : TStringArray;
  port        : Integer;
  flags       : DWord;
begin
  ParsedUrl := ParseUrl(AUrl);

  Result := '';

  pSession := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

  if Assigned(pSession) then
  try
    if blnSSL then
      Port := INTERNET_DEFAULT_HTTPS_PORT
    else
      Port := INTERNET_DEFAULT_HTTP_PORT;
    pConnection := InternetConnect(pSession, PChar(ParsedUrl[0]), port, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);

    if Assigned(pConnection) then
    try
      if (AData = '') then
        sMethod := 'GET'
      else
        sMethod := 'POST';

      if blnSSL then
        flags := INTERNET_FLAG_SECURE or INTERNET_FLAG_KEEP_CONNECTION
      else
        flags := INTERNET_SERVICE_HTTP;

      pRequest := HTTPOpenRequest(pConnection, PChar(sMethod), PChar(ParsedUrl[1]), nil, nil, nil, flags, 0);

      if Assigned(pRequest) then
      try
        Header := TStringStream.Create('');
        try
          with Header do
          begin
            WriteString('Host: ' + ParsedUrl[0] + sLineBreak);
            WriteString('User-Agent: Custom program 1.0'+SLineBreak);
            WriteString('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'+SLineBreak);
            WriteString('Accept-Language: en-us,en;q=0.5' + SLineBreak);
            WriteString('Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7'+SLineBreak);
            WriteString('Keep-Alive: 300'+ SLineBreak);
            WriteString('Connection: keep-alive'+ SlineBreak+SLineBreak);
          end;

          HttpAddRequestHeaders(pRequest, PChar(Header.DataString), Length(Header.DataString), HTTP_ADDREQ_FLAG_ADD);

          if HTTPSendRequest(pRequest, nil, 0, Pointer(AData), Length(AData)) then
          begin
            BufStream := TMemoryStream.Create;
            try
              while InternetReadFile(pRequest, @aBuffer, SizeOf(aBuffer), BytesRead) do
              begin
                if (BytesRead = 0) then Break;
                BufStream.Write(aBuffer, BytesRead);
              end;

              aBuffer[0] := #0;
              BufStream.Write(aBuffer, 1);
              Result := PChar(BufStream.Memory);
            finally
              BufStream.Free;
            end;
          end;
        finally
          Header.Free;
        end;
      finally
        InternetCloseHandle(pRequest);
      end;
    finally
      InternetCloseHandle(pConnection);
    end;
  finally
    InternetCloseHandle(pSession);
  end;
end;
Проблема в том что если я вызываю функцию несколько раз с одинаковыми параметрами, я получаю полностью идентичные ответы.
Причем в сниффере виден только 1 вызов, остальные просто возвращают ответ как в 1. Как исправить? Во вложении приложил пример.
Вложения
Тип файла: zip Error.zip (202.5 Кб, 13 просмотров)
KomLit вне форума Ответить с цитированием
Старый 11.01.2015, 10:50   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может там кэширование включается... Попробуй добавить флаг INTERNET_FLAG_RELOAD к flags
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.01.2015, 11:28   #3
KomLit
Новичок
Джуниор
 
Регистрация: 11.01.2015
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Может там кэширование включается... Попробуй добавить флаг INTERNET_FLAG_RELOAD к flags
Огромное спасибо! С флагом INTERNET_FLAG_RELOAD - работает как часы
KomLit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Повторный запуск программы lev_ Помощь студентам 2 13.12.2014 11:39
повторный перехват исключений в c# Dissembler7 Помощь студентам 0 18.06.2013 18:54
Повторный вызов конструктора класса EUGY Общие вопросы C/C++ 13 28.09.2010 16:00
Повторный вызов функций Roman Общие вопросы C/C++ 1 10.06.2009 14:48
Повторный вызов функции из dll Smertnik Общие вопросы C/C++ 5 15.05.2009 22:18