Advertisement
Guest User

webServer

a guest
Dec 4th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.31 KB | None | 0 0
  1. import java.io.IOException;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;
  4. import java.util.HashMap;
  5.  
  6.  
  7. public class WebServer {
  8.  
  9.     private static WebServer instance;
  10.     private int port;
  11.     private ServerSocket srvr;
  12.     private Socket skt;
  13.     @SuppressWarnings("unused")
  14.     private HashMap<String, User> users;
  15.  
  16.     private WebServer() {
  17.         this.port = 8080;
  18.         this.srvr = null;
  19.         this.skt = null;
  20.         this.users = new HashMap<String, User>();
  21.     }
  22.  
  23.     public static WebServer getInstance() {
  24.         if(instance == null) { instance  = new WebServer(); }
  25.         return instance;
  26.     }
  27.    
  28.     public void run() throws IOException {
  29.         this.srvr = new ServerSocket(this.port);
  30.        
  31.         while (true) {
  32.             try {
  33.                 skt = srvr.accept();
  34.                 new WebServerThread(skt);
  35.                 skt = null;
  36.             } catch (IOException ex) {
  37.                 ex.printStackTrace();
  38.             }
  39.         }
  40.     }
  41.  
  42.     public int getPort() {
  43.         return port;
  44.     }
  45.  
  46.     public void setPort(int port) {
  47.         this.port = port;
  48.     }
  49.  
  50.     public ServerSocket getSrvr() {
  51.         return srvr;
  52.     }
  53.  
  54.     public void setSrvr(ServerSocket srvr) {
  55.         this.srvr = srvr;
  56.     }
  57.  
  58.     public Socket getSkt() {
  59.         return skt;
  60.     }
  61.  
  62.     public void setSkt(Socket skt) {
  63.         this.skt = skt;
  64.     }
  65.  
  66.     public HashMap<String, User> getUsers() {
  67.         return users;
  68.     }
  69.  
  70.     public void setUsers(HashMap<String, User> users) {
  71.         this.users = users;
  72.     }
  73.  
  74.     public static void setInstance(WebServer instance) {
  75.         WebServer.instance = instance;
  76.     }
  77. }
  78.  
  79. import java.io.BufferedReader;
  80. import java.io.File;
  81. import java.io.FileInputStream;
  82. import java.io.IOException;
  83. import java.io.InputStream;
  84. import java.io.InputStreamReader;
  85. import java.io.OutputStream;
  86. import java.io.PrintStream;
  87. import java.net.Socket;
  88. import java.util.ArrayList;
  89. import java.util.HashMap;
  90.  
  91. public class WebServerThread extends Thread {
  92.  
  93.     private final String HTTP200 = "HTTP/1.0 200 OK\r\n";
  94.     private final String HTTP201 = "HTTP/1.0 201 Created\r\n";
  95.     private final String HTTP204 = "HTTP/1.0 204 No Content\r\n";
  96.     private final String HTTP400 = "HTTP/1.0 400 Bad Request\r\n";
  97.     private final String HTTP404 = "HTTP/1.0 404 File not found\r\n";
  98.     private final String HTTPCONTENTTYPE = "Content-type: text/html; charset=UTF-8\r\n";
  99.  
  100.     private Socket sock;
  101.     private String method;
  102.     private String resource;
  103.     private String firstLine;
  104.     private HashMap<String, String> header;
  105.     private HashMap<String, String> params;
  106.  
  107.     public WebServerThread(Socket sock) {
  108.         this.sock = sock;
  109.         this.method = "";
  110.         this.firstLine = null;
  111.         this.header = new HashMap<>();
  112.         this.params = new HashMap<>();
  113.  
  114.         try {
  115.             start();
  116.         } catch (Exception ex) {
  117.             ex.printStackTrace();
  118.         }
  119.     }
  120.  
  121.     public void run() {
  122.         try {
  123.  
  124.             parseHttp(sock.getInputStream());
  125.             if (this.resource != null) {
  126.                 if (this.resource.equals("")) {
  127.                     this.resource = "index.html";
  128.                 }
  129.                 synchronized (WebServer.getInstance().getUsers()) {
  130.                     sendResponse(sock.getOutputStream());
  131.                 }
  132.             }
  133.             sock.close();
  134.         } catch (Exception ex) {
  135.             ex.printStackTrace();
  136.         }
  137.     }
  138.  
  139.     private void sendResponse(OutputStream outputStream) throws IOException {
  140.         if (this.resource.equals("index.html")) {
  141.             this.fileResponse(outputStream);
  142.         } else if (this.resource.equals("reguser.html")) {
  143.             this.fileResponse(outputStream);
  144.         } else if (this.resource.equals("finduser.html")) {
  145.             this.fileResponse(outputStream);
  146.         } else if (this.resource.startsWith("finduser?")) {
  147.             this.onHtmlGetFindUser(outputStream);
  148.         } else if (this.resource.equals("remuser.html")) {
  149.             this.fileResponse(outputStream);
  150.         } else if (this.resource.equals("listusers?")) {
  151.             this.onHtmlGetAllUsers(outputStream);
  152.         } else if (this.resource.equals("reguser")) {
  153.             this.onHtmlPostRegisterUser(outputStream);
  154.         } else if (this.resource.equals("remuser")) {
  155.             this.onHtmlPostRemoveUser(outputStream);
  156.         }
  157.  
  158.     }
  159.  
  160.     private void onHtmlPostRemoveUser(OutputStream outputStream) {
  161.  
  162.         String response = "";
  163.         PrintStream ps = new PrintStream(outputStream);
  164.         User user = WebServer.getInstance().getUsers().get(params.get("username"));
  165.         response += HTTP200  + "\r\n";
  166.         response += "<html><head></head><body>";
  167.         if (user == null) {
  168.             response += "<p> User with that username doesn't exist. "
  169.                     + "</p> <a href=\"index.html\"><button style=\"width:100px\">Home</button></a><br>";
  170.             response += "</body></html>";
  171.             ps.println(response);
  172.             ps.flush();
  173.             return;
  174.         }
  175.         WebServer.getInstance().getUsers().remove(user.getUsername());
  176.         response += "<p> User deleted successfully. "
  177.                 + "</p> <a href=\"index.html\"><button style=\"width:100px\">Home</button></a><br>";
  178.         response += "</body></html>";
  179.         ps.println(response);
  180.         ps.flush();
  181.     }
  182.  
  183.     private void onHtmlGetAllUsers(OutputStream outputStream) {
  184.         String response = "";
  185.         PrintStream ps = new PrintStream(outputStream);
  186.  
  187.         response += HTTP200 + "\r\n";
  188.         response += "<html><head>";
  189.         response += "<style>table{border-collapse:collapse;}table,th,td{border:2px solid black;}"
  190.                 + ".row:nth-child(even){background:#dde;}"
  191.                 + ".row:nth-child(odd){background:white;}</style>";
  192.         response += "</head><body>";
  193.         response += "<fieldset><legend>Number of users is: <b>" + Integer.toString(WebServer.getInstance().getUsers().size()) + "</b></legend>";
  194.         response += "<table style=\"border:1px solid red\">";
  195.         response += "<tr class=\"row\"><th>eFirstname</th><th>Lastname</th><th>Username</th></tr>";
  196.         for (String string : WebServer.getInstance().getUsers().keySet()) {
  197.             response += "<tr class=\"row\">";
  198.             User user = WebServer.getInstance().getUsers().get(string);
  199.             response += "<td>" +  user.getFirstName() + "</td>";
  200.             response += "<td>" +  user.getLastName() + "</td>";
  201.             response += "<td>" +  user.getUsername() + "</td>";
  202.             response += "</tr>";
  203.         }
  204.        
  205.         response += "</table></fieldset></body></html>";
  206.         ps.println(response);
  207.         ps.flush();
  208.  
  209.     }
  210.  
  211.     private void onHtmlGetFindUser(OutputStream outputStream) {
  212.  
  213.         String response = "";
  214.         PrintStream ps = new PrintStream(outputStream);
  215.         try {
  216.             System.out.println(this.resource);
  217.             String line[] = this.resource.split("\\?");
  218.             System.out.println(line[1]);
  219.             String[] params = line[1].split("\\=");
  220.             System.out.println(params[1]);
  221.             User user = WebServer.getInstance().getUsers().get(params[1]);
  222.             if (user != null) {
  223.                 response += HTTP200 + "\r\n";
  224.                 response += "<html><head></head><body>";
  225.                 response += "<p>User <b>" + user.getUsername() + "</b> found!</p>";
  226.                 response += "<p>Password: ";
  227.                 for (int i = 0; i < (user.getPassword().length()); i++) {
  228.                     response += "*";
  229.                 }
  230.                 response += "</p>";
  231.                 response += "<p>First name: " + user.getFirstName() + "</p>";
  232.                 response += "<p>Last name: " + user.getLastName() + "</p>";
  233.                 response += "<p>" + user.getSex() + "</p>";
  234.             } else {
  235.                 response += HTTP200 + "\r\n";
  236.                 response += "<html><head></head><body>";
  237.                 response += "<p>User <b>" + params[1] + "</b> not found!</p>";
  238.             }
  239.             response += "<a href=\"index.html\"><button style=\"width:100px\">Home</button></a><br>";
  240.             response += "<a href=\"finduser.html\"><button style=\"width:100px\">Try again</button></a><br>";
  241.             response += "</body></html>";
  242.         } catch (Exception e) {
  243.             response += HTTP400 + "\r\n";
  244.             response += "<p>Invalid input data!</p>";
  245.         }
  246.         ps.print(response);
  247.         ps.flush();
  248.     }
  249.  
  250.     private void onHtmlPostRegisterUser(OutputStream outputStream) {
  251.         String response = "";
  252.         PrintStream ps = new PrintStream(outputStream);
  253.         System.out.println("---");
  254.         for (String s : this.params.keySet()) {
  255.             System.out.println(s + " : " + this.params.get(s));
  256.         }
  257.         System.out.println("---");
  258.  
  259.         if (!(this.params.containsKey("username") && this.params.containsKey("password")
  260.                 && this.params.containsKey("name") && this.params.containsKey("lname")
  261.                 && this.params.containsKey("male"))) {
  262.             return;
  263.         }
  264.         User user = WebServer.getInstance().getUsers().get(this.params.get("username"));
  265.         if (user == null) {
  266.             User newUser = new User();
  267.             newUser.setFirstName(this.params.get("name"));
  268.             newUser.setLastName(this.params.get("lname"));
  269.             newUser.setUsername(this.params.get("username"));
  270.             newUser.setPassword(this.params.get("password"));
  271.             newUser.setSex(this.params.get("male"));
  272.             WebServer.getInstance().getUsers().put(newUser.getUsername(), newUser);
  273.             response += HTTP200 + "\r\n";
  274.             response += "<html><head></head><body>";
  275.             response += "<p>User <b>" + newUser.getUsername() + "</b> has successfully registred!</p>";
  276.         } else {
  277.             response += HTTP200 + "\r\n";
  278.             response += "<html><head></head><body>";
  279.             response += "<p>Registration failed! Username is already in use.</p>";
  280.         }
  281.         response += "<a href=\"reguser.html\"><button style=\"width:100px\">Try again</button></a>";
  282.         response += "<a href=\"index.html\"><button style=\"width:100px\">Home</button></a><br>";
  283.         response += "</body></html>";
  284.         ps.println(response);
  285.         ps.flush();
  286.     }
  287.  
  288.     private void fileResponse(OutputStream os) throws IOException {
  289.         PrintStream ps = new PrintStream(os);
  290.         this.resource = this.resource.replace('/', File.separatorChar);
  291.         File file = new File(this.resource);
  292.         if (!file.exists()) {
  293.             ps.print(HTTP404 + HTTPCONTENTTYPE + "\r\n" + "<b>404: File " + file.getName() + " not found!</b>");
  294.             return;
  295.         }
  296.         ps.print(HTTP200 + "\r\n");
  297.         FileInputStream fis = new FileInputStream(file);
  298.         byte[] data = new byte[8192];
  299.         int len;
  300.         while ((len = fis.read(data)) != -1) {
  301.             ps.write(data, 0, len);
  302.         }
  303.  
  304.         fis.close();
  305.         ps.flush();
  306.  
  307.     }
  308.  
  309.     private void parseHttp(InputStream is) throws IOException {
  310.         BufferedReader dis = new BufferedReader(new InputStreamReader(is));
  311.         System.out.println("=== HTTP REQ ===");
  312.         this.firstLine = dis.readLine();
  313.         System.out.println(this.firstLine);
  314.         if (this.firstLine == null) {
  315.             return;
  316.         }
  317.         String[] tokens = this.firstLine.split(" ");
  318.         this.method = tokens[0];
  319.         this.resource = tokens[1];
  320.         this.resource = this.resource.substring(1);
  321.  
  322.         String s1;
  323.         String s2[];
  324.         while (!(s1 = dis.readLine()).equals("")) {
  325.             System.out.println(s1);
  326.             s2 = s1.split(": ");
  327.             header.put(s2[0], s2[1]);
  328.         }
  329.         if (this.method.equals("POST")) {
  330.             System.out.println("desilo se");
  331.             this.extractPostParameters(dis);
  332.         }
  333.         System.out.println("================");
  334.  
  335.     }
  336.  
  337.     private void extractPostParameters(BufferedReader rdr) {
  338.         try {
  339.             String lengthStr = this.header.get("Content-Length");
  340.             String contentType = this.header.get("Content-Type");
  341.             if ((lengthStr != null) & (contentType != null)) {
  342.                 int len = 0;
  343.                 try {
  344.                     len = Integer.parseInt(lengthStr);
  345.                 } catch (Exception e) {
  346.  
  347.                 }
  348.  
  349.                 if (len > 0 && contentType.equalsIgnoreCase("application/x-www-form-urlencoded")) {
  350.                     String name, value, s1;
  351.                     char buff[] = new char[len];
  352.                     rdr.read(buff, 0, len);
  353.                     s1 = new String(buff);
  354.                     System.out.println("\n" + s1);
  355.                     putInParamMap(s1);
  356.                 }
  357.             }
  358.  
  359.         } catch (Exception e) {
  360.             // TODO: handle exception
  361.         }
  362.     }
  363.  
  364.     private void putInParamMap(String s) {
  365.         String[] tokens = s.split("&");
  366.         for (String str : tokens) {
  367.             int idx = str.indexOf("=");
  368.             String pName = str.substring(0, idx).trim();
  369.             String pValue = str.substring(idx + 1).trim();
  370.             this.params.put(pName, pValue);
  371.         }
  372.     }
  373. }
  374.  
  375.  
  376. import java.io.IOException;
  377.  
  378. public class Main {
  379.  
  380.     public static void main(String[] args) throws IOException {
  381.         WebServer.getInstance().run();
  382.     }
  383.  
  384. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement