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); }
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; * }*/ }