Advertisement
Guest User

01. Parsing HTTP Requests

a guest
Jan 20th, 2019
471
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.83 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.*;
  5.  
  6. public class Application {
  7.  
  8.     private static BufferedReader reader = new BufferedReader(new
  9.             InputStreamReader(System.in));
  10.  
  11.     public static void main(String[] args) throws IOException {
  12.         List<String> validUrls = getValudUrls();
  13.         List<String> request = getRequest();
  14.  
  15.         String method = getMethod(request.get(0));
  16.         String url = getUrl(request.get(0));
  17.  
  18.         Map<String, String> headers = getHeaders(request);
  19.         Map<String, String> bodyParameters = getBodyParams(request);
  20.  
  21.         StringBuilder response = new StringBuilder();
  22.         if (!validUrls.contains(url)) {
  23.             response.append("HTTP/1.1 404 Not Found")
  24.                     .append(System.lineSeparator());
  25.  
  26.             getResponseHeaders(headers, response);
  27.  
  28.             response.append(System.lineSeparator());
  29.             response.append("The requested functionality was not found.");
  30.  
  31.         } else if (!headers.keySet().contains("Authorization")) {
  32.             response.append("HTTP/1.1 401 Unauthorized")
  33.                     .append(System.lineSeparator());
  34.  
  35.             getResponseHeaders(headers, response);
  36.             response.append(System.lineSeparator());
  37.             response.append("You are not authorized to access the requested functionality.");
  38.  
  39.         } else if (method.equals("POST") && bodyParameters.size() == 0) {
  40.             response.append("HTTP/1.1 400 Bad Request")
  41.                     .append(System.lineSeparator());
  42.  
  43.             getResponseHeaders(headers, response);
  44.  
  45.             response.append(System.lineSeparator());
  46.             response.append("There was an error with the requested functionality due to malformed request.");
  47.  
  48.         } else if (method.equals("GET")) {
  49.             response.append("HTTP/1.1 200 OK").append(System.lineSeparator());
  50.  
  51.             getResponseHeaders(headers, response);
  52.  
  53.             String toDecode = headers.get("Authorization").substring(headers.get("Authorization").indexOf("Basic") +6);
  54.             String responseBody = String.format("Greetings %s!",
  55.                     new String(Base64.getDecoder().decode(toDecode)));
  56.  
  57.             response.append(System.lineSeparator());
  58.             response.append(responseBody.toString());
  59.         } else {
  60.             response.append("HTTP/1.1 200 OK").append(System.lineSeparator());
  61.  
  62.             getResponseHeaders(headers, response);
  63.  
  64.             String first = "";
  65.             String second = "";
  66.             String third = "";
  67.             int count = 0;
  68.             for (Map.Entry<String, String> kvp : bodyParameters.entrySet()) {
  69.                 switch (count) {
  70.                     case 0:
  71.                         first = kvp.getValue();
  72.                         break;
  73.                     case 1:
  74.                         second = kvp.getKey() + " - " + kvp.getValue();
  75.                         break;
  76.                     case 2:
  77.                         third = kvp.getKey() + " - " + kvp.getValue();
  78.                         break;
  79.                 }
  80.                 count++;
  81.             }
  82.             String responseBody = String.format("Greetings %s! You have successfully created %s with %s, %s.",
  83.                     new String(Base64.getDecoder().decode(headers.get("Authorization").substring(headers.get("Authorization").indexOf("Basic") +6))),
  84.                     first, second, third);
  85.  
  86.             response.append(System.lineSeparator());
  87.             response.append(responseBody.toString());
  88.         }
  89.         System.out.println(response.toString());
  90.     }
  91.  
  92.     private static void getResponseHeaders(Map<String, String> headers, StringBuilder response) {
  93.         for (Map.Entry<String, String> kvp : headers.entrySet()) {
  94.             if (kvp.getKey().equals("Date") ||
  95.                     kvp.getKey().equals("Host") ||
  96.                     kvp.getKey().equals("Content-Type")) {
  97.                 response.append(kvp.getKey()).append(": ")
  98.                         .append(kvp.getValue()).append(System.lineSeparator());
  99.             }
  100.         }
  101.     }
  102.  
  103.     private static Map<String, String> getBodyParams(List<String> request) {
  104.         Map<String, String> bodyParameters = new LinkedHashMap<>();
  105.  
  106.         if (request.get(request.size() - 1).equals("\r\n")) {
  107.             return bodyParameters;
  108.         }
  109.  
  110.         Arrays.stream(request.get(request.size() - 1).split("&"))
  111.                 .map(bp -> bp.split("="))
  112.                 .forEach(bpKvp -> {
  113.                     bodyParameters.put(bpKvp[0], bpKvp[1]);
  114.                 });
  115.         return bodyParameters;
  116.     }
  117.  
  118.     private static Map<String, String> getHeaders(List<String> request) {
  119.         Map<String, String> headers = new LinkedHashMap<>();
  120.         request.stream().skip(1)
  121.                 .filter(h -> h.contains(": "))
  122.                 .map(h -> h.split(": "))
  123.                 .forEach(headerKvp -> {
  124.                     headers.put(headerKvp[0], headerKvp[1]);
  125.                 });
  126.  
  127.         return headers;
  128.     }
  129.  
  130.     private static String getMethod(String line) {
  131.         return line.split("\\s+")[0];
  132.  
  133.     }
  134.  
  135.     private static String getUrl(String line) {
  136.         return line.split("\\s+")[1];
  137.     }
  138.  
  139.     private static List<String> getValudUrls() throws IOException {
  140.         return Arrays.asList(reader.readLine().split("\\s+"));
  141.     }
  142.  
  143.     private static List<String> getRequest() throws IOException {
  144.         List<String> request = new ArrayList<>();
  145.  
  146.         String line = null;
  147.         while ((line = reader.readLine()) != null && line.length() > 0) {
  148.             request.add(line);
  149.         }
  150.         request.add(System.lineSeparator());
  151.         if ((line = reader.readLine()) != null && line.length() > 0) {
  152.             request.add(line);
  153.         }
  154.         return request;
  155.     }
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement