Release 18
git-svn-id: https://svn.code.sf.net/p/synalist/code/trunk@39 7c85be65-684b-0410-a082-b2ed4fbef004
This commit is contained in:
parent
a644f1e5b4
commit
09292a9c65
217
blcksock.pas
217
blcksock.pas
@ -1,5 +1,5 @@
|
||||
{==============================================================================|
|
||||
| Project : Delphree - Synapse | 002.000.001 |
|
||||
| Project : Delphree - Synapse | 002.001.000 |
|
||||
|==============================================================================|
|
||||
| Content: Library base |
|
||||
|==============================================================================|
|
||||
@ -52,6 +52,10 @@ Protected
|
||||
procedure SetSin (var sin:TSockAddrIn;ip,port:string);
|
||||
function GetSinIP (sin:TSockAddrIn):string;
|
||||
function GetSinPort (sin:TSockAddrIn):integer;
|
||||
function GetSizeRecvBuffer:integer;
|
||||
procedure SetSizeRecvBuffer(size:integer);
|
||||
function GetSizeSendBuffer:integer;
|
||||
procedure SetSizeSendBuffer(size:integer);
|
||||
public
|
||||
FWsaData : TWSADATA;
|
||||
|
||||
@ -66,6 +70,7 @@ public
|
||||
procedure SendByte(data:byte); virtual;
|
||||
procedure SendString(data:string); virtual;
|
||||
function RecvBuffer(buffer:pointer;length:integer):integer; virtual;
|
||||
function RecvBufferEx(buffer:pointer;length:integer;timeout:integer):integer; virtual;
|
||||
function RecvByte(timeout:integer):byte; virtual;
|
||||
function Recvstring(timeout:integer):string; virtual;
|
||||
function PeekBuffer(buffer:pointer;length:integer):integer; virtual;
|
||||
@ -85,14 +90,16 @@ public
|
||||
function SendBufferTo(buffer:pointer;length:integer):integer;
|
||||
function RecvBufferFrom(buffer:pointer;length:integer):integer;
|
||||
|
||||
published
|
||||
property socket:TSocket read FSocket write FSocket;
|
||||
property LocalSin:TSockAddrIn read FLocalSin;
|
||||
property RemoteSin:TSockAddrIn read FRemoteSin;
|
||||
published
|
||||
property socket:TSocket read FSocket write FSocket;
|
||||
property LastError:integer read FLastError;
|
||||
property Protocol:integer read FProtocol;
|
||||
property LineBuffer:string read FBuffer write FBuffer;
|
||||
property RaiseExcept:boolean read FRaiseExcept write FRaiseExcept;
|
||||
property SizeRecvBuffer:integer read GetSizeRecvBuffer write SetSizeRecvBuffer;
|
||||
property SizeSendBuffer:integer read GetSizeSendBuffer write SetSizeSendBuffer;
|
||||
end;
|
||||
|
||||
{TUDPBlockSocket}
|
||||
@ -265,6 +272,71 @@ begin
|
||||
ExceptCheck;
|
||||
end;
|
||||
|
||||
{TBlockSocket.RecvBufferEx}
|
||||
function TBlockSocket.RecvBufferEx(buffer:pointer;length:integer;timeout:integer):integer;
|
||||
var
|
||||
s,ss,st:string;
|
||||
x,l,lss:integer;
|
||||
fb,fs:integer;
|
||||
max:integer;
|
||||
begin
|
||||
FLastError:=0;
|
||||
x:=system.length(FBuffer);
|
||||
if length<=x
|
||||
then
|
||||
begin
|
||||
fb:=length;
|
||||
fs:=0;
|
||||
end
|
||||
else
|
||||
begin
|
||||
fb:=x;
|
||||
fs:=length-x;
|
||||
end;
|
||||
ss:='';
|
||||
if fb>0 then
|
||||
begin
|
||||
s:=copy(FBuffer,1,fb);
|
||||
delete(Fbuffer,1,fb);
|
||||
end;
|
||||
if fs>0 then
|
||||
begin
|
||||
Max:=GetSizeRecvBuffer;
|
||||
ss:='';
|
||||
while system.length(ss)<fs do
|
||||
begin
|
||||
if canread(timeout) then
|
||||
begin
|
||||
l:=WaitingData;
|
||||
if l>max
|
||||
then l:=max;
|
||||
if (system.length(ss)+l)>fs
|
||||
then l:=fs-system.length(ss);
|
||||
setlength(st,l);
|
||||
x:=winsock.recv(FSocket,pointer(st)^,l,0);
|
||||
if x=0
|
||||
then FLastError:=WSAENOTCONN
|
||||
else sockcheck(result);
|
||||
if Flasterror<>0
|
||||
then break;
|
||||
lss:=system.length(ss);
|
||||
setlength(ss,lss+x);
|
||||
Move(pointer(st)^,Pointer(@ss[lss+1])^, x);
|
||||
{It is 3x faster then ss:=ss+copy(st,1,x);}
|
||||
sleep(0);
|
||||
end
|
||||
else FLastError:=WSAETIMEDOUT;
|
||||
if Flasterror<>0
|
||||
then break;
|
||||
end;
|
||||
fs:=system.length(ss);
|
||||
end;
|
||||
result:=fb+fs;
|
||||
s:=s+ss;
|
||||
move(pointer(s)^,buffer^,result);
|
||||
ExceptCheck;
|
||||
end;
|
||||
|
||||
{TBlockSocket.RecvByte}
|
||||
function TBlockSocket.RecvByte(timeout:integer):byte;
|
||||
var
|
||||
@ -515,6 +587,43 @@ begin
|
||||
ExceptCheck;
|
||||
end;
|
||||
|
||||
{TBlockSocket.GetSizeRecvBuffer}
|
||||
function TBlockSocket.GetSizeRecvBuffer:integer;
|
||||
var
|
||||
l:integer;
|
||||
begin
|
||||
l:=SizeOf(result);
|
||||
SockCheck(winsock.getSockOpt(FSocket, SOL_SOCKET, SO_RCVBUF, @result, l));
|
||||
if Flasterror<>0
|
||||
then result:=1024;
|
||||
ExceptCheck;
|
||||
end;
|
||||
|
||||
{TBlockSocket.SetSizeRecvBuffer}
|
||||
procedure TBlockSocket.SetSizeRecvBuffer(size:integer);
|
||||
begin
|
||||
SockCheck(winsock.SetSockOpt(FSocket, SOL_SOCKET, SO_RCVBUF, @size, SizeOf(size)));
|
||||
ExceptCheck;
|
||||
end;
|
||||
|
||||
{TBlockSocket.GetSizeSendBuffer}
|
||||
function TBlockSocket.GetSizeSendBuffer:integer;
|
||||
var
|
||||
l:integer;
|
||||
begin
|
||||
l:=SizeOf(result);
|
||||
SockCheck(winsock.getSockOpt(FSocket, SOL_SOCKET, SO_SNDBUF, @result, l));
|
||||
if Flasterror<>0
|
||||
then result:=1024;
|
||||
ExceptCheck;
|
||||
end;
|
||||
|
||||
{TBlockSocket.SetSizeSendBuffer}
|
||||
procedure TBlockSocket.SetSizeSendBuffer(size:integer);
|
||||
begin
|
||||
SockCheck(winsock.SetSockOpt(FSocket, SOL_SOCKET, SO_SNDBUF, @size, SizeOf(size)));
|
||||
ExceptCheck;
|
||||
end;
|
||||
|
||||
|
||||
{======================================================================}
|
||||
@ -555,6 +664,7 @@ end;
|
||||
procedure TTCPBlockSocket.Listen;
|
||||
begin
|
||||
SockCheck(winsock.listen(FSocket,SOMAXCONN));
|
||||
GetSins;
|
||||
ExceptCheck;
|
||||
end;
|
||||
|
||||
@ -581,56 +691,57 @@ function GetErrorDesc(ErrorCode:integer): string;
|
||||
begin
|
||||
case ErrorCode of
|
||||
0 : Result:= 'OK';
|
||||
WSAEINTR : Result:= 'Interrupted system call';
|
||||
WSAEBADF : Result:= 'Bad file number';
|
||||
WSAEACCES : Result:= 'Permission denied';
|
||||
WSAEFAULT : Result:= 'Bad address';
|
||||
WSAEINVAL : Result:= 'Invalid argument';
|
||||
WSAEMFILE : Result:= 'Too many open files';
|
||||
WSAEWOULDBLOCK : Result:= 'Operation would block';
|
||||
WSAEINPROGRESS : Result:= 'Operation now in progress';
|
||||
WSAEALREADY : Result:= 'Operation already in progress';
|
||||
WSAENOTSOCK : Result:= 'Socket operation on nonsocket';
|
||||
WSAEDESTADDRREQ : Result:= 'Destination address required';
|
||||
WSAEMSGSIZE : Result:= 'Message too long';
|
||||
WSAEPROTOTYPE : Result:= 'Protocol wrong type for socket';
|
||||
WSAENOPROTOOPT : Result:= 'Protocol not available';
|
||||
WSAEPROTONOSUPPORT : Result:= 'Protocol not supported';
|
||||
WSAESOCKTNOSUPPORT : Result:= 'Socket not supported';
|
||||
WSAEOPNOTSUPP : Result:= 'Operation not supported on socket';
|
||||
WSAEPFNOSUPPORT : Result:= 'Protocol family not supported';
|
||||
WSAEAFNOSUPPORT : Result:= 'Address family not supported';
|
||||
WSAEADDRINUSE : Result:= 'Address already in use';
|
||||
WSAEADDRNOTAVAIL : Result:= 'Can''t assign requested address';
|
||||
WSAENETDOWN : Result:= 'Network is down';
|
||||
WSAENETUNREACH : Result:= 'Network is unreachable';
|
||||
WSAENETRESET : Result:= 'Network dropped connection on reset';
|
||||
WSAECONNABORTED : Result:= 'Software caused connection abort';
|
||||
WSAECONNRESET : Result:= 'Connection reset by peer';
|
||||
WSAENOBUFS : Result:= 'No buffer space available';
|
||||
WSAEISCONN : Result:= 'Socket is already connected';
|
||||
WSAENOTCONN : Result:= 'Socket is not connected';
|
||||
WSAESHUTDOWN : Result:= 'Can''t send after socket shutdown';
|
||||
WSAETOOMANYREFS : Result:= 'Too many references:can''t splice';
|
||||
WSAETIMEDOUT : Result:= 'Connection timed out';
|
||||
WSAECONNREFUSED : Result:= 'Connection refused';
|
||||
WSAELOOP : Result:= 'Too many levels of symbolic links';
|
||||
WSAENAMETOOLONG : Result:= 'File name is too long';
|
||||
WSAEHOSTDOWN : Result:= 'Host is down';
|
||||
WSAEHOSTUNREACH : Result:= 'No route to host';
|
||||
WSAENOTEMPTY : Result:= 'Directory is not empty';
|
||||
WSAEPROCLIM : Result:= 'Too many processes';
|
||||
WSAEUSERS : Result:= 'Too many users';
|
||||
WSAEDQUOT : Result:= 'Disk quota exceeded';
|
||||
WSAESTALE : Result:= 'Stale NFS file handle';
|
||||
WSAEREMOTE : Result:= 'Too many levels of remote in path';
|
||||
WSASYSNOTREADY : Result:= 'Network subsystem is unusable';
|
||||
WSAVERNOTSUPPORTED : Result:= 'Winsock DLL cannot support this application';
|
||||
WSANOTINITIALISED : Result:= 'Winsock not initialized';
|
||||
WSAHOST_NOT_FOUND : Result:= 'Host not found';
|
||||
WSATRY_AGAIN : Result:= 'Non authoritative - host not found';
|
||||
WSANO_RECOVERY : Result:= 'Non recoverable error';
|
||||
WSANO_DATA : Result:= 'Valid name, no data record of requested type'
|
||||
WSAEINTR :{10004} Result:= 'Interrupted system call';
|
||||
WSAEBADF :{10009} Result:= 'Bad file number';
|
||||
WSAEACCES :{10013} Result:= 'Permission denied';
|
||||
WSAEFAULT :{10014} Result:= 'Bad address';
|
||||
WSAEINVAL :{10022} Result:= 'Invalid argument';
|
||||
WSAEMFILE :{10024} Result:= 'Too many open files';
|
||||
WSAEWOULDBLOCK :{10035} Result:= 'Operation would block';
|
||||
WSAEINPROGRESS :{10036} Result:= 'Operation now in progress';
|
||||
WSAEALREADY :{10037} Result:= 'Operation already in progress';
|
||||
WSAENOTSOCK :{10038} Result:= 'Socket operation on nonsocket';
|
||||
WSAEDESTADDRREQ :{10039} Result:= 'Destination address required';
|
||||
WSAEMSGSIZE :{10040} Result:= 'Message too long';
|
||||
WSAEPROTOTYPE :{10041} Result:= 'Protocol wrong type for socket';
|
||||
WSAENOPROTOOPT :{10042} Result:= 'Protocol not available';
|
||||
WSAEPROTONOSUPPORT :{10043} Result:= 'Protocol not supported';
|
||||
WSAESOCKTNOSUPPORT :{10044} Result:= 'Socket not supported';
|
||||
WSAEOPNOTSUPP :{10045} Result:= 'Operation not supported on socket';
|
||||
WSAEPFNOSUPPORT :{10046} Result:= 'Protocol family not supported';
|
||||
WSAEAFNOSUPPORT :{10047} Result:= 'Address family not supported';
|
||||
WSAEADDRINUSE :{10048} Result:= 'Address already in use';
|
||||
WSAEADDRNOTAVAIL :{10049} Result:= 'Can''t assign requested address';
|
||||
WSAENETDOWN :{10050} Result:= 'Network is down';
|
||||
WSAENETUNREACH :{10051} Result:= 'Network is unreachable';
|
||||
WSAENETRESET :{10052} Result:= 'Network dropped connection on reset';
|
||||
WSAECONNABORTED :{10053} Result:= 'Software caused connection abort';
|
||||
WSAECONNRESET :{10054} Result:= 'Connection reset by peer';
|
||||
WSAENOBUFS :{10055} Result:= 'No buffer space available';
|
||||
WSAEISCONN :{10056} Result:= 'Socket is already connected';
|
||||
WSAENOTCONN :{10057} Result:= 'Socket is not connected';
|
||||
WSAESHUTDOWN :{10058} Result:= 'Can''t send after socket shutdown';
|
||||
WSAETOOMANYREFS :{10059} Result:= 'Too many references:can''t splice';
|
||||
WSAETIMEDOUT :{10060} Result:= 'Connection timed out';
|
||||
WSAECONNREFUSED :{10061} Result:= 'Connection refused';
|
||||
WSAELOOP :{10062} Result:= 'Too many levels of symbolic links';
|
||||
WSAENAMETOOLONG :{10063} Result:= 'File name is too long';
|
||||
WSAEHOSTDOWN :{10064} Result:= 'Host is down';
|
||||
WSAEHOSTUNREACH :{10065} Result:= 'No route to host';
|
||||
WSAENOTEMPTY :{10066} Result:= 'Directory is not empty';
|
||||
WSAEPROCLIM :{10067} Result:= 'Too many processes';
|
||||
WSAEUSERS :{10068} Result:= 'Too many users';
|
||||
WSAEDQUOT :{10069} Result:= 'Disk quota exceeded';
|
||||
WSAESTALE :{10070} Result:= 'Stale NFS file handle';
|
||||
WSAEREMOTE :{10071} Result:= 'Too many levels of remote in path';
|
||||
WSASYSNOTREADY :{10091} Result:= 'Network subsystem is unusable';
|
||||
WSAVERNOTSUPPORTED :{10092} Result:= 'Winsock DLL cannot support this application';
|
||||
WSANOTINITIALISED :{10093} Result:= 'Winsock not initialized';
|
||||
WSAEDISCON :{10101} Result:= 'WSAEDISCON-10101';
|
||||
WSAHOST_NOT_FOUND :{11001} Result:= 'Host not found';
|
||||
WSATRY_AGAIN :{11002} Result:= 'Non authoritative - host not found';
|
||||
WSANO_RECOVERY :{11003} Result:= 'Non recoverable error';
|
||||
WSANO_DATA :{11004} Result:= 'Valid name, no data record of requested type'
|
||||
else
|
||||
Result:= 'Not a Winsock error ('+IntToStr(ErrorCode)+')';
|
||||
end;
|
||||
|
422
httpsend.pas
422
httpsend.pas
@ -1,5 +1,5 @@
|
||||
{==============================================================================|
|
||||
| Project : Delphree - Synapse | 001.002.000 |
|
||||
| Project : Delphree - Synapse | 002.000.000 |
|
||||
|==============================================================================|
|
||||
| Content: HTTP client |
|
||||
|==============================================================================|
|
||||
@ -33,11 +33,26 @@ const
|
||||
CRLF=#13+#10;
|
||||
|
||||
type
|
||||
TTransferEncoding=(TE_UNKNOWN,
|
||||
TE_IDENTITY,
|
||||
TE_CHUNKED);
|
||||
|
||||
THTTPSend = class
|
||||
private
|
||||
Sock:TTCPBlockSocket;
|
||||
TransferEncoding:TTransferEncoding;
|
||||
AliveHost:string;
|
||||
AlivePort:string;
|
||||
function ReadUnknown:boolean;
|
||||
function ReadIdentity(size:integer):boolean;
|
||||
function ReadChunked:boolean;
|
||||
public
|
||||
timeout:integer;
|
||||
headers:TStringlist;
|
||||
Document:TMemoryStream;
|
||||
MimeType:string;
|
||||
Protocol:string;
|
||||
KeepAlive:boolean;
|
||||
Timeout:integer;
|
||||
HTTPHost:string;
|
||||
HTTPPort:string;
|
||||
ProxyHost:string;
|
||||
@ -45,15 +60,17 @@ type
|
||||
ProxyUser:string;
|
||||
ProxyPass:string;
|
||||
ResultCode:integer;
|
||||
ResultString:string;
|
||||
Constructor Create;
|
||||
Destructor Destroy; override;
|
||||
function Request(Query,Response:TStrings):Boolean;
|
||||
function DoMethod(method,URL:string;Content,Response:TStrings):boolean;
|
||||
procedure clear;
|
||||
procedure DecodeStatus(value:string);
|
||||
function HTTPmethod(method,URL:string):boolean;
|
||||
end;
|
||||
|
||||
function SimpleGet(URL:string;Response:TStrings):Boolean;
|
||||
function Get(URL:string;Response:TStrings):Boolean;
|
||||
function Post(URL:string;Value,Response:TStrings):Boolean;
|
||||
function HttpGetText(URL:string;Response:TStrings):Boolean;
|
||||
function HttpGetBinary(URL:string;Response:TStream):Boolean;
|
||||
function HttpPostBinary(URL:string;Data:TStream):Boolean;
|
||||
|
||||
implementation
|
||||
|
||||
@ -61,8 +78,11 @@ implementation
|
||||
Constructor THTTPSend.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
Headers:=TStringList.create;
|
||||
Document:=TMemoryStream.Create;
|
||||
sock:=TTCPBlockSocket.create;
|
||||
sock.CreateSocket;
|
||||
sock.SizeRecvBuffer:=65536;
|
||||
sock.SizeSendBuffer:=65536;
|
||||
timeout:=300000;
|
||||
HTTPhost:='localhost';
|
||||
HTTPPort:='80';
|
||||
@ -70,147 +90,333 @@ begin
|
||||
ProxyPort:='8080';
|
||||
ProxyUser:='';
|
||||
ProxyPass:='';
|
||||
AliveHost:='';
|
||||
AlivePort:='';
|
||||
Protocol:='1.1';
|
||||
KeepAlive:=true;
|
||||
Clear;
|
||||
end;
|
||||
|
||||
{THTTPSend.Destroy}
|
||||
Destructor THTTPSend.Destroy;
|
||||
begin
|
||||
Sock.free;
|
||||
Document.free;
|
||||
headers.free;
|
||||
inherited destroy;
|
||||
end;
|
||||
|
||||
{THTTPSend.Request}
|
||||
function THTTPSend.Request(Query,Response:TStrings):Boolean;
|
||||
var
|
||||
s:string;
|
||||
n:integer;
|
||||
{THTTPSend.Clear}
|
||||
procedure THTTPSend.Clear;
|
||||
begin
|
||||
Result:=False;
|
||||
sock.Connect(HTTPHost,HTTPPort);
|
||||
if sock.lasterror<>0 then Exit;
|
||||
for n:=0 to Query.Count-1 do
|
||||
Sock.SendString(Query[n]+CRLF);
|
||||
if Query[query.Count-1]<>'' then
|
||||
Sock.SendString(CRLF);
|
||||
if sock.lasterror<>0 then Exit;
|
||||
repeat
|
||||
s:=sock.recvstring(timeout);
|
||||
Response.Add(s);
|
||||
until sock.lasterror<>0;
|
||||
Result:=True;
|
||||
Document.Clear;
|
||||
Headers.Clear;
|
||||
MimeType:='text/html';
|
||||
end;
|
||||
|
||||
{THTTPSend.DoMethod}
|
||||
function THTTPSend.DoMethod(method,URL:string;Content,Response:TStrings):boolean;
|
||||
{THTTPSend.DecodeStatus}
|
||||
procedure THTTPSend.DecodeStatus(value:string);
|
||||
var
|
||||
Prot,User,Pass,Host,Port,Path,Para:string;
|
||||
Query:TstringList;
|
||||
s,su:string;
|
||||
begin
|
||||
s:=separateright(value,' ');
|
||||
su:=separateleft(s,' ');
|
||||
ResultCode:=StrToIntDef(su,0);
|
||||
ResultString:=separateright(s,' ');
|
||||
if ResultString=s
|
||||
then ResultString:='';
|
||||
end;
|
||||
|
||||
{THTTPSend.HTTPmethod}
|
||||
function THTTPSend.HTTPmethod(method,URL:string):boolean;
|
||||
var
|
||||
sending,receiving:boolean;
|
||||
status100:boolean;
|
||||
status100error:string;
|
||||
ToClose:boolean;
|
||||
size:integer;
|
||||
Prot,User,Pass,Host,Port,Path,Para,URI:string;
|
||||
n:integer;
|
||||
s,su:string;
|
||||
begin
|
||||
{initial values}
|
||||
result:=false;
|
||||
ResultCode:=500;
|
||||
ResultString:='';
|
||||
|
||||
URI:=ParseURL(URL,Prot,User,Pass,Host,Port,Path,Para);
|
||||
sending:=Document.Size>0;
|
||||
{headers for sending data}
|
||||
status100:=sending and (protocol='1.1');
|
||||
if status100
|
||||
then Headers.insert(0,'Expect: 100-continue');
|
||||
if sending then
|
||||
begin
|
||||
Headers.insert(0,'Content-Length: '+inttostr(Document.size));
|
||||
if MimeType<>''
|
||||
then Headers.insert(0,'Content-Type: '+MimeType);
|
||||
end;
|
||||
{seting KeepAlives}
|
||||
if not KeepAlive
|
||||
then Headers.insert(0,'Connection: close');
|
||||
{set target servers/proxy, authorisations, etc...}
|
||||
if User<>''
|
||||
then Headers.insert(0,'Authorization: Basic '+EncodeBase64(user+':'+pass));
|
||||
if (proxyhost<>'') and (proxyUser<>'')
|
||||
then Headers.insert(0,'Proxy-Authorization: Basic '+EncodeBase64(Proxyuser+':'+Proxypass));
|
||||
Headers.insert(0,'Host: '+host+':'+port);
|
||||
if proxyHost<>''
|
||||
then URI:=prot+'://'+host+':'+port+URI;
|
||||
if URI='/*'
|
||||
then URI:='*';
|
||||
if protocol='0.9'
|
||||
then Headers.insert(0,uppercase(method)+' '+URI)
|
||||
else Headers.insert(0,uppercase(method)+' '+URI+' HTTP/'+protocol);
|
||||
if proxyhost=''
|
||||
then
|
||||
begin
|
||||
HttpHost:=host;
|
||||
HttpPort:=port;
|
||||
end
|
||||
else
|
||||
begin
|
||||
HttpHost:=Proxyhost;
|
||||
HttpPort:=Proxyport;
|
||||
end;
|
||||
if headers[headers.count-1]<>''
|
||||
then headers.add('');
|
||||
|
||||
{connect}
|
||||
if (Alivehost<>HTTPhost) or (AlivePort<>HTTPport)
|
||||
then
|
||||
begin
|
||||
sock.CloseSocket;
|
||||
sock.CreateSocket;
|
||||
sock.Connect(HTTPHost,HTTPPort);
|
||||
if sock.lasterror<>0 then Exit;
|
||||
Alivehost:=HTTPhost;
|
||||
AlivePort:=HTTPport;
|
||||
end
|
||||
else
|
||||
begin
|
||||
if sock.canread(0) then
|
||||
begin
|
||||
sock.CloseSocket;
|
||||
sock.createsocket;
|
||||
sock.Connect(HTTPHost,HTTPPort);
|
||||
if sock.lasterror<>0 then Exit;
|
||||
end;
|
||||
end;
|
||||
|
||||
{send headers}
|
||||
Sock.SendString(Headers[0]+CRLF);
|
||||
if protocol<>'0.9' then
|
||||
for n:=1 to Headers.Count-1 do
|
||||
Sock.SendString(Headers[n]+CRLF);
|
||||
if sock.lasterror<>0 then Exit;
|
||||
|
||||
{reading Status}
|
||||
Status100Error:='';
|
||||
if status100 then
|
||||
begin
|
||||
repeat
|
||||
s:=sock.recvstring(timeout);
|
||||
if s<>'' then break;
|
||||
until sock.lasterror<>0;
|
||||
DecodeStatus(s);
|
||||
if (ResultCode>=100) and (ResultCode<200)
|
||||
then
|
||||
begin
|
||||
repeat
|
||||
s:=sock.recvstring(timeout);
|
||||
if s='' then break;
|
||||
until sock.lasterror<>0;
|
||||
end
|
||||
else
|
||||
begin
|
||||
sending:=false;
|
||||
Status100Error:=s;
|
||||
end;
|
||||
end;
|
||||
|
||||
{send document}
|
||||
if sending then
|
||||
begin
|
||||
Sock.SendBuffer(Document.memory,Document.size);
|
||||
if sock.lasterror<>0 then Exit;
|
||||
end;
|
||||
|
||||
clear;
|
||||
size:=-1;
|
||||
TransferEncoding:=TE_UNKNOWN;
|
||||
|
||||
{read status}
|
||||
If Status100Error=''
|
||||
then
|
||||
begin
|
||||
repeat
|
||||
s:=sock.recvstring(timeout);
|
||||
if s<>'' then break;
|
||||
until sock.lasterror<>0;
|
||||
if pos('HTTP/',uppercase(s))=1
|
||||
then
|
||||
begin
|
||||
Headers.add(s);
|
||||
decodeStatus(s);
|
||||
end
|
||||
else
|
||||
begin
|
||||
{old HTTP 0.9 and some buggy servers not send result}
|
||||
s:=s+CRLF;
|
||||
document.Write(pointer(s)^,length(s));
|
||||
ResultCode:=0;
|
||||
end;
|
||||
end
|
||||
else Headers.add(Status100Error);
|
||||
|
||||
{if need receive hedaers, receive and parse it}
|
||||
ToClose:=protocol<>'1.1';
|
||||
if Headers.count>0 then
|
||||
repeat
|
||||
s:=sock.recvstring(timeout);
|
||||
Headers.Add(s);
|
||||
if s=''
|
||||
then break;
|
||||
su:=uppercase(s);
|
||||
if pos('CONTENT-LENGTH:',su)=1 then
|
||||
begin
|
||||
size:=strtointdef(separateright(s,' '),-1);
|
||||
TransferEncoding:=TE_IDENTITY;
|
||||
end;
|
||||
if pos('CONTENT-TYPE:',su)=1 then
|
||||
MimeType:=separateright(s,' ');
|
||||
if pos('TRANSFER-ENCODING:',su)=1 then
|
||||
begin
|
||||
s:=separateright(su,' ');
|
||||
if pos('CHUNKED',s)>0 then
|
||||
TransferEncoding:=TE_CHUNKED;
|
||||
end;
|
||||
if pos('CONNECTION: CLOSE',su)=1 then
|
||||
ToClose:=true;
|
||||
until sock.lasterror<>0;
|
||||
|
||||
{if need receive response body, read it}
|
||||
Receiving:=Method<>'HEAD';
|
||||
Receiving:=Receiving and (ResultCode<>204);
|
||||
Receiving:=Receiving and (ResultCode<>304);
|
||||
if Receiving then
|
||||
case TransferEncoding of
|
||||
TE_UNKNOWN : readunknown;
|
||||
TE_IDENTITY: readidentity(size);
|
||||
TE_CHUNKED : readChunked;
|
||||
end;
|
||||
|
||||
Document.Seek(0,soFromBeginning);
|
||||
result:=true;
|
||||
if ToClose then
|
||||
begin
|
||||
sock.closesocket;
|
||||
Alivehost:='';
|
||||
AlivePort:='';
|
||||
end;
|
||||
end;
|
||||
|
||||
{THTTPSend.ReadUnknown}
|
||||
function THTTPSend.ReadUnknown:boolean;
|
||||
var
|
||||
s:string;
|
||||
begin
|
||||
result:=false;
|
||||
Query:=TstringList.create;
|
||||
try
|
||||
parseURL(URL,Prot,User,Pass,Host,Port,Path,Para);
|
||||
if content<>nil
|
||||
then query.AddStrings(content);
|
||||
size:=length(query.text);
|
||||
query.insert(0,'');
|
||||
query.insert(0,'User-Agent: Synapse/1.1');
|
||||
query.insert(0,'Connection: close');
|
||||
query.insert(0,'Accept-Encoding: identity');
|
||||
if User<>''
|
||||
then query.insert(0,'Authorization: Basic '+EncodeBase64(user+':'+pass));
|
||||
if (proxyhost<>'') and (proxyUser<>'')
|
||||
then query.insert(0,'Proxy-Authorization: Basic '+EncodeBase64(Proxyuser+':'+Proxypass));
|
||||
if size>0
|
||||
then query.insert(0,'Content-Length: '+inttostr(size));
|
||||
query.insert(0,'Host: '+host+':'+port);
|
||||
repeat
|
||||
s:=sock.recvstring(timeout);
|
||||
s:=s+CRLF;
|
||||
document.Write(pointer(s)^,length(s));
|
||||
until sock.lasterror<>0;
|
||||
result:=true;
|
||||
end;
|
||||
|
||||
if para=''
|
||||
then s:=''
|
||||
else s:='?'+para;
|
||||
s:=path+s;
|
||||
if proxyHost<>''
|
||||
then s:=prot+'://'+host+':'+port+s;
|
||||
query.insert(0,uppercase(method)+' '+s+' HTTP/1.0');
|
||||
if proxyhost=''
|
||||
then
|
||||
begin
|
||||
HttpHost:=host;
|
||||
HttpPort:=port;
|
||||
end
|
||||
else
|
||||
begin
|
||||
HttpHost:=Proxyhost;
|
||||
HttpPort:=Proxyport;
|
||||
end;
|
||||
result:=request(query,response);
|
||||
ResultCode:=0;
|
||||
if response.count>0
|
||||
then if pos('HTTP/',uppercase(response[0]))=1
|
||||
then
|
||||
begin
|
||||
s:=separateright(response[0],' ');
|
||||
s:=separateleft(s,' ');
|
||||
ResultCode:=StrToIntDef(s,0);
|
||||
end;
|
||||
{THTTPSend.ReadIdentity}
|
||||
function THTTPSend.ReadIdentity(size:integer):boolean;
|
||||
var
|
||||
mem:TMemoryStream;
|
||||
begin
|
||||
mem:=TMemoryStream.create;
|
||||
try
|
||||
mem.SetSize(size);
|
||||
sock.RecvBufferEx(mem.memory,size,timeout);
|
||||
result:=sock.lasterror=0;
|
||||
document.CopyFrom(mem,0);
|
||||
finally
|
||||
Query.free;
|
||||
mem.free;
|
||||
end;
|
||||
end;
|
||||
|
||||
{THTTPSend.ReadChunked}
|
||||
function THTTPSend.ReadChunked:boolean;
|
||||
var
|
||||
s:string;
|
||||
size:integer;
|
||||
begin
|
||||
repeat
|
||||
repeat
|
||||
s:=sock.recvstring(timeout);
|
||||
until s<>'';
|
||||
if sock.lasterror<>0
|
||||
then break;
|
||||
s:=separateleft(s,' ');
|
||||
size:=strtointdef('$'+s,0);
|
||||
if size=0 then break;
|
||||
ReadIdentity(size);
|
||||
until false;
|
||||
result:=sock.lasterror=0;
|
||||
end;
|
||||
|
||||
{==============================================================================}
|
||||
|
||||
{SimpleGet}
|
||||
function SimpleGet(URL:string;Response:TStrings):Boolean;
|
||||
{HttpGetText}
|
||||
function HttpGetText(URL:string;Response:TStrings):Boolean;
|
||||
var
|
||||
HTTP:THTTPSend;
|
||||
Query:TStringList;
|
||||
Prot,User,Pass,Host,Port,Path,Para:string;
|
||||
begin
|
||||
parseURL(URL,Prot,User,Pass,Host,Port,Path,Para);
|
||||
if para<>''
|
||||
then path:=path+'?'+para;
|
||||
Result:=False;
|
||||
HTTP:=THTTPSend.Create;
|
||||
Query:=TStringList.create;
|
||||
try
|
||||
HTTP.HTTPhost:=Host;
|
||||
Query.Add('GET '+Path);
|
||||
if not HTTP.Request(Query,Response) then Exit;
|
||||
finally
|
||||
Query.Free;
|
||||
HTTP.Free;
|
||||
end;
|
||||
Result:=True;
|
||||
end;
|
||||
|
||||
{get}
|
||||
function Get(URL:string;Response:TStrings):Boolean;
|
||||
var
|
||||
HTTP:THTTPSend;
|
||||
Prot,User,Pass,Host,Port,Path,Para:string;
|
||||
begin
|
||||
Result:=False;
|
||||
HTTP:=THTTPSend.Create;
|
||||
try
|
||||
result:=HTTP.DoMethod('GET',URL,nil,Response);
|
||||
Result:=HTTP.HTTPmethod('GET',URL);
|
||||
response.LoadFromStream(HTTP.document);
|
||||
finally
|
||||
HTTP.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
{post}
|
||||
function Post(URL:string;Value,Response:TStrings):Boolean;
|
||||
{HttpGetBinary}
|
||||
function HttpGetBinary(URL:string;Response:TStream):Boolean;
|
||||
var
|
||||
HTTP:THTTPSend;
|
||||
Prot,User,Pass,Host,Port,Path,Para:string;
|
||||
begin
|
||||
Result:=False;
|
||||
HTTP:=THTTPSend.Create;
|
||||
try
|
||||
result:=HTTP.DoMethod('POST',URL,Value,Response);
|
||||
Result:=HTTP.HTTPmethod('GET',URL);
|
||||
Response.Seek(0,soFromBeginning);
|
||||
Response.CopyFrom(HTTP.document,0);
|
||||
finally
|
||||
HTTP.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
{HttpPostBinary}
|
||||
function HttpPostBinary(URL:string;Data:TStream):Boolean;
|
||||
var
|
||||
HTTP:THTTPSend;
|
||||
begin
|
||||
Result:=False;
|
||||
HTTP:=THTTPSend.Create;
|
||||
try
|
||||
HTTP.Document.CopyFrom(data,0);
|
||||
HTTP.MimeType:='Application/octet-stream';
|
||||
Result:=HTTP.HTTPmethod('POST',URL);
|
||||
data.Seek(0,soFromBeginning);
|
||||
data.CopyFrom(HTTP.document,0);
|
||||
finally
|
||||
HTTP.Free;
|
||||
end;
|
||||
|
125
smtpsend.pas
125
smtpsend.pas
@ -1,5 +1,5 @@
|
||||
{==============================================================================|
|
||||
| Project : Delphree - Synapse | 002.000.000 |
|
||||
| Project : Delphree - Synapse | 002.001.000 |
|
||||
|==============================================================================|
|
||||
| Content: SMTP client |
|
||||
|==============================================================================|
|
||||
@ -41,6 +41,7 @@ type
|
||||
public
|
||||
timeout:integer;
|
||||
SMTPHost:string;
|
||||
SMTPPort:string;
|
||||
ResultCode:integer;
|
||||
ResultString:string;
|
||||
FullResult:TStringList;
|
||||
@ -54,10 +55,14 @@ type
|
||||
EnhCode1:integer;
|
||||
EnhCode2:integer;
|
||||
EnhCode3:integer;
|
||||
SystemName:string;
|
||||
Constructor Create;
|
||||
Destructor Destroy; override;
|
||||
function AuthLogin:Boolean;
|
||||
function AuthCram:Boolean;
|
||||
function Connect:Boolean;
|
||||
function Helo:Boolean;
|
||||
function Ehlo:Boolean;
|
||||
function login:Boolean;
|
||||
procedure logout;
|
||||
function reset:Boolean;
|
||||
@ -68,6 +73,7 @@ type
|
||||
function etrn(Value:string):Boolean;
|
||||
function verify(Value:string):Boolean;
|
||||
function EnhCodeString:string;
|
||||
function FindCap(value:string):string;
|
||||
end;
|
||||
|
||||
function SendtoRaw (mailfrom,mailto,SMTPHost:string;maildata:TStrings;Username,Password:string):Boolean;
|
||||
@ -86,8 +92,10 @@ begin
|
||||
sock.CreateSocket;
|
||||
timeout:=300000;
|
||||
SMTPhost:='localhost';
|
||||
SMTPPort:='smtp';
|
||||
Username:='';
|
||||
Password:='';
|
||||
SystemName:=sock.localname;
|
||||
end;
|
||||
|
||||
{TSMTPSend.Destroy}
|
||||
@ -181,11 +189,47 @@ begin
|
||||
Result:=True;
|
||||
end;
|
||||
|
||||
{TSMTPSend.Connect}
|
||||
function TSMTPSend.Connect:Boolean;
|
||||
begin
|
||||
Result:=false;
|
||||
sock.CloseSocket;
|
||||
sock.CreateSocket;
|
||||
sock.Connect(SMTPHost,SMTPPort);
|
||||
if sock.lasterror<>0 then Exit;
|
||||
Result:=True;
|
||||
end;
|
||||
|
||||
{TSMTPSend.Helo}
|
||||
function TSMTPSend.Helo:Boolean;
|
||||
var
|
||||
x:integer;
|
||||
begin
|
||||
Result:=false;
|
||||
Sock.SendString('HELO '+SystemName+CRLF);
|
||||
x:=ReadResult;
|
||||
if (x<250) or (x>259) then Exit;
|
||||
Result:=True;
|
||||
end;
|
||||
|
||||
{TSMTPSend.Ehlo}
|
||||
function TSMTPSend.Ehlo:Boolean;
|
||||
var
|
||||
x:integer;
|
||||
begin
|
||||
Result:=false;
|
||||
Sock.SendString('EHLO '+SystemName+CRLF);
|
||||
x:=ReadResult;
|
||||
if (x<250) or (x>259) then Exit;
|
||||
Result:=True;
|
||||
end;
|
||||
|
||||
{TSMTPSend.login}
|
||||
function TSMTPSend.login:Boolean;
|
||||
var
|
||||
n:integer;
|
||||
auths:string;
|
||||
s:string;
|
||||
begin
|
||||
Result:=False;
|
||||
ESMTP:=true;
|
||||
@ -193,15 +237,12 @@ begin
|
||||
ESMTPcap.clear;
|
||||
ESMTPSize:=false;
|
||||
MaxSize:=0;
|
||||
sock.Connect(SMTPHost,'smtp');
|
||||
if sock.lasterror<>0 then Exit;
|
||||
if not Connect then Exit;
|
||||
if readresult<>220 then Exit;
|
||||
Sock.SendString('EHLO '+sock.LocalName+CRLF);
|
||||
if readresult<>250 then
|
||||
if not Ehlo then
|
||||
begin
|
||||
ESMTP:=false;
|
||||
Sock.SendString('HELO '+sock.LocalName+CRLF);
|
||||
if readresult<>250 then Exit;
|
||||
if not Helo then exit;
|
||||
end;
|
||||
Result:=True;
|
||||
if ESMTP then
|
||||
@ -209,30 +250,27 @@ begin
|
||||
for n:=1 to FullResult.count-1 do
|
||||
ESMTPcap.add(Copy(FullResult[n],5,length(Fullresult[n])-4));
|
||||
if not ((Username='') and (Password='')) then
|
||||
for n:=0 to ESMTPcap.count-1 do
|
||||
begin
|
||||
auths:=uppercase(ESMTPcap[n]);
|
||||
if pos('AUTH ',auths)=1 then
|
||||
begin
|
||||
if pos('CRAM-MD5',auths)>0 then
|
||||
begin
|
||||
AuthDone:=AuthCram;
|
||||
break;
|
||||
end;
|
||||
if pos('LOGIN',auths)>0 then
|
||||
begin
|
||||
AuthDone:=AuthLogin;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
for n:=0 to ESMTPcap.count-1 do
|
||||
if pos('SIZE',uppercase(ESMTPcap[n]))=1 then
|
||||
begin
|
||||
ESMTPsize:=true;
|
||||
MaxSize:=StrToIntDef(copy(ESMTPcap[n],6,length(ESMTPcap[n])-5),0);
|
||||
break;
|
||||
end;
|
||||
begin
|
||||
s:=FindCap('AUTH ');
|
||||
if s=''
|
||||
then s:=FindCap('AUTH=');
|
||||
auths:=uppercase(s);
|
||||
if s<>'' then
|
||||
begin
|
||||
if pos('CRAM-MD5',auths)>0
|
||||
then AuthDone:=AuthCram;
|
||||
if (pos('LOGIN',auths)>0) and (not authDone)
|
||||
then AuthDone:=AuthLogin;
|
||||
end;
|
||||
if AuthDone
|
||||
then Ehlo;
|
||||
end;
|
||||
s:=FindCap('SIZE');
|
||||
if s<>'' then
|
||||
begin
|
||||
ESMTPsize:=true;
|
||||
MaxSize:=StrToIntDef(copy(s,6,length(s)-5),0);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -309,19 +347,25 @@ end;
|
||||
|
||||
{TSMTPSend.etrn}
|
||||
function TSMTPSend.etrn(Value:string):Boolean;
|
||||
var
|
||||
x:integer;
|
||||
begin
|
||||
Result:=false;
|
||||
Sock.SendString('ETRN '+Value+CRLF);
|
||||
if (readresult<250) or (readresult>259) then Exit;
|
||||
x:=ReadResult;
|
||||
if (x<250) or (x>259) then Exit;
|
||||
Result:=True;
|
||||
end;
|
||||
|
||||
{TSMTPSend.verify}
|
||||
function TSMTPSend.verify(Value:string):Boolean;
|
||||
var
|
||||
x:integer;
|
||||
begin
|
||||
Result:=false;
|
||||
Sock.SendString('VRFY '+Value+CRLF);
|
||||
if (readresult<250) or (readresult>259) then Exit;
|
||||
x:=ReadResult;
|
||||
if (x<250) or (x>259) then Exit;
|
||||
Result:=True;
|
||||
end;
|
||||
|
||||
@ -388,6 +432,21 @@ begin
|
||||
result:=s+t;
|
||||
end;
|
||||
|
||||
{TSMTPSend.FindCap}
|
||||
function TSMTPSend.FindCap(value:string):string;
|
||||
var
|
||||
n:integer;
|
||||
s:string;
|
||||
begin
|
||||
s:=uppercase(value);
|
||||
result:='';
|
||||
for n:=0 to ESMTPcap.count-1 do
|
||||
if pos(s,uppercase(ESMTPcap[n]))=1 then
|
||||
begin
|
||||
result:=ESMTPcap[n];
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
|
||||
{==============================================================================}
|
||||
|
||||
|
130
synacode.pas
130
synacode.pas
@ -1,5 +1,5 @@
|
||||
{==============================================================================|
|
||||
| Project : Delphree - Synapse | 001.003.000 |
|
||||
| Project : Delphree - Synapse | 001.003.001 |
|
||||
|==============================================================================|
|
||||
| Content: Coding and decoding support |
|
||||
|==============================================================================|
|
||||
@ -400,73 +400,73 @@ begin
|
||||
C:=Buf[2];
|
||||
D:=Buf[3];
|
||||
|
||||
Round1(A,B,C,D, Data[ 0] + $d76aa478, 7);
|
||||
Round1(D,A,B,C, Data[ 1] + $e8c7b756, 12);
|
||||
Round1(C,D,A,B, Data[ 2] + $242070db, 17);
|
||||
Round1(B,C,D,A, Data[ 3] + $c1bdceee, 22);
|
||||
Round1(A,B,C,D, Data[ 4] + $f57c0faf, 7);
|
||||
Round1(D,A,B,C, Data[ 5] + $4787c62a, 12);
|
||||
Round1(C,D,A,B, Data[ 6] + $a8304613, 17);
|
||||
Round1(B,C,D,A, Data[ 7] + $fd469501, 22);
|
||||
Round1(A,B,C,D, Data[ 8] + $698098d8, 7);
|
||||
Round1(D,A,B,C, Data[ 9] + $8b44f7af, 12);
|
||||
Round1(C,D,A,B, Data[10] + $ffff5bb1, 17);
|
||||
Round1(B,C,D,A, Data[11] + $895cd7be, 22);
|
||||
Round1(A,B,C,D, Data[12] + $6b901122, 7);
|
||||
Round1(D,A,B,C, Data[13] + $fd987193, 12);
|
||||
Round1(C,D,A,B, Data[14] + $a679438e, 17);
|
||||
Round1(B,C,D,A, Data[15] + $49b40821, 22);
|
||||
Round1(A,B,C,D, Data[ 0] + longint($d76aa478), 7);
|
||||
Round1(D,A,B,C, Data[ 1] + longint($e8c7b756), 12);
|
||||
Round1(C,D,A,B, Data[ 2] + longint($242070db), 17);
|
||||
Round1(B,C,D,A, Data[ 3] + longint($c1bdceee), 22);
|
||||
Round1(A,B,C,D, Data[ 4] + longint($f57c0faf), 7);
|
||||
Round1(D,A,B,C, Data[ 5] + longint($4787c62a), 12);
|
||||
Round1(C,D,A,B, Data[ 6] + longint($a8304613), 17);
|
||||
Round1(B,C,D,A, Data[ 7] + longint($fd469501), 22);
|
||||
Round1(A,B,C,D, Data[ 8] + longint($698098d8), 7);
|
||||
Round1(D,A,B,C, Data[ 9] + longint($8b44f7af), 12);
|
||||
Round1(C,D,A,B, Data[10] + longint($ffff5bb1), 17);
|
||||
Round1(B,C,D,A, Data[11] + longint($895cd7be), 22);
|
||||
Round1(A,B,C,D, Data[12] + longint($6b901122), 7);
|
||||
Round1(D,A,B,C, Data[13] + longint($fd987193), 12);
|
||||
Round1(C,D,A,B, Data[14] + longint($a679438e), 17);
|
||||
Round1(B,C,D,A, Data[15] + longint($49b40821), 22);
|
||||
|
||||
Round2(A,B,C,D, Data[ 1] + $f61e2562, 5);
|
||||
Round2(D,A,B,C, Data[ 6] + $c040b340, 9);
|
||||
Round2(C,D,A,B, Data[11] + $265e5a51, 14);
|
||||
Round2(B,C,D,A, Data[ 0] + $e9b6c7aa, 20);
|
||||
Round2(A,B,C,D, Data[ 5] + $d62f105d, 5);
|
||||
Round2(D,A,B,C, Data[10] + $02441453, 9);
|
||||
Round2(C,D,A,B, Data[15] + $d8a1e681, 14);
|
||||
Round2(B,C,D,A, Data[ 4] + $e7d3fbc8, 20);
|
||||
Round2(A,B,C,D, Data[ 9] + $21e1cde6, 5);
|
||||
Round2(D,A,B,C, Data[14] + $c33707d6, 9);
|
||||
Round2(C,D,A,B, Data[ 3] + $f4d50d87, 14);
|
||||
Round2(B,C,D,A, Data[ 8] + $455a14ed, 20);
|
||||
Round2(A,B,C,D, Data[13] + $a9e3e905, 5);
|
||||
Round2(D,A,B,C, Data[ 2] + $fcefa3f8, 9);
|
||||
Round2(C,D,A,B, Data[ 7] + $676f02d9, 14);
|
||||
Round2(B,C,D,A, Data[12] + $8d2a4c8a, 20);
|
||||
Round2(A,B,C,D, Data[ 1] + longint($f61e2562), 5);
|
||||
Round2(D,A,B,C, Data[ 6] + longint($c040b340), 9);
|
||||
Round2(C,D,A,B, Data[11] + longint($265e5a51), 14);
|
||||
Round2(B,C,D,A, Data[ 0] + longint($e9b6c7aa), 20);
|
||||
Round2(A,B,C,D, Data[ 5] + longint($d62f105d), 5);
|
||||
Round2(D,A,B,C, Data[10] + longint($02441453), 9);
|
||||
Round2(C,D,A,B, Data[15] + longint($d8a1e681), 14);
|
||||
Round2(B,C,D,A, Data[ 4] + longint($e7d3fbc8), 20);
|
||||
Round2(A,B,C,D, Data[ 9] + longint($21e1cde6), 5);
|
||||
Round2(D,A,B,C, Data[14] + longint($c33707d6), 9);
|
||||
Round2(C,D,A,B, Data[ 3] + longint($f4d50d87), 14);
|
||||
Round2(B,C,D,A, Data[ 8] + longint($455a14ed), 20);
|
||||
Round2(A,B,C,D, Data[13] + longint($a9e3e905), 5);
|
||||
Round2(D,A,B,C, Data[ 2] + longint($fcefa3f8), 9);
|
||||
Round2(C,D,A,B, Data[ 7] + longint($676f02d9), 14);
|
||||
Round2(B,C,D,A, Data[12] + longint($8d2a4c8a), 20);
|
||||
|
||||
Round3(A,B,C,D, Data[ 5] + $fffa3942, 4);
|
||||
Round3(D,A,B,C, Data[ 8] + $8771f681, 11);
|
||||
Round3(C,D,A,B, Data[11] + $6d9d6122, 16);
|
||||
Round3(B,C,D,A, Data[14] + $fde5380c, 23);
|
||||
Round3(A,B,C,D, Data[ 1] + $a4beea44, 4);
|
||||
Round3(D,A,B,C, Data[ 4] + $4bdecfa9, 11);
|
||||
Round3(C,D,A,B, Data[ 7] + $f6bb4b60, 16);
|
||||
Round3(B,C,D,A, Data[10] + $bebfbc70, 23);
|
||||
Round3(A,B,C,D, Data[13] + $289b7ec6, 4);
|
||||
Round3(D,A,B,C, Data[ 0] + $eaa127fa, 11);
|
||||
Round3(C,D,A,B, Data[ 3] + $d4ef3085, 16);
|
||||
Round3(B,C,D,A, Data[ 6] + $04881d05, 23);
|
||||
Round3(A,B,C,D, Data[ 9] + $d9d4d039, 4);
|
||||
Round3(D,A,B,C, Data[12] + $e6db99e5, 11);
|
||||
Round3(C,D,A,B, Data[15] + $1fa27cf8, 16);
|
||||
Round3(B,C,D,A, Data[ 2] + $c4ac5665, 23);
|
||||
Round3(A,B,C,D, Data[ 5] + longint($fffa3942), 4);
|
||||
Round3(D,A,B,C, Data[ 8] + longint($8771f681), 11);
|
||||
Round3(C,D,A,B, Data[11] + longint($6d9d6122), 16);
|
||||
Round3(B,C,D,A, Data[14] + longint($fde5380c), 23);
|
||||
Round3(A,B,C,D, Data[ 1] + longint($a4beea44), 4);
|
||||
Round3(D,A,B,C, Data[ 4] + longint($4bdecfa9), 11);
|
||||
Round3(C,D,A,B, Data[ 7] + longint($f6bb4b60), 16);
|
||||
Round3(B,C,D,A, Data[10] + longint($bebfbc70), 23);
|
||||
Round3(A,B,C,D, Data[13] + longint($289b7ec6), 4);
|
||||
Round3(D,A,B,C, Data[ 0] + longint($eaa127fa), 11);
|
||||
Round3(C,D,A,B, Data[ 3] + longint($d4ef3085), 16);
|
||||
Round3(B,C,D,A, Data[ 6] + longint($04881d05), 23);
|
||||
Round3(A,B,C,D, Data[ 9] + longint($d9d4d039), 4);
|
||||
Round3(D,A,B,C, Data[12] + longint($e6db99e5), 11);
|
||||
Round3(C,D,A,B, Data[15] + longint($1fa27cf8), 16);
|
||||
Round3(B,C,D,A, Data[ 2] + longint($c4ac5665), 23);
|
||||
|
||||
Round4(A,B,C,D, Data[ 0] + $f4292244, 6);
|
||||
Round4(D,A,B,C, Data[ 7] + $432aff97, 10);
|
||||
Round4(C,D,A,B, Data[14] + $ab9423a7, 15);
|
||||
Round4(B,C,D,A, Data[ 5] + $fc93a039, 21);
|
||||
Round4(A,B,C,D, Data[12] + $655b59c3, 6);
|
||||
Round4(D,A,B,C, Data[ 3] + $8f0ccc92, 10);
|
||||
Round4(C,D,A,B, Data[10] + $ffeff47d, 15);
|
||||
Round4(B,C,D,A, Data[ 1] + $85845dd1, 21);
|
||||
Round4(A,B,C,D, Data[ 8] + $6fa87e4f, 6);
|
||||
Round4(D,A,B,C, Data[15] + $fe2ce6e0, 10);
|
||||
Round4(C,D,A,B, Data[ 6] + $a3014314, 15);
|
||||
Round4(B,C,D,A, Data[13] + $4e0811a1, 21);
|
||||
Round4(A,B,C,D, Data[ 4] + $f7537e82, 6);
|
||||
Round4(D,A,B,C, Data[11] + $bd3af235, 10);
|
||||
Round4(C,D,A,B, Data[ 2] + $2ad7d2bb, 15);
|
||||
Round4(B,C,D,A, Data[ 9] + $eb86d391, 21);
|
||||
Round4(A,B,C,D, Data[ 0] + longint($f4292244), 6);
|
||||
Round4(D,A,B,C, Data[ 7] + longint($432aff97), 10);
|
||||
Round4(C,D,A,B, Data[14] + longint($ab9423a7), 15);
|
||||
Round4(B,C,D,A, Data[ 5] + longint($fc93a039), 21);
|
||||
Round4(A,B,C,D, Data[12] + longint($655b59c3), 6);
|
||||
Round4(D,A,B,C, Data[ 3] + longint($8f0ccc92), 10);
|
||||
Round4(C,D,A,B, Data[10] + longint($ffeff47d), 15);
|
||||
Round4(B,C,D,A, Data[ 1] + longint($85845dd1), 21);
|
||||
Round4(A,B,C,D, Data[ 8] + longint($6fa87e4f), 6);
|
||||
Round4(D,A,B,C, Data[15] + longint($fe2ce6e0), 10);
|
||||
Round4(C,D,A,B, Data[ 6] + longint($a3014314), 15);
|
||||
Round4(B,C,D,A, Data[13] + longint($4e0811a1), 21);
|
||||
Round4(A,B,C,D, Data[ 4] + longint($f7537e82), 6);
|
||||
Round4(D,A,B,C, Data[11] + longint($bd3af235), 10);
|
||||
Round4(C,D,A,B, Data[ 2] + longint($2ad7d2bb), 15);
|
||||
Round4(B,C,D,A, Data[ 9] + longint($eb86d391), 21);
|
||||
|
||||
Inc(Buf[0],A);
|
||||
Inc(Buf[1],B);
|
||||
|
39
synautil.pas
39
synautil.pas
@ -1,5 +1,5 @@
|
||||
{==============================================================================|
|
||||
| Project : Delphree - Synapse | 001.007.000 |
|
||||
| Project : Delphree - Synapse | 001.008.000 |
|
||||
|==============================================================================|
|
||||
| Content: support procedures and functions |
|
||||
|==============================================================================|
|
||||
@ -47,7 +47,8 @@ function GetEmailDesc(value:string):string;
|
||||
function StrToHex(value:string):string;
|
||||
function IntToBin(value:integer;digits:byte):string;
|
||||
function BinToInt(value:string):integer;
|
||||
procedure ParseURL(URL:string; var Prot,User,Pass,Host,Port,Path,Para:string);
|
||||
function ParseURL(URL:string; var Prot,User,Pass,Host,Port,Path,Para:string):string;
|
||||
function StringReplace(value,search,replace:string):string;
|
||||
|
||||
implementation
|
||||
|
||||
@ -338,7 +339,7 @@ end;
|
||||
|
||||
{==============================================================================}
|
||||
{ParseURL}
|
||||
procedure ParseURL(URL:string; var Prot,User,Pass,Host,Port,Path,Para:string);
|
||||
function ParseURL(URL:string; var Prot,User,Pass,Host,Port,Path,Para:string):string;
|
||||
var
|
||||
x:integer;
|
||||
sURL:string;
|
||||
@ -389,6 +390,7 @@ begin
|
||||
port:=separateright(s1,':');
|
||||
end
|
||||
else host:=s1;
|
||||
result:='/'+s2;
|
||||
x:=pos('?',s2);
|
||||
if x>0 then
|
||||
begin
|
||||
@ -400,6 +402,37 @@ begin
|
||||
then host:='localhost';
|
||||
end;
|
||||
|
||||
{==============================================================================}
|
||||
{StringReplace}
|
||||
function StringReplace(value,search,replace:string):string;
|
||||
var
|
||||
x,l,ls,lr:integer;
|
||||
begin
|
||||
if (value='') or (Search='') then
|
||||
begin
|
||||
result:=value;
|
||||
Exit;
|
||||
end;
|
||||
ls:=length(search);
|
||||
lr:=length(replace);
|
||||
result:='';
|
||||
x:=pos(search,value);
|
||||
while x>0 do
|
||||
begin
|
||||
l:=length(result);
|
||||
setlength(result,l+x-1);
|
||||
Move(pointer(value)^,Pointer(@result[l+1])^, x-1);
|
||||
// result:=result+copy(value,1,x-1);
|
||||
l:=length(result);
|
||||
setlength(result,l+lr);
|
||||
Move(pointer(replace)^,Pointer(@result[l+1])^, lr);
|
||||
// result:=result+replace;
|
||||
delete(value,1,x-1+ls);
|
||||
x:=pos(search,value);
|
||||
end;
|
||||
result:=result+value;
|
||||
end;
|
||||
|
||||
{==============================================================================}
|
||||
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user