⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpproxyextend.pas

📁 httpanalyzer, source code for delphi
💻 PAS
📖 第 1 页 / 共 2 页
字号:
   ret:=true;
  end;
  //showmessage(bufp);

  // 躡erfl黶sige HTTP Header Teile jetzt l鰏chen!

 // if del1=true then begin;

    new_p:=mem_deletestr_nocase(buf_p,buf_s,PCHAR('http:'),5, new_s);
    //if new_p<>nil then  del1:=false;
    if new_s>0 then begin;
      freemem(buf_p,buf_s);
      buf_p:=mem_new(new_p,new_s);
      buf_s:=new_s;
      freemem(new_p,new_s);

    end;
 // end;

 // if del2=true then begin;

    new_p:=mem_deletestr_nocase(buf_p,buf_s,PCHAR('//'),2, new_s);
    if new_s>0 then begin;
      freemem(buf_p,buf_s);
      buf_p:=mem_new(new_p,new_s);
      buf_s:=new_s;
      freemem(new_p,new_s);
      del2:=false;
    end;
 // end;

 // if del3=true then begin;

    new_p:=mem_deletestr_nocase(buf_p,buf_s,PCHAR('\\'),2, new_s);
    if new_s>0 then begin;
      freemem(buf_p,buf_s);
      buf_p:=mem_new(new_p,new_s);
      buf_s:=new_s;
      freemem(new_p,new_s);
      del3:=false;
    end;
 // end;

//  if del4=true then begin;

  if ndests<>'' then begin;
    new_p:=mem_deletestr_nocase(buf_p,buf_s,PCHAR(ndests),length(ndests), new_s);
    if new_s>0 then begin;
      freemem(buf_p,buf_s);
      buf_p:=mem_new(new_p,new_s);
      buf_s:=new_s;
      freemem(new_p,new_s);
      del4:=false;
    end;
  end;
//  end;

  //Do_P1_dbgout('New Header:');
  //Do_P1_dbgout(mem2pchar(buf_p,buf_s));
  buf_p:=On_P1_HeaderModified(buf_p,buf_s);

 { delp_firstonly(bufp,'//');
  delp_firstonly(bufp,'\\'); (* BSP http://login:pass@server.com/members/index *)
  delp_firstonly(bufp,PCHAR(ndests));  // fehlt noch das nocase
  }

  if ftpi>0 then begin;
   userstr:='anonymous';
   pwdstr:='someone@somwehere.com';
   // TODO2 : Login und User aus FTP Request ausholen!!
                     //   ftp://user:pw@ftp.host.com/dir/file.suffix
   On_P1_dbgout('FTP Over HTTP direct to the inet NOT supported yet');
 //  Do_Send1str('HTTP/1.0.200.Gatewaying'+cn);
 //  Do_Send1str('Date Monday,.03-Jan-00'+cn);
 //  Do_Send1str('Content-Type:.text/html.'+cn);
   //Do_Send1str(Content-Length:
   Do_Send1str('<HTML><HEAD><TITLE>FTP Gateway Error</TITLE><HEAD><BODY>FTP Over HTTP is NOT supported yet<br><br> ');
   Do_Send1str('Dest Host: "'+dest_addr+'"<br>');
   Do_Send1str('Dest Port: "'+dest_port+'"<br>');
   param:=copy(ln1,ftpi,length(ln1)-ftpi);
   parami:=pos(dest_addr,param);
   parami2:=pos(' ',param);
   param2:=copy(param,parami+length(dest_addr),parami2-parami-length(dest_addr));
   i3:=length(param2)+1;
   repeat
     dec(i3);
   until (i3=0) or (copy(param2,i3,1)='/');
   //showmessage(inttostr(i3));
   param3:=copy(param2,i3+1,length(param2)-i3+1);
   param2:=copy(param2,1,length(param2)-length(param3));
   if param2='' then param2:='/';
   Do_Send1str('Param3=FTP-File: "'+param3+'"<br>');
   Do_Send1str('Param2=FTP-Dir: "'+param2+'"<br>');
   Do_Send1str('Param: "'+param+'"<br><br>');
   Do_Send1str('USER: "'+userstr+'"<br>');
   Do_Send1str('PASS: "'+pwdstr+'"<br>');
   Do_Send1str('</BODY></HTML>'+cn);
   ret:=false;
   fp1socket.close;
  end;

  search_destaddr:=ret;
end
else search_destaddr:=false;
  end;


procedure THttpProxy.P1_DataAvailable(
    Sender: TObject;
    Error: Word);
var
    Buffer : array [0..4095] of char;
    Count  : Integer;

    new_bufp : pointer;
    new_bufs : longint;

    new_data : pointer; //Daten nach dem sie ueber die Handlerfunktion ver鋘dert werden kann

    dataPacket,dataHeader,dataRest : TMemWeb;
begin
    { Receive as much data as possible }
    Count := FP1Socket.Receive(@Buffer, SizeOf(Buffer)-1);
    On_P1_dbgout(Pchar('P1 Data received ('+inttostr(count)+' Bytes)'));



    if (count>0) then begin;
      //copy buffer to new memory space
      getmem(new_data,count);
      mem_copy(new_data,@buffer, count);
      dataPacket.p:=new_data;
      dataPacket.s:=count;
      dataPacket.init:=true;

      //OnP2DataReceived EVENT
      dataPacket.p:=On_P1_DataAvailable(dataPacket.p,dataPacket.s);

      //(modifiziertes) dataPacket  in den dataAll Stream schreiben
      dataAll_P1.cat(dataPacket);

      if dataPacket.s > 0 then begin;


        if (gotHeader_P1) then begin
          dataPacket.p:=On_P1_Content(dataPacket.p,dataPacket.s);   //streaming-EVENT
        end
        else begin // Header bisher noch nicht empfangen
          if (foundBreak(dataAll_P1,dataHeader,dataRest)) then begin;
            gotHeader_P1:=true;

            //On_P2_dbgout(mem2pchar(dataHeader.p,dataHeader.s));
            //On_P2_dbgout(pchar(mem_show(dataRest.p,dataRest.s)));

            dataHeader.p:=On_P1_Header(dataHeader.p,dataHeader.s); //en bloc-EVENT
            dataRest.p:=On_P1_Content(dataRest.p,dataRest.s);      //streaming-EVENT

            //dataPacket wird aus den R點kgabedaten der Events neu gebildet
            dataPacket.setfrom_mem(dataHeader);
            dataPacket.cat(dataRest);

            dataHeader.free_mem;
            dataRest.free_mem;
          end; //foundBreak
        end; //else gotHeader

      end;  //dataPacket.s>0
        


    { If data received, then process it                                     }
    if dataPacket.s > 0 then begin
        On_P1_dbgout(Pchar('P1 Data received ('+inttostr(dataPacket.s)+' Bytes'));
       // buffer[count]:=#0;
      //  Do_P1_dbgout(buffer);

        if (connected=false)  then begin;
          On_P1_dbgout('P1 not yet connected => write in Sendbuf');
          if buf_init=false then begin
            On_P1_dbgout('P1 INIT SENDBUF');
            getmem(buf_p,dataPacket.s);
            mem_copy(buf_p,dataPacket.p, dataPacket.s);
            buf_init:=true;
            buf_s:=dataPacket.s;
          end
          else begin
            On_P1_dbgout('P1 ADD TO SENDBUF');
            new_bufp:=mem_cat(buf_p,buf_s,dataPacket.p,dataPacket.s,  new_bufs);
            freemem(buf_p,buf_s);

            getmem(buf_p,new_bufs);

            buf_s:=new_bufs;
            mem_copy(buf_p,new_bufp,buf_s);

            freemem(new_bufp, new_bufs);
          end;
         end;


        if got_addr=false then begin;

           look4addr;

        end;

        if (dataPacket.s>0) then begin;
          if connected=true then begin;
            Do_Send2(dataPacket.p,dataPacket.s);
          end;
        end;

        dataPacket.free_mem;
    end; // dataPacket.s > 0

    end; //count>0
end;



///// EVENT CALLER

function THttpProxy.On_P1_Header(p : pointer; VAR s : longint) : pointer;
begin;
  if Assigned(Proc_P1_HttpHeader) then begin
        LockEvents.Acquire;
        try result:=Proc_P1_HttpHeader(self,run_nr,p,s);
        finally LockEvents.Release; end;
  end
  else result:=p;
end;

function THttpProxy.On_P1_HeaderModified(p : pointer; VAR s : longint) : pointer;
begin;
  if Assigned(Proc_P1_HttpHeaderModified) then begin
        LockEvents.Acquire;
        try result:=Proc_P1_HttpHeaderModified(self,run_nr,p,s);
        finally LockEvents.Release; end;
  end
  else result:=p;
end;

function THttpProxy.On_P2_Header(p : pointer; VAR s : longint) : pointer;
begin;
  if Assigned(Proc_P2_HttpHeader) then begin
        LockEvents.Acquire;
        try result:=Proc_P2_HttpHeader(self,run_nr,p,s);
        finally LockEvents.Release;  end;
  end
  else result:=p;
end;

function THttpProxy.On_P2_Content(p : pointer; VAR s : longint) : pointer;
begin;
  if Assigned(Proc_P2_HttpContent) then begin
        LockEvents.Acquire;
        try result:=Proc_P2_HttpContent(self,run_nr,p,s);
        finally LockEvents.Release;  end;
  end
  else result:=p;
end;

function THttpProxy.On_P1_Content(p : pointer; VAR s : longint) : pointer;
begin;
  if Assigned(Proc_P1_HttpContent) then begin
        LockEvents.Acquire;
        try result:=Proc_P1_HttpContent(self,run_nr,p,s);
        finally LockEvents.Release;  end;
  end
  else result:=p;
end;















(*



procedure THttpProxyExtended.logDataP2(p : pointer; VAR s:longint);
begin;
 p2data.cat(p, s);
 //Do_P2_dbgout(PCHAR('logData :'+inttostr(s)));
end;

function THttpProxyExtended.Do_P2_DataAvailable(p : pointer; VAR s : longint) : pointer;
begin;
  logDataP2(p,s);
  result:=inherited Do_P2_DataAvailable(p,s);
end;

procedure THttpProxyExtended.P2_SessionClosed(Sender: TObject; Error: Word);
begin;
 Do_P2_dbgout(PCHAR('SAVE TO FILE '+inttostr(run_nr)+'.dat'));
 if (Assigned(p2data.p)) then
 SaveHtmlCache(p2data.p,p2data.s,inttostr(run_nr)+'.dat');
 inherited;
end;

destructor THttpProxyExtended.destroy;
begin;
  if Assigned(p2data.p) then begin;
    p2data.free_mem;
  end;
  inherited destroy;
end;

*)

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -