Mihailo21

Program1

Apr 19th, 2024
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.48 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Net.Sockets;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10.  
  11. namespace Httpd
  12. {
  13.     class Program
  14.     {
  15.         public static List<User> users = new List<User>();
  16.  
  17.         public static void StartListening()
  18.         {
  19.  
  20.             IPAddress ipAddress = IPAddress.Loopback;
  21.             IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 8080);
  22.  
  23.             // Create a TCP/IP socket.
  24.             Socket serverSocket = new Socket(AddressFamily.InterNetwork,
  25.                 SocketType.Stream, ProtocolType.Tcp);
  26.  
  27.             // Bind the socket to the local endpoint and
  28.             // listen for incoming connections.
  29.             try
  30.             {
  31.                 serverSocket.Bind(localEndPoint);
  32.                 serverSocket.Listen(10);
  33.  
  34.                 // Start listening for connections.
  35.                 while (true)
  36.                 {
  37.                     Console.WriteLine("Waiting for a connection...");
  38.                     // Program is suspended while waiting for an incoming connection.
  39.                     Socket socket = serverSocket.Accept();
  40.  
  41.                     Task t = Task.Factory.StartNew(() => Run(socket));
  42.                 }
  43.  
  44.             }
  45.             catch (Exception e)
  46.             {
  47.                 Console.WriteLine(e.ToString());
  48.             }
  49.  
  50.             Console.WriteLine("\nPress ENTER to continue...");
  51.             Console.Read();
  52.         }
  53.  
  54.         private static void Run(Socket socket)
  55.         {
  56.  
  57.             NetworkStream stream = new NetworkStream(socket);
  58.             StreamReader sr = new StreamReader(stream);
  59.             StreamWriter sw = new StreamWriter(stream) { NewLine = "\r\n", AutoFlush = true };
  60.  
  61.             string resource = GetResource(sr);
  62.             if (resource != null)
  63.             {
  64.                 if (resource.Equals(""))
  65.                     resource = "index.html";
  66.  
  67.                 Console.WriteLine("Request from " + socket.RemoteEndPoint + ": "
  68.                         + resource + "\n");
  69.  
  70.                 if (resource.Contains("add?username="))
  71.                 {
  72.                     string[] user = resource.Split(new string[] { "username=", "name=", "lastname=" }, StringSplitOptions.None);
  73.                     string responseText = "HTTP/1.0 200 OK\r\n\r\n";
  74.                     sw.Write(responseText);
  75.  
  76.                     var username = GetPropertyValue(user[1]);
  77.                     var name = GetPropertyValue(user[2]);
  78.                     var lastname = GetPropertyValue(user[3]);
  79.  
  80.                     Console.WriteLine($"Found username: {username}, Name: {name}, Lastname: {lastname}");
  81.  
  82.                     sw.Write("<html><body>");
  83.                     if (String.IsNullOrEmpty(username))
  84.                     {
  85.                         sw.WriteLine(GetAllUsers());
  86.                     }
  87.                     else
  88.                     {
  89.                         if (users.Contains(new User { Username = username }))
  90.                         {
  91.                             sw.Write($"<h1>User with:{username} already exists.</h1>");
  92.                         }
  93.                         else
  94.                         {
  95.                             users.Add(new User { Username = username, Name = name, Lastname = lastname });
  96.                             sw.Write($"<h1>Successfully added: {username}</h1>");
  97.                             sw.WriteLine(GetAllUsers());
  98.                         }
  99.                     }
  100.                     sw.WriteLine("<a href=\"/index.html\">Home</a>");
  101.                     sw.WriteLine("</body></html>");
  102.                 }
  103.                 else if (resource.Contains("find?username="))
  104.                 {
  105.                     string responseText = "HTTP/1.0 200 OK\r\n\r\n";
  106.                     sw.Write(responseText);
  107.                     sw.Write("<html><body>");
  108.  
  109.                     string[] user = resource.Split(new string[] { "username=" }, StringSplitOptions.None);
  110.                     var username = GetPropertyValue(user[1]);
  111.  
  112.                     if (String.IsNullOrEmpty(username))
  113.                     {
  114.                         sw.WriteLine(GetAllUsers());
  115.                     }
  116.                     else
  117.                     {
  118.                         if (users.Contains(new User { Username = username }))
  119.                         {
  120.                             User findUser = users.Find(u => u.Equals(username));
  121.                             sw.Write($"<h1>User with:{username} exists.</h1>");
  122.                             sw.Write($"<p>Username:{findUser.Username} Name: {findUser.Name} Lastname:{findUser.Lastname}.</p>");
  123.                         }
  124.                         else
  125.                         {
  126.                             sw.Write($"<h1>User with:{username} does not exist.</h1>");
  127.                         }
  128.                     }
  129.                     sw.WriteLine("<a href=\"/index.html\">Home</a>");
  130.                     sw.WriteLine("</body></html>");
  131.                 }
  132.                 else if (resource.Contains("delete?username="))
  133.                 {
  134.                     string responseText = "HTTP/1.0 200 OK\r\n\r\n";
  135.                     sw.Write(responseText);
  136.                     sw.Write("<html><body>");
  137.  
  138.                     string[] user = resource.Split(new string[] { "username=" }, StringSplitOptions.None);
  139.                     var username = GetPropertyValue(user[1]);
  140.  
  141.                     if (String.IsNullOrEmpty(username))
  142.                     {
  143.                         sw.WriteLine(GetAllUsers());
  144.                     }
  145.                     else
  146.                     {
  147.                         if (users.Contains(new User { Username = username }))
  148.                         {
  149.                             users.RemoveAll(u=>u.Equals(username));
  150.                             sw.Write($"<h1>User {username} removed.</h1>");
  151.                         }
  152.                         else
  153.                         {
  154.                             sw.Write($"<h1>User with:{username} does not exist.</h1>");
  155.                         }
  156.                     }
  157.  
  158.                     sw.WriteLine("<a href=\"/index.html\">Home</a>");
  159.                     sw.WriteLine("</body></html>");
  160.                 }
  161.                 else
  162.                 {
  163.                     SendResponse(resource, socket, sw);
  164.                 }
  165.             }
  166.             sr.Close();
  167.             sw.Close();
  168.             stream.Close();
  169.  
  170.             socket.Shutdown(SocketShutdown.Both);
  171.             socket.Close();
  172.             //return 0;
  173.         }
  174.  
  175.         private static string GetPropertyValue(string field)
  176.         {
  177.             var newField = field.Split('&')[0];
  178.             newField = Uri.UnescapeDataString(newField);
  179.             newField = newField.Replace("+", " ");
  180.  
  181.             return newField;
  182.         }
  183.  
  184.         private static string GetAllUsers()
  185.         {
  186.  
  187.             string result = "<ol>";
  188.  
  189.             if (users.Count == 0)
  190.             {
  191.                 result = "<h3> List is empty! </h3>";
  192.                 return result;
  193.  
  194.             }
  195.             foreach (User user in users)
  196.             {
  197.                 result += "<li>" + user.Username + "</li>\n";
  198.             }
  199.  
  200.             result += "</ol>";
  201.             return result;
  202.         }
  203.  
  204.         private static string GetResource(StreamReader sr)
  205.         {
  206.             string line = sr.ReadLine();
  207.  
  208.             if (line == null)
  209.                 return null;
  210.  
  211.             String[] tokens = line.Split(' ');
  212.  
  213.             // prva linija HTTP zahteva: METOD /resurs HTTP/verzija
  214.             // obradjujemo samo GET metodu
  215.             string method = tokens[0];
  216.             if (!method.Equals("GET"))
  217.             {
  218.                 return null;
  219.             }
  220.  
  221.             string rsrc = tokens[1];
  222.  
  223.             // izbacimo znak '/' sa pocetka
  224.             rsrc = rsrc.Substring(1);
  225.  
  226.             // ignorisemo ostatak zaglavlja
  227.             string s1;
  228.             while (!(s1 = sr.ReadLine()).Equals(""))
  229.                 Console.WriteLine(s1);
  230.             Console.WriteLine("Request: " + line);
  231.             return rsrc;
  232.         }
  233.  
  234.         private static void SendResponse(string resource, Socket socket, StreamWriter sw)
  235.         {
  236.             // ako u resource-u imamo bilo šta što nije slovo ili cifra, možemo da
  237.             // konvertujemo u "normalan" oblik
  238.             //resource = Uri.UnescapeDataString(resource);
  239.  
  240.             // pripremimo putanju do našeg web root-a
  241.             resource = "../../../" + resource;
  242.             FileInfo fi = new FileInfo(resource);
  243.  
  244.             string responseText;
  245.             if (!fi.Exists)
  246.             {
  247.                 // ako datoteka ne postoji, vratimo kod za gresku
  248.                 responseText = "HTTP/1.0 404 File not found\r\n"
  249.                         + "Content-type: text/html; charset=UTF-8\r\n\r\n<b>404 Нисам нашао:"
  250.                         + fi.Name + "</b>";
  251.                 sw.Write(responseText);
  252.                 Console.WriteLine("Could not find resource: " + fi.Name);
  253.                 return;
  254.             }
  255.  
  256.             // ispisemo zaglavlje HTTP odgovora
  257.             responseText = "HTTP/1.0 200 OK\r\nContent-type: text/html; charset=UTF-8\r\n\r\n";
  258.             sw.Write(responseText);
  259.  
  260.             // a, zatim datoteku
  261.             socket.SendFile(resource);
  262.         }
  263.  
  264.         public static int Main(String[] args)
  265.         {
  266.             StartListening();
  267.             return 0;
  268.         }
  269.     }
  270. }
  271.  
Add Comment
Please, Sign In to add comment