HTTP проксик

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Artorios, 1 Oct 2013.

  1. Artorios

    Artorios New Member

    Joined:
    23 Feb 2012
    Messages:
    15
    Likes Received:
    0
    Reputations:
    0
    Всем привет,написал я вот http проксик,а он вот работает,если гонять данные малого размера.А если попробовать его на браузере,то браузер не грузится....Возможно,это из-за того,что я юзаю неблокирующие сокеты или хрен знает что....
    Может кто подскажет,в чём ошибка?

    Code:
    unit TProxiUnit;
    
    interface
    uses Windows,Winsock;
    function GetTextBetweenTags(headers: PChar): string;
    function GetIP(Host: String): string;
    type
      TPROXI = class
        private
          WS:TwsaData;
        public
          Sock: TSocket;
          hAddr: TSockAddr;
          Host         :PChar;
          Port         :Word;
          Data: Pointer;
    
          constructor Create(Port_: Word);
          procedure Send_(Date: Pointer);
          Procedure Recv_;
          destructor destroy;
      end;
    
    
    implementation
    
    function GetIP(Host: String): string;
    type
        TaPInAddr = array [0..10] of PInAddr; 
        PaPInAddr = ^TaPInAddr; 
    var 
        phe  : PHostEnt; 
        pptr : PaPInAddr; 
        Buffer : array [0..63] of char; 
        I    : Integer; 
        GInitData      : TWSADATA; 
    begin 
        WSAStartup(MakeWord(2,0), GInitData);
        Result := '';     //не найден! 
        ZeroMemory(@Buffer, SizeOf(Buffer)); 
        lstrcpy(Buffer, PChar(Host));
        phe :=GetHostByName(buffer); 
        if phe = nil then begin 
          WSACleanup; 
          Exit; 
        end; 
        try 
          pptr := PaPInAddr(Phe^.h_addr_list); 
          I := 0; 
          while pptr^[I] <> nil do begin 
            result:=PChar(inet_ntoa(pptr^[I]^)); 
            Inc(I); 
          end; 
        finally 
          WSACleanup; 
        end; 
    end;
    
    function GetTextBetweenTags(headers: PChar): string;
    const ctrf = #13#10;
    Var i,j: integer;
    begin
      Result:='';
      i:= Pos('Host:',headers)+5;
      if i <6 then
        Exit;
      j:=i;
      repeat
        Result:=Result+Headers[j];
        Inc(j);
      until headers[j] = #13;
    end;
    
    Procedure Colors(Red: boolean);
    Var hCon: DWORD;
    begin
      hCon := GetStdHandle(STD_OUTPUT_HANDLE);
      if Red then
        SetConsoleTextAttribute(hCon, 7)  else
        SetConsoleTextAttribute(hCon, 3);
    end;
    
    procedure THREAD(P :Pointer); stdcall;
    const PPORT = 80;
          ctrf = #13#10;
    Var Ns: TSocket;
        i,j: integer;
        Data,Tmp: array[0..8*MAX_PATH] of char;
    
        addr: TSockAddr;
        Snd: TSocket;
        host: string;
        Str: string;
        //TimeVal: TTimeVal;
        //FDSet: TFDSet;
    begin
      Ns:=TSocket(P);
      WriteLn(Ns);
    {  FD_ZERO(FDSet);
      FD_SET(Ns, FDSet);
      TimeVal.tv_sec := 0;
      TimeVal.tv_usec := 500;
      ioctlsocket(Ns,FIONREAD,i);}
      while true do
      begin
        Str:='';
        i:=1;
        while i>0 do
        begin                                        //Читаю данные с клиента
          ZeroMemory(@Data,SizeOf(Data));
          i:=recv(Ns,Data,SizeOf(Data),0);
          Str:=Str+Data;
        end;
        WriteLn(Str);
        host:=GetTextBetweenTags(PChar(Str));
        host:=GetIP(host);                          //Определил IP куда хотел подконектиться клиент
                    Addr.sin_family:=PF_INET;
                    Addr.sin_port:=htons(PPORT);
                    Addr.sin_addr.S_addr:=inet_addr(PChar(host));
                    Snd := Socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
                    if connect(Snd,addr,SizeOf(Addr)) = 0 then
                    begin
                      j:=1;
                      while j>0 do
                        j:=send(Snd,Str[1],Length(Str),0);          //Посылаю вопрос серверу
                      Str:='';
                      j:=1;                                        //Читаю ответ с сервера
                      while j>0 do
                      begin
                        ZeroMemory(@Tmp,SizeOf(Tmp));
                        j:=recv(Snd,Tmp,SizeOf(Tmp),0);
                        Str:=Str+Tmp;
                      end;
                    end;
        i:=1;
        while i>0 do
          i:=send(Ns,Str[1],Length(Str),0);                      //Отсылаю ответ от сервера клиенту
      end;
      closesocket(Ns);
    end;
    
    constructor TPROXI.Create(Port_: WORD);
    Var ThId: DWORD;
        Ns: TSocket;
        Th: Pointer;
    begin
      Colors(True);
      WSAStartup($101, ws);
      Sock := Socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
    
      GetMem(Host,MAX_PATH);
      GetMem(Data,MAX_PATH);
      ZeroMemory(Data,MAX_PATH);
    
      Port:= Port_;
    
      hAddr.sin_family:=PF_INET;
      hAddr.sin_port:=htons(PORT);
      hAddr.sin_addr.S_addr:=INADDR_ANY;
    
      Bind(Sock, hAddr, SizeOf(hAddr));
      Listen(Sock,1);
      repeat
        Ns := accept(Sock, nil, nil);
        CloseHandle(CreateThread(nil,0,@THREAD,Pointer(Ns),0,ThId));
      until False;
    end;
    
    destructor TPROXI.destroy;
    Var c: Word;
    begin
      FreeMem(Host);
      FreeMem(Data);
      inherited;
    end;
    
    procedure TPROXI.Recv_;
    begin
    
    end;
    
    procedure TPROXI.Send_(Date: Pointer);
    begin
    
    end;
    
    
    end.
    Юзаю:
    Code:
    Program um;
    
    {$AppType Console}
    
    uses
      Windows,TProxiUnit;
    
    var
      S: TPROXI;
    begin
      S:= TPROXI.Create(8080);
      Readln;
    end.
    :)
     
    #1 Artorios, 1 Oct 2013
    Last edited: 2 Oct 2013
  2. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Как понять то, что он где-то работает, а в браузере нет?) Могу предложить запустить его под отладкой на своей машине и с другой зайти через браузер. по крайней мере я так SOCKS Proxy когда то делал, всё сразу становиться на свои места и все ошибки видны :)
    P.S. Могу вечерком SOCKS скинуть если остался живой исходник)