예제 #1
0
        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 = "{}"
            });
        }
예제 #2
0
        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);
                }
            }
        }
예제 #3
0
        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);
        }