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