Beispiel #1
0
        private void ProcessRequest(Socket socket)
        {
            var buffer      = new byte[1024];
            var bytesCount  = socket.Receive(buffer);
            var headersText = Encoding.ASCII.GetString(buffer, 0, bytesCount);

            try {
                var parsedHeaders = ParsedHttpHeaders.Parse(headersText);

                if (!parsedHeaders.IsNTRIP)
                {
                    var response = "HTTP/1.0 200 OK\r\nServer: NTRIPCaster\r\nContent-Type: text/plain\r\n\r\nThis is a NTRIP Caster";
                    SendToSocket(socket, response);
                    socket.Close();
                }
                else if (parsedHeaders.Mountpoint == "")
                {
                    // Send Sourcetable
                    SendSourcetable(socket);
                    socket.Close();
                }
                else if (parsedHeaders.IsSource)
                {
                    ProcessSource(socket, parsedHeaders);
                }
                else
                {
                    ProcessClient(socket, parsedHeaders);
                }
            } catch (Exception) {
                // TODO: error handling
                socket.Close();
            }
        }
Beispiel #2
0
        private void ProcessClient(Socket socket, ParsedHttpHeaders parsedHeaders)
        {
            // Check Mountpoint
            var source = Config.Sources.FirstOrDefault(x => x.Mountpoint == parsedHeaders.Mountpoint);

            if (source == null)
            {
                SendSourcetable(socket);
                socket.Close();
                return;
            }

            // Check Login
            var user = Config.Users.FirstOrDefault(x => x.Name.Equals(parsedHeaders.Username, StringComparison.OrdinalIgnoreCase));

            if (!source.AuthRequired ||
                (user != null && user.Password.Equals(parsedHeaders.Password, StringComparison.OrdinalIgnoreCase) && user.Mountpoints.Contains(parsedHeaders.Mountpoint)))
            {
                socket.Send(Encoding.ASCII.GetBytes("ICY 200 OK\r\n"));
                socket.SendTimeout = 1000;

                var client = new ClientConnection(socket, parsedHeaders.Mountpoint, parsedHeaders.Username);
                client.StrartProcessing();
                AddClient(client);
            }
            else
            {
                SendToSocket(socket, "ERROR - Bad Password");
                socket.Close();
            }
        }
Beispiel #3
0
        private void ProcessSource(Socket socket, ParsedHttpHeaders parsedHeaders)
        {
            // Check Mountpoint
            var source = Config.Sources.FirstOrDefault(x => x.Mountpoint == parsedHeaders.Mountpoint);

            if (source == null)
            {
                SendSourcetable(socket);
                socket.Close();
                return;
            }

            //// Check if there is another Server
            //if (Servers[parsedHeaders.Mountpoint] != null) {
            //    SendToSocket(socket, "ERROR - Mountpoint already in use"); // Check behavior
            //    socket.Close();
            //    return;
            //}

            // Check Login
            if (!source.Password.Equals(parsedHeaders.Password, StringComparison.OrdinalIgnoreCase))
            {
                SendToSocket(socket, "ERROR - Bad Password");
                socket.Close();
                return;
            }

            // Read Data
            socket.Send(Encoding.ASCII.GetBytes("ICY 200 OK\r\n"));

            Console.WriteLine($"New Server: {socket.RemoteEndPoint}");
            var server = new ServerConnection(socket, parsedHeaders.Mountpoint, this);

            server.StartProcessing();
        }
Beispiel #4
0
            public static ParsedHttpHeaders Parse(string headers)
            {
                var parsedHeaders = new ParsedHttpHeaders();

                foreach (var header in headers.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries))
                {
                    if (header.StartsWith("GET ", StringComparison.Ordinal))
                    {
                        // HTTP GET
                        parsedHeaders.Mountpoint = NormalizeMountpoint(header.Split(new char[] { ' ' })[1]);
                    }
                    else if (header.StartsWith("Authorization:", StringComparison.Ordinal))
                    {
                        // Basic Auth
                        var authorizationParts = header.Split(new char[] { ' ' });
                        if (authorizationParts.Length == 2 && authorizationParts[0].Equals("Basic", StringComparison.OrdinalIgnoreCase))
                        {
                            var usernamePassword = DecodeBase64(authorizationParts[1]).Split(new char[] { ':' });
                            if (usernamePassword.Length == 2)
                            {
                                parsedHeaders.Username = usernamePassword[0];
                                parsedHeaders.Password = usernamePassword[1];
                            }
                        }
                    }
                    else if (header.StartsWith("SOURCE", StringComparison.Ordinal))
                    {
                        // Source
                        parsedHeaders.IsSource = true;
                        var sourceParts = header.Split(new char[] { ' ' });
                        if (sourceParts.Length == 3)
                        {
                            parsedHeaders.Password   = sourceParts[1];
                            parsedHeaders.Mountpoint = NormalizeMountpoint(sourceParts[2]);
                        }
                    }
                    else if (header.StartsWith("User-Agent:", StringComparison.Ordinal))
                    {
                        parsedHeaders.Agent = header.Substring("User-Agent:".Length).TrimStart();
                    }
                    else if (header.StartsWith("Source-Agent:", StringComparison.Ordinal))
                    {
                        parsedHeaders.Agent = header.Substring("Source-Agent:".Length).TrimStart();
                    }
                    else
                    {
                        Console.WriteLine("ignore header: " + header);
                    }
                }

                return(parsedHeaders);
            }