예제 #1
0
        private void WsClient_Subscribe <T>(string token, WsRequestMetaData.WsRequestMsgType requestType, T message)
        {
            WsRequestMetaData meta;

            byte[] msg;

            using (MemoryStream msgStream = new MemoryStream())
            {
                ProtoBuf.Serializer.Serialize(msgStream, message);
                msg = msgStream.ToArray();
            }

            meta = new WsRequestMetaData
            {
                RequestType = requestType,
                Token       = token
            };

            WsRequest request = new WsRequest
            {
                Meta = meta,
                Msg  = msg
            };

            SendRequest(request);
        }
예제 #2
0
        private void WsClient_Login(String key, String secret, int ttl)
        {
            byte[] msg;

            LoginRequest message = new LoginRequest
            {
                ExpireControl = new RequestExpired
                {
                    Now = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds,
                    Ttl = ttl
                },
                ApiKey = key
            };

            using (MemoryStream msgStream = new MemoryStream())
            {
                ProtoBuf.Serializer.Serialize(msgStream, message);
                msg = msgStream.ToArray();
            }
            byte[] sign = ComputeHash(secret, msg);
            var    meta = new WsRequestMetaData
            {
                RequestType = WsRequestMetaData.WsRequestMsgType.Login,
                Token       = "Login request",
                Sign        = sign
            };

            WsRequest request = new WsRequest
            {
                Meta = meta,
                Msg  = msg
            };

            SendRequest(request);
        }
예제 #3
0
        private void SendAuthMessage <T>(string secret, string token, WsRequestMetaData.WsRequestMsgType requestType, T message)
        {
            WsRequestMetaData meta;

            byte[] msg;

            using (MemoryStream msgStream = new MemoryStream())
            {
                ProtoBuf.Serializer.Serialize(msgStream, message);
                msg = msgStream.ToArray();
            }

            byte[] sign = ComputeHash(secret, msg);

            meta = new WsRequestMetaData
            {
                RequestType = requestType,
                Token       = token,
                Sign        = sign
            };

            WsRequest request = new WsRequest
            {
                Meta = meta,
                Msg  = msg
            };

            SendRequest(request);
        }
예제 #4
0
 private void AuthHandler(object sender, WsRequest <AuthRequestContent> args)
 {
     if (CheckToken(args.content.token))
     {//认证通过
         this._isAuth = true;
         if (CheckSession(args.content.sessionId))
         {//session存在
             this._sessionId = args.content.sessionId;
             var res = new WsResponse <object> {
                 resID = args.reqID, resType = ResponseType.subscribe.ToString(), content = new { result = 1 }
             };
             this.SendMsg <WsResponse <object> >(res);//订阅成功消息
             //立即推送位号数据
             PushData(null);
         }
         else
         {//session不存在
             this._sessionId = Guid.NewGuid().ToString();
             var res = new WsResponse <AuthResponseContent> {
                 resID = args.reqID, resType = ResponseType.request.ToString(), content = new AuthResponseContent {
                     auth = "1", sessionId = this._sessionId
                 }
             };
             this.SendMsg <WsResponse <AuthResponseContent> >(res);//返回session
         }
         //心跳检测,30秒检测一次
         this._lastHearBeat    = DateTime.Now;
         this._hearBeatMonitor = new Timer(this.HearBeatCheck, null, 2000, 30000);
     }
     else
     {
         this._webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "authentication failed", CancellationToken.None);
     }
 }
예제 #5
0
 internal async Task SendAsync(WsRequest request)
 {
     if (_connection == null)
     {
         throw new InvalidOperationException("Does not connect to WebSocket stream");
     }
     await _connection.SendAsync(request).Stay();
 }
예제 #6
0
        public static bool CallWMSInterface(string batchNumber, string method, string requestData, ref string responseData, ref string responseoriginalDate)
        {
            bool restult = false;

            try
            {
                WIInput myInput = new WIInput();
                myInput.P_BATCH_NUMBER = batchNumber;
                myInput.P_IFACE_CODE   = method;
                myInput.P_REQUEST_DATA = requestData;
                WIHeader myHeader = new WIHeader();
                myHeader.xmlns           = "http://xmlns.oracle.com/apps/per/rest/comm_ws/header";
                myHeader.Responsibility  = "CUX_DEVE_RESP";
                myHeader.RespApplication = "CUX";
                myHeader.SecurityGroup   = "STANDARD";
                myHeader.NLSLanguage     = "AMERICAN";
                myHeader.Org_Id          = "0";

                WIRequst myRequst = new WIRequst();
                myRequst.InputParameters = myInput;
                myRequst.RESTHeader      = myHeader;
                myRequst.@xmlns          = "http://xmlns.oracle.com/apps/per/rest/comm_ws/invokeebsws";
                WsRequest wsRequest = new WsRequest();
                wsRequest.comm_ws = myRequst;
                string request = JsonConvert.SerializeObject(wsRequest);
                request = request.Insert(request.IndexOf("xmlns"), "@");
                HttpClient client = new HttpClient();
                client.Timeout = TimeSpan.FromMilliseconds(10000000);
                //Uri uri = new Uri("http://192.168.2.139:8004/webservices/rest/comm_ws/invokeebsws/");
                Uri uri = new Uri("http://192.168.2.120:8000/webservices/rest/comm_ws/invokeebsws/");
                //Uri uri = new Uri("http://192.168.2.139:8010/webservices/rest/comm_ws/invokeebsws/");
                client.BaseAddress = uri;
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes("REST:Hytera1993")));
                var content = new StringContent(request, Encoding.UTF8, "application/json");
                HttpResponseMessage response = client.PostAsync(uri, content).Result;
                string responseJsonText      = response.Content.ReadAsStringAsync().Result;

                responseoriginalDate = responseJsonText;

                int successIndex = responseJsonText.IndexOf("\"X_RETURN_CODE\" : \"S1001000\"");
                if (0 < successIndex)
                {
                    restult = true;
                }
                int responseEnd   = responseJsonText.LastIndexOf("\"");
                int responseStart = responseJsonText.IndexOf("X_RESPONSE_DATA");
                //byte[] bytes = Convert.FromBase64String(responseJsonText.Substring(responseStart + 20, responseEnd - responseStart - 20));
                responseData = Encoding.UTF8.GetString(Convert.FromBase64String(responseJsonText.Substring(responseStart + 20, responseEnd - responseStart - 20)));
            }
            catch (Exception e)
            {
            }
            finally
            {
            }
            return(restult);
        }
예제 #7
0
 private void SendRequest(WsRequest request)
 {
     using (var requestStream = new MemoryStream())
     {
         ProtoBuf.Serializer.Serialize(requestStream, request);
         //ws.Send(requestStream.ToArray());
         ws.SendAsync(requestStream.ToArray(), b => { });
     }
 }
예제 #8
0
        private void UnSubscribeHandler(object sender, WsRequest <SubscribeRequestContent> args)
        {
            if (!this._isAuth)
            {
                this._webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "authentication failed", CancellationToken.None);
                return;
            }

            //订阅数据
            this.UnSubscribe(args.content.body);
        }
예제 #9
0
        public IObservable <IStreamMessage> GlobalTimelineAsObservable()
        {
            var id   = Guid.NewGuid().ToString();
            var body = new WsRequest {
                Body = new Connection {
                    Channel = "globalTimeline", Id = id
                }, Type = "connect"
            };

            SendAsync(body).Wait();
            return(ApplyStreamFilter(_observable, id));
        }
예제 #10
0
 public async Task <object> Excute(WsRequest request)
 {
     if (_methods.TryGetValue(request.Method, out var method))
     {
         var instance = _provider.GetService(method.DeclaringType);
         if (instance is Invoker invoker)
         {
             invoker.Client = _provider.GetService <WebSocketSession>().Connection;
         }
         return(await method.Invoke(instance, request));
     }
     return($"method [{request.Method}] not found!");
 }
예제 #11
0
        private async Task BroadcastLocation(Envelope envelope, WsRequest request)
        {
            var locationEnvelope = new Envelope
            {
                Data   = JsonConvert.SerializeObject(new Location(await GetCity(request.RequestContext.Identity))),
                FromId = envelope.FromId,
                RoomId = envelope.RoomId,
                ToId   = envelope.RoomId,
                Type   = "location"
            };

            await Broadcast(locationEnvelope, request.RequestContext.ConnectionId);
        }
예제 #12
0
        internal async Task <T> SendAsync <T>(WsRequest request)
        {
            if (_connection == null)
            {
                throw new InvalidOperationException("Does not connect to WebSocket stream");
            }
            await _connection.SendAsync(request).Stay();

            var response = await _observable.Cast <WsResponse>().FirstAsync(w => $"api:{request.Body.Id}" == w?.Type);

            if (response.Body is WsRestResponseObject obj)
            {
                return(obj.Res.ToObject <T>());
            }
            return(default);
예제 #13
0
        private async Task ReceiveMsg()
        {
            var buffer = new byte[1024 * 4];
            var result = await _webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);

            //关闭socket请求
            if (result.CloseStatus != null)
            {
                if (this.OnClose != null)
                {
                    this.OnClose(this, null);
                    return;
                }
            }

            var obj        = GetReceiveObj <WsRequest <object> >(buffer);
            var strContent = obj.content?.ToString();

            if (obj.reqType == RequestType.request.ToString() && this.OnAuth != null)
            {//认证请求
                var context = strContent.ToObject <AuthRequestContent>();
                var req     = new WsRequest <AuthRequestContent> {
                    reqID = obj.reqID, reqType = obj.reqType, content = context
                };
                this.OnAuth(this, req);
            }
            else if (obj.reqType == RequestType.heartbreak.ToString() && this.OnHeartbeat != null)
            {//心跳包
                this.OnHeartbeat(this, null);
            }
            else if (obj.reqType == RequestType.subscribe.ToString() && this.OnSubscribe != null)
            {//订阅请求
                var context = strContent.ToObject <SubscribeRequestContent>();
                var req     = new WsRequest <SubscribeRequestContent> {
                    reqID = obj.reqID, reqType = obj.reqType, content = context
                };
                this.OnSubscribe(this, req);
            }
            else if (obj.reqType == RequestType.unsubscribe.ToString() && this.OnUnSubscribe != null)
            {//取消订阅请求
                var context = strContent.ToObject <SubscribeRequestContent>();
                var req     = new WsRequest <SubscribeRequestContent> {
                    reqID = obj.reqID, reqType = obj.reqType, content = context
                };
                this.OnUnSubscribe(this, req);
            }
        }
        private BinaryData BuildRequest <T>(T?request, string token, WsRequestMsgType requestType, bool signed) where T : class
        {
            var result = new BinaryData();

            result._buildData = () =>
            {
                byte[] msg  = Array.Empty <byte>();
                var    meta = new WsRequestMetaData()
                {
                    RequestType = requestType,
                    Token       = token
                };
                if (request is IExpireControl expireControl)
                {
                    expireControl.ExpireControl = new RequestExpired
                    {
                        Now = DateTime.UtcNow,
                        Ttl = _timeToLive
                    };
                }
                if (request != null)
                {
                    using (MemoryStream msgStream = new MemoryStream())
                    {
                        ProtoBuf.Serializer.Serialize(msgStream, request);
                        msg = msgStream.ToArray();
                    }
                }
                WsRequest wsRequest = new WsRequest()
                {
                    Meta = meta,
                    Msg  = msg
                };
                if (signed)
                {
                    wsRequest.Meta.Sign = authProvider?.Sign(wsRequest.Msg);
                }
                using (var requestStream = new MemoryStream())
                {
                    ProtoBuf.Serializer.Serialize(requestStream, wsRequest);
                    return(System.Convert.ToBase64String(requestStream.ToArray()));
                }
            };
            result.Token = token;
            return(result);
        }
예제 #15
0
        private async Task <WsRequest> GetRequestParameter(HttpRequest httpRequest)
        {
            if (httpRequest.Method == "GET")
            {
                var request = new WsRequest();
                request.Id     = httpRequest.Query["id"];
                request.Method = httpRequest.Query["method"];
                request.Params = httpRequest.Query["params"].ToString().DeserializeJson <JsonElement>();
                return(request);
            }
            else
            {
                using var reader = new StreamReader(httpRequest.Body);
                var requestString = await reader.ReadToEndAsync();

                var request = requestString.DeserializeJson <WsRequest>();
                return(request);
            }
        }
예제 #16
0
 public async Task <object> Excute(WsRequest request)
 {
     if (request.Method.IsNull())
     {
         return(ErrorCode.MethodNotFound.ToError());
     }
     if (_methods.TryGetValue(request.Method, out var method))
     {
         var instance = _provider.GetService(method.DeclaringType);
         if (instance is ApiService invoker)
         {
             invoker.Client = _provider.GetService <WebSocketSession>().Connection;
         }
         return(await method.Invoke(instance, request));
     }
     return(new WsError()
     {
         Code = (int)ErrorCode.MethodNotFound, Message = $"method [{request.Method}] not found!"
     });
 }
예제 #17
0
        private async Task ProcessMessage(Envelope envelope, WsRequest request)
        {
            if (!bIsInitialised)
            {
                var parameters = ssm.GetParametersAsync(new GetParametersRequest {
                    Names = new List <string> {
                        "MaxMindLicense"
                    }
                }).GetAwaiter().GetResult();

                var maxMindLicense = parameters.Parameters.Single(x => x.Name == "MaxMindLicense").Value.Split(",");

                geoIp = new WebServiceClient(int.Parse(maxMindLicense[0]), maxMindLicense[1]);

                bIsInitialised = true;
            }

            switch (envelope.Type)
            {
            case "discover":
                await AddConnection(envelope.RoomId, envelope.FromId, request.RequestContext.ConnectionId, Guid.Parse(JsonConvert.DeserializeObject <string>(envelope.Data)));
                await Broadcast(envelope, request.RequestContext.ConnectionId);
                await BroadcastLocation(envelope, request);

                break;

            case "acknowledge":
                envelope.Data = null;
                await SendTo(envelope);
                await BroadcastLocation(envelope, request);

                break;

            default:
                await SendTo(envelope);

                break;
            }
        }
예제 #18
0
        public Task <WsResponse> HandleRequest(WsRequest request)
        {
            var response = new WsResponse();

            var     data    = request.GetJson();
            var     message = data.message;
            dynamic value   = null;

            switch ((string)message.InterfaceName)
            {
            case "setAttributeInfo":
                value = "hello world";
                break;

            default:
                Log.W($"Unknwon interface name: {message.InterfaceName}");
                break;
            }

            var result = new
            {
                protocolType = "general",
                message      = new
                {
                    message.InterfaceName,
                    message.MessageUID,
                    message.SessionID,
                    InterfaceErrorCode    = 0,
                    InterfaceErrorMessage = "",
                    ReturnValue           = value,
                    ReturnType            = value is int? "number" : "string",
                },
            };

            response.SetJson(result);

            return(Task.FromResult(response));
        }
예제 #19
0
        private void SubscribeHandler(object sender, WsRequest <SubscribeRequestContent> args)
        {
            if (!this._isAuth)
            {
                this._webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "authentication failed", CancellationToken.None);
                return;
            }

            //订阅数据
            this.Subscribe(args.content.body);

            //响应客户端订阅
            var res = new WsResponse <object> {
                resID = args.reqID, resType = RequestType.subscribe.ToString(), content = new { result = "1" }
            };

            this.SendMsg <WsResponse <object> >(res);

            if (this._dataPushTimer == null)
            {
                this._dataPushTimer = new Timer(this.PushData, null, 0, 2000);
            }
        }
예제 #20
0
        public Task <WsResponse> HandleRequest(WsRequest request)
        {
            var response = new WsResponse();

            var data = request.GetJson();

            if (data == null)
            {
                return(Task.FromResult(response));
            }

            dynamic result        = null;
            dynamic callbackReply = null;

            if (data.init != null)
            {
                switch ((string)data.init)
                {
                case "get_versions":
                    result = new
                    {
                        tabid  = data.tabid,
                        daemon = "9.9.9.9",
                        ex     = "9.9.9.9",
                        m      = new[] { new { name = data.m, version = "9.9.9.9" } }
                    };
                    break;

                default:
                    Log.W($"Unknwon init command: {data.init}");
                    break;
                }
            }
            else if (data.cmd != null)
            {
                var     callback = data.callback;
                dynamic reply    = null;
                switch ((string)data.cmd)
                {
                case "setcallback":
                    reply = "";
                    break;

                case "native":
                    var args = data.exfunc.args;
                    switch ((string)data.exfunc.fname)
                    {
                    case "Request":
                        dynamic requestParams = JsonConvert.DeserializeObject((string)args[0]);
                        switch ((string)requestParams.key)
                        {
                        case "Clear":
                            callbackReply = new { InputClear = requestParams.elename };
                            break;

                        case "InvalidateSession":
                            break;

                        default:
                            Log.W($"Unknown request type: {requestParams.key}");
                            break;
                        }
                        reply = "";
                        break;

                    case "Key_Init":
                        reply = new
                        {
                            result = "true",
                            isvm   = "false",
                        };
                        callbackReply = new
                        {
                            SeedKey = "SeedKey",
                            value   = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
                        };
                        break;

                    case "Key_Start":
                        reply = "StartReadyComplete";
                        // callbackReply = new { addChar = $"a_#_{args[1]}" };
                        break;

                    case "Key_Keydown":
                        reply = "";
                        break;

                    case "Key_Stop":
                        reply         = "";
                        callbackReply = new { GetActiveElement = args[2] };
                        break;

                    case "Key_RealStop":
                        reply = "";
                        break;

                    default:
                        Log.W($"Unknown native call: {data.exfunc.fname}");
                        break;
                    }
                    break;

                default:
                    Log.W($"Unknwon command: {data.cmd}");
                    break;
                }

                result = new
                {
                    response = new
                    {
                        id       = data.id,
                        tabid    = data.tabid,
                        status   = "TRUE",
                        reply    = new { reply = new { status = "0", reply = reply } },
                        callback = callback ?? "",
                    }
                };
            }

            response.SetJson(result);

            if (callbackReply != null)
            {
                var callbackResult = new
                {
                    response = new
                    {
                        id       = "setcallback",
                        callback = "update_callback",
                        reply    = callbackReply,
                    }
                };

                var callbackResponse = new WsResponse();
                callbackResponse.SetJson(callbackResult);
                response.Additional = callbackResponse;
            }

            return(Task.FromResult(response));
        }
예제 #21
0
        public dynamic Invoke(object instance, WsRequest request)
        {
            var paras = PrepareParameters(request.Params);

            return(InvokeInternal(instance, paras.ToArray()));
        }
예제 #22
0
        private IAsyncEnumerator <byte[]> HandleWsRequest(StreamReader reader)
        {
            return(new AsyncEnumerator <byte[]>(async yield =>
            {
                var requestLine = await reader.ReadLineAsync();
                if (string.IsNullOrWhiteSpace(requestLine))
                {
                    yield.Break();
                }

                var httpRequest = new HttpRequest(requestLine);
                while (true)
                {
                    var line = await reader.ReadLineAsync();
                    if (string.IsNullOrEmpty(line))
                    {
                        break;
                    }

                    httpRequest.AddHeader(line);
                }

                Log.D($"[{Identifier}] WS Handshake {httpRequest.Path}");

                var key = Encoding.ASCII.GetBytes(httpRequest.Headers["Sec-WebSocket-Key"] + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");

                var httpResponse = new HttpResponse();
                httpResponse.StatusCode = HttpStatusCode.SwitchingProtocols;
                httpResponse.Headers["Connection"] = "Upgrade";
                httpResponse.Headers["Upgrade"] = "websocket";
                httpResponse.Headers["Sec-WebSocket-Accept"] = Convert.ToBase64String(SHA1.Create().ComputeHash(key));

                await yield.ReturnAsync(httpResponse.ToBytes());

                while (true)
                {
                    var request = new WsRequest();

                    while (true)
                    {
                        var buffer = new byte[1024];
                        var readCount = await reader.BaseStream.ReadAsync(buffer, 0, buffer.Length);

                        if (request.AddBytes(buffer.Take(readCount)))
                        {
                            break;
                        }
                    }

                    Log.D($"[{Identifier}] WS Message ({request.Opcode})");

                    switch (request.Opcode)
                    {
                    case WsOpcode.Text:
                    case WsOpcode.Binary:
                        var response = await((IWsHandler)Handler).HandleRequest(request);
                        await yield.ReturnAsync(response.ToBytes());
                        break;

                    case WsOpcode.Close:
                        yield.Break();
                        break;

                    case WsOpcode.Ping:
                    case WsOpcode.Pong:
                        break;

                    default:
                        Log.B(request.RawContent);
                        break;
                    }
                }
            }));
        }
예제 #23
0
 public async Task SendAsync(WsRequest request)
 {
     await SendAsync(JsonConvert.SerializeObject(request)).Stay();
 }
예제 #24
0
        private void DisplayUsers()
        {
            // authenticates
            AuthenticationResponse authentication =
                new Authentication(new Credentials("admin", "password"))
                .PerformRequestAsync()
                .Result;

            if (authentication.IsSuccess)
            {
                Console.WriteLine("Authentication success.", Color.Cyan);
                Console.WriteLineFormatted(
                    "{0}: {1}",
                    Color.White,
                    new Formatter[]
                {
                    new Formatter("Context ID", Color.White),
                    new Formatter(authentication.ContextID, Color.PaleGreen)
                }
                    );
            }
            else
            {
                Console.WriteLine("Authentication failed.", Color.Cyan);
                Console.WriteLine(authentication.Error.ErrorMessage, Color.Gray);
            }
            Console.WriteLine();

            // get device list
            DevicesResponse devices = new Devices()
                                      .PerformRequestAsync()
                                      .Result;

            if (devices.IsSuccess)
            {
                Console.WriteLine("Device list:", Color.Cyan);
                foreach (Device device in devices.Devices.OrderBy(d => !d.IsConnected).ThenBy(d => d.DisplayName))
                {
                    Console.WriteLineFormatted(
                        " - {0} ({1}{2}{3})",
                        Color.White,
                        new Formatter[]
                    {
                        new Formatter(device.DisplayName, Color.White),
                        new Formatter(
                            device.IsConnected ? device.HasAddress ? device.Addresses[0].IpAddress : "no address" : "disconnected",
                            device.IsConnected ? device.HasAddress ? Color.PaleGreen : Color.LightGoldenrodYellow : Color.IndianRed
                            ),
                        new Formatter(
                            device.IsConnected ? device.IsEthernet ? ", " : ", " : "",
                            Color.White
                            ),
                        new Formatter(
                            device.IsConnected ? device.IsEthernet ? "ethernet" : "wireless" : "",
                            device.IsConnected ? device.IsEthernet ? Color.PaleGreen : Color.LightGoldenrodYellow : Color.White
                            )
                    }
                        );
                }
            }
            else
            {
                Console.WriteLine("Failed.", Color.Cyan);
                Console.WriteLine(authentication.Error.ErrorMessage, Color.Gray);
            }
            Console.WriteLine();

            // disables wifi
            WsResponse ws = new WsRequest(
                "NMC.Wifi", "set",
                new Dictionary <string, string>()
            {
                { "Enable", "False" },
                { "Status", "False" }
            })
                            .PerformRequestAsync()
                            .Result;

            Console.WriteLine("Disabling Wi-Fi.", Color.Cyan);
            if (ws.IsSuccess)
            {
                Console.WriteLineFormatted(
                    "{0}.",
                    Color.White,
                    new Formatter[]
                {
                    new Formatter("Succeed", Color.PaleGreen),
                }
                    );
            }
            else
            {
                Console.WriteLineFormatted(
                    "{0}. {1} ({2}).",
                    Color.White,
                    new Formatter[]
                {
                    new Formatter("Failed", Color.IndianRed),
                    new Formatter(ws.Error.ErrorMessage, Color.Gray),
                    new Formatter(ws.Error.ErrorCode, Color.Gray)
                }
                    );
            }
            Console.WriteLine();

            // gets ws paths
            Console.WriteLine("Listing WS paths.", Color.Cyan);
            foreach (WsPath path in WsRequest.GetWsPaths().Result)
            {
                Console.WriteLineFormatted(
                    " - {0} [ {1} ]",
                    Color.White,
                    new Formatter[]
                {
                    new Formatter(path.Path, Color.PaleGreen),
                    new Formatter(string.Join(", ", path.Methods.ToArray()), Color.Gray),
                }
                    );
            }

            Console.Read();
        }