1. import java.io.IOException;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. public class HeaderLimiter {
  7. private static final int PORT = 8080; // Port to listen on
  8. private static final int MAX_HEADER_SIZE = 4096; // Maximum size for each header
  9. private static final int MAX_HEADERS = 100; // Maximum number of headers allowed
  10. private ServerSocket serverSocket;
  11. public HeaderLimiter() throws IOException {
  12. serverSocket = new ServerSocket(PORT);
  13. }
  14. public void start() throws IOException {
  15. System.out.println("Header Limiter started on port " + PORT);
  16. while (true) {
  17. Socket clientSocket = serverSocket.accept();
  18. processRequest(clientSocket);
  19. clientSocket.close();
  20. }
  21. }
  22. private void processRequest(Socket clientSocket) throws IOException {
  23. try (java.io.InputStream inputStream = clientSocket.getInputStream();
  24. java.io.OutputStream outputStream = clientSocket.getOutputStream()) {
  25. StringBuilder request = new StringBuilder();
  26. int buffer;
  27. while ((buffer = inputStream.read()) != -1) {
  28. request.append((char) buffer);
  29. }
  30. String requestString = request.toString();
  31. String[] headers = parseHeaders(requestString);
  32. if (headers != null) {
  33. validateHeaders(headers, outputStream);
  34. } else {
  35. // Handle invalid request
  36. outputStream.write("Invalid Request".getBytes());
  37. outputStream.flush();
  38. }
  39. }
  40. }
  41. private String[] parseHeaders(String requestString) {
  42. String[] headers = requestString.split("\r\n");
  43. //Basic parsing, adjust as needed for more complex requests.
  44. return headers;
  45. }
  46. private void validateHeaders(String[] headers, OutputStream outputStream) {
  47. Map<String, Integer> headerCounts = new HashMap<>();
  48. for (String header : headers) {
  49. String[] parts = header.split(": ");
  50. if (parts.length == 2) {
  51. String name = parts[0].trim();
  52. String value = parts[1].trim();
  53. if (name.isEmpty() || value.isEmpty()) continue;
  54. if (name.length() > MAX_HEADER_SIZE) {
  55. outputStream.write("Header Name too long".getBytes());
  56. outputStream.flush();
  57. return;
  58. }
  59. headerCounts.put(name, headerCounts.getOrDefault(name, 0) + 1);
  60. if (headerCounts.get(name) > MAX_HEADERS) {
  61. outputStream.write("Too many headers".getBytes());
  62. outputStream.flush();
  63. return;
  64. }
  65. }
  66. }
  67. }
  68. public void stop() throws IOException {
  69. serverSocket.close();
  70. System.out.println("Header Limiter stopped.");
  71. }
  72. public static void main(String[] args) throws IOException {
  73. HeaderLimiter limiter = new HeaderLimiter();
  74. limiter.start();
  75. //Keep the program running to accept connections. In a real application you might have a more sophisticated shutdown mechanism.
  76. try {
  77. Thread.sleep(10000); //Run for 10 seconds
  78. } catch (InterruptedException e) {
  79. //Handle interruption
  80. } finally {
  81. limiter.stop();
  82. }
  83. }
  84. }

Add your comment