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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2016, 18:45   #1
Igor[Игорь]
Пользователь
 
Аватар для Igor[Игорь]
 
Регистрация: 25.11.2011
Сообщений: 52
По умолчанию proxy socket и HTTPS CONNECT

Имеется простейший прокси на сокетах, рабочий, получает данные от клиента и пересылает на сервер, получает от сервера и пересылает клиенту ничего не меняя в данных. Но с https работать не хочет. По сплетням гугла надо отправить команту для конекта типа
Код:
CONNECT host:port HTTP/1.1
User-Agent: TestApp

host
но возвращается все время
400 Bad reguest

Что я делаю не так? Есть кто может подсказать что дельное? Пробую конектиться к яндексу.

вот сам код пересылки данных, взят с просторов интеренета, и немного переделан
Код:
procedure TClientThread.Execute;
var
  _buff: array [0..1024] of char;
  _port: integer;
  _request: string;
  _srvAddr: sockaddr_in;
  _srvSocket: TSocket;
  _opt, _size: Integer;
  _fdset: TFDSET;

  Timeout: TTimeVal;
begin
  FreeOnTerminate:=true;

  TimeOut.tv_sec:=5;
  TimeOut.tv_usec:=0;

  //Пробуем получить данные от клиента
  _size := Recv(_clnSocket, _buff, sizeof(_buff), 0);

  //Копируем запрос из буфера
  _request:=string(_buff);

  //если пусто, то значит дальше делать нечего
  if _request='' then
  begin
    CloseSocket(_clnSocket);
    exit;
  end;

  //Определим сервер, с которого будем запрашивать данные
  _host:=Copy(_request, Pos('Host: ', _request), 255);
  Delete(_host, Pos(#13, _host), 255);
  Delete(_host, 1, 6);

  //подменяем хост на прокси
  //_host:=HostProxy;

  //Определяем порт. Если в заголовке не указан порт, то используем
  //по умолчанию - 80
  _port:=StrToIntDef(Copy(_host, Pos(':', _host)+1, 255), 80);
  Delete(_host, Pos(':', _host), 255);

  //Если не удалось определить адрес, то сообщим клиенту
  if (_host='') then
  begin
    SendStr(_clnSocket, 'Error 400: Invalid header');
    CloseSocket(_clnSocket);
    exit;
  end;

  //Запишем в лог IP клиента, и ресурс к которому он обращался
  Synchronize(addToLog);

  //Создадим сокет
  _srvSocket := socket(AF_INET, SOCK_STREAM, 0);

  // Ищем сервер
  _srvAddr.sin_addr.s_addr := htonl(INADDR_ANY);
  _srvAddr.sin_family := AF_INET;
  _srvAddr.sin_port := htons(_port);
  _srvAddr.sin_addr := LookupName(_host);

  //Соединение с сервером
  if connect(_srvSocket, _srvAddr, sizeof(_srvAddr))=SOCKET_ERROR then
  begin
    SendStr(_clnSocket, '<h1>Error 404: NOT FOUND</h1>');
    CloseSocket(_clnSocket);
    CloseSocket(_srvSocket);
    exit;
  end;

  //Устанавливаем сокету опции (асинхронный режим)
  _opt:=1;
  setsockopt(_srvSocket, IPPROTO_TCP, TCP_NODELAY, @_opt, sizeof(integer));

  //Отправляем серверу запрос
  send(_srvSocket, _buff, _size, 0);

  while true do
  begin
    if Terminated then
    break;

    FD_ZERO(_fdset);
    FD_SET(_clnSocket, _fdset);
    FD_SET(_srvSocket, _fdset);

    if select(0, @_fdset, nil, nil, @TimeOut)<0 then
    break; //exit;

    //Если пришли данные от клиента (т.е. запрос на получение док),
    //немедленно отправляем их серверу
    if (FD_ISSET(_clnSocket, _fdset)) then
    begin
      _size := recv(_clnSocket, _buff, sizeof(_buff), 0);

      if _size=SOCKET_ERROR then
      if (WSAGetLastError() <> WSAECONNRESET) then
      break;
      //Если данные для приема кончились, то остановимся
      //if _size=0 then
      //break;

      send(_srvSocket, _buff, _size, 0);

      if _size<>0 then
      continue;
    end;

    //Если данные пришли с сервера, то значит нужно отправить их клиенту
    if(FD_ISSET(_srvSocket, _fdset)) then
		begin
			_size := recv(_srvSocket, _buff, sizeof(_buff), 0);

      if _size=SOCKET_ERROR then
      if (WSAGetLastError() <> WSAECONNRESET) then
      break;
      if _size=0 then
      break; //exit;

			Send(_clnSocket, _buff, _size, 0);
			continue;
		end;
  end;
  CloseSocket(_clnSocket);
  CloseSocket(_srvSocket);
end;
e-mail: igor23dec@yandex.ru , ICQ: 2168364 , Telegram: @IgorVN
Delphi, PHP
Примеры http://igorvn.ucoz.ru/

Последний раз редактировалось Igor[Игорь]; 07.10.2016 в 18:48.
Igor[Игорь] вне форума Ответить с цитированием
Старый 07.10.2016, 18:47   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
пересылает клиенту ничего не меняя в данных
А зачем он тогда?
И не проще готовый прокси сервер взять? (Squid например)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.10.2016, 18:57   #3
Igor[Игорь]
Пользователь
 
Аватар для Igor[Игорь]
 
Регистрация: 25.11.2011
Сообщений: 52
По умолчанию

Для смены прокси для хромиума так как для хромиума можно только при запуске установить прокси в командной строке, ставлю ему прокси 127.0.0.1 и через этот прокси уже конектюсь к другим прокси, их надо менять часто во время работы программы. Пробовал IdMappedPortTCP1 из indy10 но какой то он косячный весь.
e-mail: igor23dec@yandex.ru , ICQ: 2168364 , Telegram: @IgorVN
Delphi, PHP
Примеры http://igorvn.ucoz.ru/

Последний раз редактировалось Igor[Игорь]; 07.10.2016 в 19:00.
Igor[Игорь] вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Windows7 - "Windows socket error: Требуемый адрес для своего контекста неверен (10049), on API 'connect' BaiAs БД в Delphi 4 06.09.2017 10:12
INDY + HTTPS + SSL = Socket Error #10061 yoshimidzo Работа с сетью в Delphi 12 10.01.2013 12:57
Socket, Connection timed out: connect. Не можем соединиться WOLFak Общие вопросы по Java, Java SE, Kotlin 8 07.01.2013 21:37
Connect по timeout Tahoma Win Api 8 26.07.2012 09:17
DC++(Direct Connect) azaznio Компоненты Delphi 2 15.02.2011 15:49