Advertisement
Mihailo21

Program2

Apr 19th, 2024
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.13 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<Lek> lekovi = new List<Lek>();
  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?id="))
  71.                 {
  72.                     string[] lek = resource.Split(new string[] { "id=", "naziv=", "cena=","kolicina=","tip=" }, StringSplitOptions.None);
  73.                     string responseText = "HTTP/1.0 200 OK\r\n\r\n";
  74.                     sw.Write(responseText);
  75.  
  76.                     var id = GetPropertyValue(lek[1]);
  77.                     var naziv = GetPropertyValue(lek[2]);
  78.                     var cena = GetPropertyValue(lek[3]);
  79.                     var kolicina = GetPropertyValue(lek[4]);
  80.                     var tip = GetPropertyValue(lek[5]);
  81.  
  82.                     Console.WriteLine($"Found lek: {id}, Naziv: {naziv}, Tip: {tip}");
  83.  
  84.                     sw.Write("<html><body>");
  85.                     if (String.IsNullOrEmpty(id))
  86.                     {
  87.                         sw.WriteLine(GetAllUsers());
  88.                     }
  89.                     else
  90.                     {
  91.                         if (lekovi.Contains(new Lek { Id = id }))
  92.                         {
  93.                             sw.Write($"<h1>Lek with:{id} already exists.</h1>");
  94.                         }
  95.                         else
  96.                         {
  97.                             lekovi.Add(new Lek { Id = id, Naziv = naziv, Cena = cena,Kolicina = kolicina,Tip = tip });
  98.                             sw.Write($"<h1>Added Lek with: {id}</h1>");
  99.                             sw.WriteLine(GetAllUsers());
  100.                         }
  101.                     }
  102.                     sw.WriteLine("<a href=\"/index.html\">Povratak na pocetnu stranicu</a>");
  103.                     sw.WriteLine("</body></html>");
  104.                 }
  105.                 else if (resource.Contains("find?tip="))
  106.                 {
  107.                     string responseText = "HTTP/1.0 200 OK\r\n\r\n";
  108.                     sw.Write(responseText);
  109.                     sw.Write("<html><body>");
  110.  
  111.                     string[] lek = resource.Split(new string[] {"tip=" }, StringSplitOptions.None);
  112.                     var tip = GetPropertyValue(lek[1]);
  113.  
  114.                     if (String.IsNullOrEmpty(tip))
  115.                     {
  116.                         sw.WriteLine(GetAllUsers());
  117.                     }
  118.                     else
  119.                     {
  120.                         List<Lek> pomocniLekovi = new List<Lek>();
  121.                         foreach (Lek lekic in lekovi)
  122.                         {
  123.                             if (lekic.Tip.Equals(tip))
  124.                             {
  125.                                 pomocniLekovi.Add(lekic);
  126.                             }
  127.                         }
  128.  
  129.                         if(pomocniLekovi.Count != 0)
  130.                         {
  131.                             string result = "<style>table,th,td{border: 1px solid black;}</style>\n";
  132.                             result += "<table>\n";
  133.                             result += "<th>Id</th>\n";
  134.                             result += "<th>Naziv</th>\n";
  135.                             result += "<th>Cena</th>\n";
  136.                             result += "<th>Kolicina</th>\n";
  137.                             result += "<th>Tip</th>\n";
  138.                             foreach (Lek lekic in pomocniLekovi)
  139.                             {
  140.                                 result += "<tr>\n";
  141.                                 result += "<td>" + lekic.Id + "</td>\n";
  142.                                 result += "<td>" + lekic.Naziv + "</td>\n";
  143.                                 result += "<td>" + lekic.Cena + "</td>\n";
  144.                                 result += "<td>" + lekic.Kolicina + "</td>\n";
  145.                                 result += "<td>" + lekic.Tip + "</td>\n";
  146.                                 result += "</tr>\n";
  147.                             }
  148.                             result += "<table>";
  149.                             sw.Write(result);
  150.                         }
  151.                         else
  152.                         {
  153.                             sw.WriteLine("<h1>NE POSTOJE LEKOVI IZABRANOG TIPA</h1>");
  154.                         }
  155.  
  156.                        
  157.                     }
  158.                     sw.WriteLine("<a href=\"/index.html\">Povratak na pocetnu stranicu</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.             string result = "<style>table,th,td{border: 1px solid black;}</style>\n";
  187.             result += "<table>\n";
  188.             result += "<th>Id</th>\n";
  189.             result += "<th>Naziv</th>\n";
  190.             result += "<th>Cena</th>\n";
  191.             result += "<th>Kolicina</th>\n";
  192.             result += "<th>Tip</th>\n";
  193.             if (lekovi.Count == 0)
  194.             {
  195.                 result = "<h3> List is empty! </h3>";
  196.                 return result;
  197.  
  198.             }
  199.             foreach (Lek lek in lekovi)
  200.             {
  201.                 result += "<tr>\n";
  202.                 result += "<td>" + lek.Id +"</td>\n";
  203.                 result += "<td>" + lek.Naziv + "</td>\n";
  204.                 result += "<td>" + lek.Cena + "</td>\n";
  205.                 result += "<td>" + lek.Kolicina + "</td>\n";
  206.                 result += "<td>" + lek.Tip + "</td>\n";
  207.                 result += "</tr>\n";
  208.             }
  209.  
  210.             result += "<table>";
  211.             return result;
  212.         }
  213.  
  214.         private static string GetResource(StreamReader sr)
  215.         {
  216.             string line = sr.ReadLine();
  217.  
  218.             if (line == null)
  219.                 return null;
  220.  
  221.             String[] tokens = line.Split(' ');
  222.  
  223.             // prva linija HTTP zahteva: METOD /resurs HTTP/verzija
  224.             // obradjujemo samo GET metodu
  225.             string method = tokens[0];
  226.             if (!method.Equals("GET"))
  227.             {
  228.                 return null;
  229.             }
  230.  
  231.             string rsrc = tokens[1];
  232.  
  233.             // izbacimo znak '/' sa pocetka
  234.             rsrc = rsrc.Substring(1);
  235.  
  236.             // ignorisemo ostatak zaglavlja
  237.             string s1;
  238.             while (!(s1 = sr.ReadLine()).Equals(""))
  239.                 Console.WriteLine(s1);
  240.             Console.WriteLine("Request: " + line);
  241.             return rsrc;
  242.         }
  243.  
  244.         private static void SendResponse(string resource, Socket socket, StreamWriter sw)
  245.         {
  246.             // ako u resource-u imamo bilo šta što nije slovo ili cifra, možemo da
  247.             // konvertujemo u "normalan" oblik
  248.             //resource = Uri.UnescapeDataString(resource);
  249.  
  250.             // pripremimo putanju do našeg web root-a
  251.             resource = "../../../" + resource;
  252.             FileInfo fi = new FileInfo(resource);
  253.  
  254.             string responseText;
  255.             if (!fi.Exists)
  256.             {
  257.                 // ako datoteka ne postoji, vratimo kod za gresku
  258.                 responseText = "HTTP/1.0 404 File not found\r\n"
  259.                         + "Content-type: text/html; charset=UTF-8\r\n\r\n<b>404 Нисам нашао:"
  260.                         + fi.Name + "</b>";
  261.                 sw.Write(responseText);
  262.                 Console.WriteLine("Could not find resource: " + fi.Name);
  263.                 return;
  264.             }
  265.  
  266.             // ispisemo zaglavlje HTTP odgovora
  267.             responseText = "HTTP/1.0 200 OK\r\nContent-type: text/html; charset=UTF-8\r\n\r\n";
  268.             sw.Write(responseText);
  269.  
  270.             // a, zatim datoteku
  271.             socket.SendFile(resource);
  272.         }
  273.  
  274.         public static int Main(String[] args)
  275.         {
  276.             StartListening();
  277.             return 0;
  278.         }
  279.     }
  280. }
  281.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement