Example #1
0
        private async Task ApiResponse(SimpleHttpRequest request, string target, Stream responseStream)
        {
            try
            {
                var method       = target.Substring(target.LastIndexOf("/"));
                var responseText = string.Empty;
                var jsonSettings = new JsonSerializerSettings()
                {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                };

                switch (method)
                {
                case "/api":
                    //just return ok
                    responseText = JsonConvert.SerializeObject(new { response = 1 });
                    break;

                case "/currentTrack":
                    //return current track
                    responseText = JsonConvert.SerializeObject(new { response = new { track = ViewModelLocator.Main.CurrentAudio, currentTime = ViewModelLocator.Main.CurrentAudioPositionSeconds, duration = ViewModelLocator.Main.CurrentAudioDuration.TotalSeconds, shuffle = ViewModelLocator.Main.Shuffle, repeat = ViewModelLocator.Main.Repeat } }, Formatting.None, jsonSettings);
                    break;

                case "/isPlaying":
                    //return isPlaying
                    responseText = JsonConvert.SerializeObject(new { response = ViewModelLocator.Main.IsPlaying }, Formatting.None, jsonSettings);
                    break;

                case "/volume":
                    //return volume
                    responseText = JsonConvert.SerializeObject(new { response = ViewModelLocator.Main.Volume }, Formatting.None, jsonSettings);
                    break;
                }

                var response    = new SimpleHttpResponse();
                var contentType = "application/json";

                var responseBytes = Encoding.UTF8.GetBytes(responseText.ToString());

                response.Headers.Add("Content-Length", responseBytes.Length.ToString());
                response.Headers.Add("Content-Type", contentType);

                responseStream.WriteText(response.ToString() + responseText);
                responseStream.Dispose();
            }
            catch (Exception ex)
            {
                LoggingService.Log(ex);
            }
        }
Example #2
0
        private async void Listen()
        {
            if (!_run)
            {
                return;
            }

            TcpClient client = null;

            try
            {
                client = await _listener.AcceptTcpClientAsync();
            }
            catch (Exception)
            {
            }

            if (!_run || client == null)
            {
                return;
            }

            var buffer = new byte[client.ReceiveBufferSize];
            var stream = client.GetStream();

            SimpleHttpRequest simpleRequest = null;

            if (stream.CanRead)
            {
                try
                {
                    var received = await stream.ReadAsync(buffer, 0, buffer.Length);

                    if (received > 0)
                    {
                        var requestString = Encoding.UTF8.GetString(buffer, 0, received);
                        if (!string.IsNullOrEmpty(requestString))
                        {
                            Debug.WriteLine("Request: " + requestString);

                            simpleRequest = ProcessRequest(requestString);

                            if (!string.IsNullOrEmpty(simpleRequest.Body))
                            {
                                if (OnReceivedData != null)
                                {
                                    OnReceivedData(simpleRequest.Body);
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex);
                }
            }

            if (simpleRequest != null)
            {
                string target = "/index.html";
                if (simpleRequest.RequestTarget.Length > 1)
                {
                    target = simpleRequest.RequestTarget;
                }

                if (target.StartsWith("/api"))
                {
                    await ApiResponse(simpleRequest, target, stream);
                }
                else
                {
                    await FileResponse(simpleRequest, target, stream);
                }
            }

            Listen();
        }
Example #3
0
        private async Task FileResponse(SimpleHttpRequest request, string target, Stream responseStream)
        {
            var streamResourceInfo = Application.GetContentStream(new Uri("pack://application:,,,/Meridian;component/RemotePlay/web" + target));

            if (streamResourceInfo != null)
            {
                try
                {
                    var response = new SimpleHttpResponse();

                    var length      = streamResourceInfo.Stream.Length;
                    var extension   = Path.GetExtension(target);
                    var contentType = "application/" + extension;

                    switch (extension)
                    {
                    case ".html":
                    case ".htm":
                        contentType = "text/html";
                        break;

                    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;
                    }

                    response.Headers.Add("Content-Length", length.ToString());
                    response.Headers.Add("Content-Type", contentType);

                    var headerBytes = Encoding.UTF8.GetBytes(response.ToString());
                    responseStream.Write(headerBytes, 0, headerBytes.Length);
                    streamResourceInfo.Stream.CopyTo(responseStream);
                    await responseStream.FlushAsync();

                    responseStream.Close();
                    responseStream.Dispose();
                }
                catch (Exception ex)
                {
                    LoggingService.Log(ex);
                }
            }
            else
            {
                var response = new SimpleHttpResponse();
                response.Status = "HTTP/1.1 404 NOT FOUND";
                response.Headers.Add("Content-Length", "0");
                responseStream.WriteText(response.ToString());
                responseStream.Dispose();
            }
        }