public override bool CanConnectService(string url)
        {
            var u = TransportUtil.ParseConnectionUrl(url);

            if (UrlSchemeString.Contains(u.scheme))
            {
                return(true);
            }
            //if (u.Host != "localhost") return false;

            return(false);
        }
        public async Task ConnectTransport(string url, Endpoint e, CancellationToken cancel = default(CancellationToken))
        {
            this.connecturl = url;

            var u = TransportUtil.ParseConnectionUrl(url);

            if (u.host == "")
            {
                throw new ConnectionException("Invalid connection URL for TCP");
            }

            await ConnectWebsocketTransport(url, e, cancel);

            return;
        }
        private async Task ConnectWebsocketTransport(string url, Endpoint e, CancellationToken cancel = default(CancellationToken))
        {
            var u = TransportUtil.ParseConnectionUrl(url);

            /*Uri u = new Uri(url);
             *
             * string ap = Uri.UnescapeDataString(u.AbsolutePath);
             * if (ap[0] == '/')
             *  ap = ap.Remove(0, 1);
             *
             * string[] s = ap.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);*/

            string http_scheme = "ws";

            if (u.scheme.EndsWith("wss"))
            {
                http_scheme = "wss";
            }

            var u2 = new Uri(url.ReplaceFirst(u.scheme + "://", http_scheme + "://"));


            NodeID target_nodeid   = null;
            string target_nodename = null;

            m_LocalEndpoint = e.LocalEndpoint;

            {
                //socket = new TcpClient(u.Host, u.Port);
                websocket = null;

                ClientWebSocket socket1 = new ClientWebSocket();
                dynamic         socket2 = socket1;
                socket2.options.addSubProtocol("robotraconteur.robotraconteur.com");
                await socket1.ConnectAsync(u2, cancel).AwaitWithTimeout(parenttransport.DefaultConnectTimeout);

                websocket = socket1;
            }

            m_Connected = true;
            var webstream = new WebSocketStreamWrapper(websocket);

            await ConnectStream(webstream, false, target_nodeid, target_nodename, false, false, parenttransport.HeartbeatPeriod, cancel);

            parenttransport.TransportConnections.Add(LocalEndpoint, this);
        }
Example #4
0
        public async Task <object> ConnectService(Transport c, string url, string username = null, object credentials = null, string objecttype = null, CancellationToken cancel = default(CancellationToken))
        {
            this.connecturl       = url;
            this.connecttransport = c;
            var u = TransportUtil.ParseConnectionUrl(url);

            m_RemoteNodeID = u.nodeid;

            m_RemoteNodeName = u.nodename;
            m_ServiceName    = u.service;

            //ProgramName = ProgramName1;

            /* try
             * {*/
            //if (RobotRaconteurService.s.transports[c] == null) return null;
            if (!c.CanConnectService(url))
            {
                throw new ServiceException("Invalid transport");
            }

            TransportConnection = await c.CreateTransportConnection(url, this, cancel);

            m_Connected = true;
            try
            {
                transport        = c.TransportID;
                m_RemoteEndpoint = 0;

                ServiceDefinition[] d = await PullServiceDefinitionAndImports(null, cancel : cancel);

                lock (pulled_service_defs)
                {
                    foreach (var d2 in d)
                    {
                        if (!pulled_service_defs.ContainsKey(d2.Name))
                        {
                            pulled_service_defs.Add(d2.Name, d2);
                        }
                    }
                }

                if (!UsePulledServiceTypes)
                {
                    m_ServiceDef = node.GetServiceType(d[0].Name);
                }
                else
                {
                    var f = DynamicServiceFactory_.CreateServiceFactories(d.Select(x => x.ToString()).ToArray(), this);
                    lock (pulled_service_defs)
                    {
                        foreach (var f2 in f)
                        {
                            if (!pulled_service_types.ContainsKey(f2.GetServiceName()))
                            {
                                pulled_service_types.Add(f2.GetServiceName(), f2);
                            }
                        }
                    }
                    m_ServiceDef = GetPulledServiceType(d[0].Name);
                }

                MessageEntry e = new MessageEntry(MessageEntryType.ObjectTypeName, "");
                //e.AddElement("servicepath", ServiceName);
                e.ServicePath = ServiceName;

                MessageEntry ret = await ProcessRequest(e, cancel);

                if (ret.Error != MessageErrorType.None)
                {
                    return(null);
                }
                string type = ret.FindElement("objecttype").CastData <string>();
                if (type == "")
                {
                    return(new ObjectNotFoundException("Could not find object type"));
                }
                ;


                if (objecttype != null)
                {
                    VerifyObjectImplements(type, objecttype);
                    type = objecttype;
                    await PullServiceDefinitionAndImports(ServiceDefinitionUtil.SplitQualifiedName(type).Item2, cancel);
                }


                MessageEntry e2 = new MessageEntry();
                e2.ServicePath = ServiceName;
                e2.MemberName  = "registerclient";
                e2.EntryType   = MessageEntryType.ConnectClient;
                await ProcessRequest(e2, cancel);

                if (username != null)
                {
                    await AuthenticateUser(username, credentials, cancel);
                }

                ServiceStub stub = ServiceDef.CreateStub(type, ServiceName, this);
                stubs.Add(ServiceName, stub);
                Task noop = PeriodicTask.Run(PeriodicCleanupTask, TimeSpan.FromSeconds(5), cancel_source.Token).IgnoreResult();

                return(stub);
            }
            catch (Exception e)
            {
                try
                {
                    TransportConnection.Close();
                }
                catch { }

                m_Connected = false;
                throw e;
            }


            /*}
             * catch {
             *  return null;
             * }*/
        }