private void DoHandshake(Uri uri, string resource, HandshakeFinishedHandler handler)
        {
            var query = uri.Query + 
                (string.IsNullOrEmpty(uri.Query) ? "?" : "&") + "t=" +
                Math.Round((DateTimeOffset.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds, 0);

            var handshakeUrl = string.Format("{0}://{1}:{2}/{4}/1/{3}", uri.Scheme, uri.Host, uri.Port, query, resource);

            var request = m_connectionFactory.CreateHttpRequest(handshakeUrl);
            request.HttpGetResponse += (a) => FinishHandshake(a, handler);
            request.Execute();
        }
        private void FinishHandshake(string responseText, HandshakeFinishedHandler handler)
        {
            try
            {
                var resultParts = responseText.Split(new[] { ':' });

                Id = resultParts[0];
                HeartbeatTimeout = Int32.Parse(resultParts[1]) * 1000;
            }
            catch (WebException we)
            {
                if (we.Status == WebExceptionStatus.ProtocolError)
                {
                    var resp = we.Response as HttpWebResponse;

                    if (resp != null && resp.StatusCode == HttpStatusCode.Forbidden)
                    {
                        handler(HandshakeResult.Forbidden); return;
                    }
                }

                handler(HandshakeResult.Error); return;
            }
            catch (Exception)
            {
                EmitLocally("error", responseText);
                handler(HandshakeResult.Error); return;
            }

            handler(HandshakeResult.Success);
            
        }