Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прокси [D6, WinXP]


Egorr ©   (2005-05-05 15:28:00) 

Добрый день, господа!
Пишу свой прокси, пока без кеширования.
http протокол уже работает через прокси, а https не хочет.
Подскажите, что я не учел для https.

Вот фрагмент кода:

procedure THTTPProxy.DoConnect(AThread: TIdPeerThread);
var
Request: TStringList;
Command, Protocol, Url, Host, Port, Path, Dir, FileName: String;
idx1, idx2, idx: integer;
begin

Request := TStringList.Create;
try
  repeat
    Command := AThread.Connection.ReadLn('');
    Request.Add(Command);
  until Command = '';

  Command := Request[0];
  idx1 := ChrPos(PChar(Command), ' ');
  idx2 := ChrPosR(PChar(Command), ' ');
  if idx1 = idx2 then begin // 0 or 1 space
    AThread.Connection.WriteLn('HTTP/1.1 400 Bad Request');
    abort;
  end;

  Protocol := Copy(Command, idx2 + 1, Length(Command) - idx2);
  Url := Copy(Command, idx1 + 1, idx2 - idx1 - 1);
  Command := Copy(Command, 1, idx1 - 1);
  Port := '';

  if AnsiStartsText('http:', Url) then begin
    Delete(Url, 1, Length('http:'));
    Port := '80';
  end;
  if AnsiStartsText('https:', Url) then begin
    Delete(Url, 1, Length('https:'));
    Port := '443';
  end;
  if AnsiStartsText('//', Url) then begin
    Delete(Url, 1, Length('//'));
  end;
  idx := ChrPos(Url, '/');
  if idx > 0 then begin
    Host := Copy(Url, 1, idx - 1);
    Path := Copy(Url, idx, Length(Url) - idx + 1);
  end else begin
    Host := Url;
    Path := '/';
  end;
  idx := ChrPos(Host, ':');
  if idx > 0 then begin
    Port := Copy(Url, idx + 1, Length(Url) - idx);
    Host := Copy(Host, 1, idx - 1);
  end;
  if Length(Path) = 0 then Path := '/';

  idx := ChrPosR(Path, '/');
  Assert(idx > 0);

    Request[0] := Command + ' ' + Path + ' ' + Protocol;

  MappedHost := Host;
  MappedPort := StrToIntDef(Port, 80);

  inherited;

  if not AnsiSameText(Command, 'CONNECT') then begin
    TIdMappedPortTCPData(AThread.Data).OutboundClient.Write(Request.Text);
  end;
  if AThread.Connection.CurrentReadBufferSize > 0 then begin
    TIdMappedPortTCPData(AThread.Data).OutboundClient.Write(
      AThread.Connection.ExtractXBytesFromBuffer(AThread.Connection.CurrentReadBufferSize));
  end;
finally
  Request.Free;
end;
end;

Заранее благодарен!


DJ_Kit   (2005-06-22 14:14:00) [1]

Слухай, а можешь полный код отсендить на мылко?
Возможно доработаю м фсе будет путем.. :)


atruhin   (2005-05-09 10:16:00) [2]

1. После посылки комманды connect броузер ждет подтверждения от прокси о том что он принял команду.
2. Такой разбор заголовков может работать только для самых примитивных запросов. Для нормально работы необходимо разбирать, анализировать и модифицировать множество полей заголовка (Proxy-Connection, Connection, Keep-Alive, и т.д.)


Egorr   (2005-05-06 22:10:00) [3]

Удалено модератором


Egorr   (2005-05-05 21:31:00) [4]

Так в том то и дело, никакой ошибки нет. Мой прокси http-запросы "обрабатывает" и доставляет ответ пользователю в браузер, а https - нет!
Тоесть ответ на https-запрос пользователю не доставляется почему-то.


Eraser   (2005-05-05 17:14:00) [5]

Egorr

Ты хоть примерно ошибку опиши и отметь подозрительный участок в коде.


Наверх

Титульная страница Поиск, карта сайта Написать письмо