private TrackerResponse MakeWebRequestEx(Uri reqUri)
{
Encoding _usedEnc = Encoding.GetEncoding(0x4e4);
SocketEx sock = null;
TrackerResponse trackerResponse;
try
{
string host = reqUri.Host;
int port = reqUri.Port;
string path = reqUri.PathAndQuery;
AddLogLine("Connecting to tracker (" + host + ") in port " + port);
sock = createSocket();
sock.PreAuthenticate = false;
int num2 = 0;
bool flag1 = false;
while ((num2 < 5) && !flag1)
{
try
{
sock.Connect(host, port);
flag1 = true;
AddLogLine("Connected Successfully");
continue;
}
catch (Exception exception1)
{
AddLogLine("Exception: " + exception1.Message + "; Type: " + exception1.GetType());
AddLogLine("Failed connection attempt: " + num2);
num2++;
continue;
}
}
string cmd = "GET " + path + " " + currentClient.HttpProtocol + "\r\n" + currentClient.Headers.Replace("{host}", host) + "\r\n";
AddLogLine("======== Sending Command to Tracker ========");
AddLogLine(cmd);
sock.Send(_usedEnc.GetBytes(cmd));
// simple reading loop
// read while have the data
try
{
byte[] data = new byte[32 * 1024];
MemoryStream memStream = new MemoryStream();
while (true)
{
int dataLen = sock.Receive(data);
if (0 == dataLen)
break;
memStream.Write(data, 0, dataLen);
}
if (memStream.Length == 0)
{
AddLogLine("Error : Tracker Response is empty");
return null;
}
trackerResponse = new TrackerResponse(memStream);
if (trackerResponse.doRedirect)
{
return MakeWebRequestEx(new Uri(trackerResponse.RedirectionURL));
}
AddLogLine("======== Tracker Response ========");
AddLogLine(trackerResponse.Headers);
if (trackerResponse.Dict == null)
{
AddLogLine("*** Failed to decode tracker response :");
AddLogLine(trackerResponse.Body);
}
memStream.Dispose();
return trackerResponse;
}
catch (Exception ex)
{
sock.Close();
AddLogLine(Environment.NewLine + ex.Message);
return null;
}
}
catch (Exception ex)
{
if (null != sock) sock.Close();
AddLogLine("Exception:" + ex.Message);
return null;
}
// if (null != sock) sock.Close();
// else return null;
}