private async void ProcessApiResponse(StreamSocket socket, RemoteKitHttpRequest request) { try { var command = JsonConvert.DeserializeObject <RemoteKitCommand>(request.Body); if (_apiClient != null) { var response = await _apiClient.ProcessCommandAsync(command); if (!string.IsNullOrEmpty(response)) { await WriteResponse(socket, new JsonResponse() { Body = response }); } } } catch (Exception ex) { Debug.WriteLine("RemoteKit: Unable to process request. " + ex); } //write ok response await WriteResponse(socket, new JsonResponse() { Body = "{}" }); }
private async void ProcessRequestAsync(StreamSocket socket) { Debug.WriteLine("RemoteKit: connected " + socket.Information.RemoteAddress); RemoteKitHttpRequest _request = null; using (IInputStream input = socket.InputStream) { const int bufferSize = 8192; byte[] data = new byte[bufferSize]; IBuffer buffer = data.AsBuffer(); uint dataRead = bufferSize; var requestString = new StringBuilder(); while (dataRead == bufferSize) { await input.ReadAsync(buffer, bufferSize, InputStreamOptions.Partial); requestString.Append(Encoding.UTF8.GetString(data, 0, data.Length)); dataRead = buffer.Length; } _request = ParseRequest(requestString.ToString()); } if (_request != null) { //longpoll endpoint if (_request.RequestTarget == "/notifier") { var activeSocket = _activeSockets.FirstOrDefault( s => s.Information.RemoteAddress.RawName == socket.Information.RemoteAddress.RawName); if (activeSocket != null) { activeSocket.Dispose(); _activeSockets.Remove(activeSocket); } _activeSockets.Add(socket); var token = _cts.Token; await Task.Delay(TimeSpan.FromSeconds(LongPollTimeOut), token).ContinueWith(async t => { if (token.IsCancellationRequested) { return; } while (_activeSockets.Count > 0) { var s = _activeSockets[_activeSockets.Count - 1]; _activeSockets.Remove(s); //write ok response await WriteResponse(s, new JsonResponse() { Body = "{}" }); } }, token); } //api endpoint else if (_request.RequestTarget == _apiEndpoint) { ProcessApiResponse(socket, _request); } //file endpoint else { ProcessFileResponse(socket, _request); } } }
private async void ProcessFileResponse(StreamSocket socket, RemoteKitHttpRequest request) { try { if (_apiClient != null) { var stream = await _apiClient.ProcessFileAsync(request.RequestTarget); if (stream != null) { var response = new HttpResponse(); var length = stream.Length; var extension = Path.GetExtension(request.RequestTarget); var contentType = "application/" + extension; switch (extension) { case ".js": contentType = "application/javascript"; break; case ".css": contentType = "text/css"; break; case ".png": contentType = "image/png"; break; case ".svg": contentType = "image/svg+xml"; break; case ".html": case ".htm": default: contentType = "text/html"; break; } response.Headers.Add("Content-Length", length.ToString()); response.Headers.Add("Content-Type", contentType); response.Headers.Add("Connection", "close"); var buffer = new byte[length]; await stream.ReadAsync(buffer, 0, (int)length); stream.Dispose(); response.Data = buffer; await WriteResponse(socket, response); return; } } } catch (Exception ex) { Debug.WriteLine(ex); } //write 404 response var failResponse = new HttpResponse(); failResponse.Status = "HTTP/1.1 404 Not found"; failResponse.Headers.Add("Content-Length", "0"); await WriteResponse(socket, failResponse); }