?? httpproxyextend.pas
字號:
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 + -