/// <summary> /// Sends a webservice to the miniserver /// </summary> /// <param name="request">The Request that should be sent</param> /// <returns>The Response the miniserver returns</returns> public async override Task <WebserviceResponse> SendWebservice(WebserviceRequest request) { WebserviceRequest encRequest = await GetEncryptedRequest(request); Uri url = new UriBuilder() { Scheme = "http", Host = IP, Port = Port, Path = encRequest.Command, Query = encRequest.Queries.ToString() }.Uri; CancellationTokenSource?.Dispose(); CancellationTokenSource = new CancellationTokenSource(request.Timeout); HttpResponseMessage httpResponse = await HttpClient?.GetAsync(url.OriginalString, CancellationTokenSource.Token); byte[] responseContent = await httpResponse?.Content.ReadAsByteArrayAsync(); CancellationTokenSource?.Dispose(); if (httpResponse.IsSuccessStatusCode && request.Encryption == EncryptionType.RequestAndResponse) //decypt response if needed { responseContent = Encoding.UTF8.GetBytes(Cryptography.AesDecrypt(Encoding.UTF8.GetString(responseContent), Session)); } WebserviceResponse response = new WebserviceResponse(null, responseContent, (int)httpResponse.StatusCode); encRequest.TryValidateResponse(response); return(response); }
/// <summary> /// Sends a webservice to the miniserver and waits until its receives an answer /// </summary> /// <param name="request">The Request that should be sent</param> /// <returns>The Response the miniserver returns</returns> public async override Task <WebserviceResponse> SendWebservice(WebserviceRequest request) { switch (request?.Encryption) { case EncryptionType.Request: request.Command = Uri.EscapeDataString(Cryptography.AesEncrypt($"salt/{Session.Salt}/{request.Command}", Session)); request.Command = $"jdev/sys/enc/{request.Command}"; request.Encryption = EncryptionType.None; return(await SendWebservice(request)); case EncryptionType.RequestAndResponse: string command = Uri.EscapeDataString(Cryptography.AesEncrypt($"salt/{Session.Salt}/{request.Command}", Session)); command = $"jdev/sys/fenc/{command}"; WebserviceRequest encryptedRequest = new WebserviceRequest(command, EncryptionType.None); WebserviceResponse encrypedResponse = await SendWebservice(encryptedRequest); if (encrypedResponse == null) { request.TryValidateResponse(new WebserviceResponse(null, null, (int?)WebSocket?.CloseStatus)); } else { request.TryValidateResponse(new WebserviceResponse(encrypedResponse.Header, Encoding.UTF8.GetBytes(Cryptography.AesDecrypt(encrypedResponse.GetAsStringContent(), Session)), (int?)WebSocket?.CloseStatus)); } return(request.WaitForResponse()); default: case EncryptionType.None: if (WebSocket == null || WebSocket.State != WebSocketState.Open) { return(null); } lock (Requests) { Requests.Add(request); } byte[] input = Encoding.UTF8.GetBytes(request.Command); await WebSocket.SendAsync(new ArraySegment <byte>(input, 0, input.Length), WebSocketMessageType.Text, true, CancellationToken.None); return(request.WaitForResponse()); } }