143 lines
2.5 KiB
Ucode
143 lines
2.5 KiB
Ucode
class SRBufferedTCPLink extends BufferedTCPLink;
|
|
|
|
var IpAddr ServerIpAddr;
|
|
var string ReceiveState;
|
|
var string ErrorName;
|
|
|
|
var string RemoteAddress,RemoteURL;
|
|
var int RemotePort,ContentLength;
|
|
var bool bHasError,bHasData,bReceivedHeader;
|
|
|
|
final function OnError( string E )
|
|
{
|
|
bHasError = true; // set error flag
|
|
ErrorName = E;
|
|
SetTimer(0,false);
|
|
}
|
|
final function StartBuffering( string URL )
|
|
{
|
|
local int i;
|
|
|
|
Disable('Tick');
|
|
ResetBuffer();
|
|
i = InStr(URL,"/");
|
|
if( i>0 )
|
|
{
|
|
RemoteAddress = Left(URL,i);
|
|
RemoteURL = Mid(URL,i);
|
|
}
|
|
else
|
|
{
|
|
RemoteAddress = URL;
|
|
RemoteURL = "/index.html";
|
|
}
|
|
i = InStr(RemoteAddress,":");
|
|
if( i==-1 )
|
|
RemotePort = 80; // connect to http port
|
|
else
|
|
{
|
|
RemotePort = int(Mid(RemoteAddress,i+1));
|
|
RemoteAddress = Left(RemoteAddress,i);
|
|
}
|
|
Resolve(RemoteAddress);
|
|
}
|
|
function ResolveFailed()
|
|
{
|
|
OnError("Resolve failure ("$RemoteAddress$")");
|
|
}
|
|
function Resolved( IpAddr Addr )
|
|
{
|
|
// Set the address
|
|
ServerIpAddr.Addr = Addr.Addr;
|
|
ServerIpAddr.Port = RemotePort;
|
|
|
|
// Bind the local port.
|
|
if( BindPort() == 0 )
|
|
OnError("Port couldn't be bound");
|
|
else
|
|
{
|
|
OpenNoSteam( ServerIpAddr );
|
|
SetTimer(6,false);
|
|
}
|
|
}
|
|
|
|
function Opened()
|
|
{
|
|
local string S;
|
|
|
|
S = "GET "$RemoteURL$" HTTP/1.1"$CRLF$"Host: "$RemoteAddress$CRLF$"UserID: "$
|
|
Class'ClientPerkRepLink'.Static.FindStats(Level.GetLocalPlayerController()).UserID$CRLF$CRLF$CRLF;
|
|
SendText(S);
|
|
SetTimer(20,false); // 20 sec timeout
|
|
}
|
|
|
|
final function ParseHeader( out string S )
|
|
{
|
|
local int i;
|
|
|
|
i = InStr(S,"Content-Length: ");
|
|
if( i==-1 )
|
|
{
|
|
OnError("Received invalid HTML header:|"$S);
|
|
return;
|
|
}
|
|
S = Mid(S,i+16);
|
|
i = InStr(S,CRLF);
|
|
if( i==-1 )
|
|
{
|
|
ContentLength = int(S);
|
|
S = "";
|
|
}
|
|
else
|
|
{
|
|
ContentLength = int(Left(S,i));
|
|
S = Mid(S,i+1);
|
|
i = InStr(S,CRLF$CRLF);
|
|
if( i==-1 )
|
|
S = "";
|
|
else S = Mid(S,i+Len(CRLF$CRLF));
|
|
}
|
|
}
|
|
function ReceivedText(string Text)
|
|
{
|
|
if( !bReceivedHeader )
|
|
{
|
|
bReceivedHeader = true;
|
|
ParseHeader(Text);
|
|
}
|
|
InputBuffer $= Text;
|
|
ContentLength-=Len(Text);
|
|
if( ContentLength<=0 )
|
|
{
|
|
SetTimer(0,false);
|
|
bHasData = true;
|
|
}
|
|
}
|
|
|
|
function DestroyLink()
|
|
{
|
|
SetTimer(0.0,False);
|
|
|
|
if(IsConnected())
|
|
Close();
|
|
LifeSpan = 5;
|
|
}
|
|
|
|
function Timer()
|
|
{
|
|
OnError("Connection timed out.");
|
|
}
|
|
|
|
function Closed()
|
|
{
|
|
SetTimer(0.0,False);
|
|
if( InputBuffer!="" )
|
|
bHasData = true;
|
|
else if( !bHasError )
|
|
OnError("Connection closed without data received.");
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
}
|