public void Send(string filePath = null, bool onlyContentLength = false) { isDone = false; state = RequestState.Waiting; if (acceptGzip) { SetHeader("Accept-Encoding", "gzip"); } //ThreadPool.QueueUserWorkItem (new WaitCallback (delegate(object t) { try { var retry = 0; while (++retry < maximumRetryCount) { if (useCache) { string etag = ""; if (etags.TryGetValue(uri.AbsoluteUri, out etag)) { SetHeader("If-None-Match", etag); } } SetHeader("Host", uri.Host); #if UNITY_WEBPLAYER /* * string ip = Dns.GetHostAddresses(uri.Host)[0].ToString(); * if (!Security.PrefetchSocketPolicy (ip, 1843)) { * Debug.LogError("Security Exception. Policy file load failed!"); * }*/ #endif var client = new TcpClient(); client.SendTimeout = 5000; client.ReceiveTimeout = 5000; client.Connect(uri.Host, uri.Port); using (var stream = client.GetStream()) { var ostream = stream as Stream; if (uri.Scheme.ToLower() == "https") { ostream = new SslStream(stream, false, new RemoteCertificateValidationCallback(ValidateServerCertificate)); try { var ssl = ostream as SslStream; ssl.AuthenticateAsClient(uri.Host); } catch (Exception e) { Debug.LogError("Exception: " + e.Message); return; } } WriteToStream(ostream); if (filePath != null) { response = new Response(filePath, onlyContentLength); } else { response = new Response(); } if (downloadDelegate != null) { response.downloadDelegate = downloadDelegate; } state = RequestState.Reading; response.ReadFromStream(ostream); } client.Close(); switch (response.status) { case 307: case 302: case 301: uri = new Uri(response.GetHeader("Location")); continue; default: retry = maximumRetryCount; break; } } if (useCache) { string etag = response.GetHeader("etag"); if (etag.Length > 0) { etags[uri.AbsoluteUri] = etag; } } } catch (SocketException e) { response.status = -100; if (downloadDelegate != null) { IOErrorEvent ioErrorEvent = new IOErrorEvent(); ioErrorEvent.ErrorCode = e.ErrorCode; ioErrorEvent.Message = e.Message; downloadDelegate.OnIOError(ioErrorEvent); } Debug.LogException(e); } catch (IOException ioex) { response.status = -100; if (downloadDelegate != null) { IOErrorEvent ioErrorEvent = new IOErrorEvent(); ioErrorEvent.Message = ioex.Message; downloadDelegate.OnIOError(ioErrorEvent); } Debug.LogException(ioex); } catch (Exception e) { Console.WriteLine("Unhandled Exception, aborting request."); Console.WriteLine(e); Debug.Log(e.Message + " Type: " + e.GetType().FullName); exception = e; response = null; } //Debug.Log ("Request finished"); state = RequestState.Done; isDone = true; //})); }