11package org .example ;
22
3+ import org .example .config .AppConfig ;
4+ import org .example .filter .IpFilter ;
35import org .example .httpparser .HttpParser ;
6+ import org .example .httpparser .HttpRequest ;
7+ import java .util .ArrayList ;
8+ import java .util .List ;
9+ import org .example .filter .Filter ;
10+ import org .example .filter .FilterChainImpl ;
11+ import org .example .http .HttpResponseBuilder ;
12+ import org .example .config .ConfigLoader ;
413
514import java .io .IOException ;
615import java .net .Socket ;
@@ -9,21 +18,66 @@ public class ConnectionHandler implements AutoCloseable {
918
1019 Socket client ;
1120 String uri ;
21+ private final List <Filter > filters ;
1222
1323 public ConnectionHandler (Socket client ) {
1424 this .client = client ;
25+ this .filters = buildFilters ();
1526 }
27+ private List <Filter > buildFilters () {
28+ List <Filter > list = new ArrayList <>();
29+ AppConfig config = ConfigLoader .get ();
30+ AppConfig .IpFilterConfig ipFilterConfig = config .ipFilter ();
31+ if (Boolean .TRUE .equals (ipFilterConfig .enabled ())) {
32+ list .add (createIpFilterFromConfig (ipFilterConfig ));
33+ }
34+ // Add more filters here...
35+ return list ;
36+ }
37+
1638
1739 public void runConnectionHandler () throws IOException {
18- StaticFileHandler sfh = new StaticFileHandler ();
1940 HttpParser parser = new HttpParser ();
2041 parser .setReader (client .getInputStream ());
2142 parser .parseRequest ();
2243 parser .parseHttp ();
44+
45+ HttpRequest request = new HttpRequest (
46+ parser .getMethod (),
47+ parser .getUri (),
48+ parser .getVersion (),
49+ parser .getHeadersMap (),
50+ ""
51+ );
52+
53+ String clientIp = client .getInetAddress ().getHostAddress ();
54+ request .setAttribute ("clientIp" , clientIp );
55+
56+ HttpResponseBuilder response = applyFilters (request );
57+
58+ int statusCode = response .getStatusCode ();
59+ if (statusCode == HttpResponseBuilder .SC_FORBIDDEN ||
60+ statusCode == HttpResponseBuilder .SC_BAD_REQUEST ) {
61+ byte [] responseBytes = response .build ();
62+ client .getOutputStream ().write (responseBytes );
63+ client .getOutputStream ().flush ();
64+ return ;
65+ }
66+
2367 resolveTargetFile (parser .getUri ());
68+ StaticFileHandler sfh = new StaticFileHandler ();
2469 sfh .sendGetRequest (client .getOutputStream (), uri );
2570 }
2671
72+ private HttpResponseBuilder applyFilters (HttpRequest request ) {
73+ HttpResponseBuilder response = new HttpResponseBuilder ();
74+
75+ FilterChainImpl chain = new FilterChainImpl (filters );
76+ chain .doFilter (request , response );
77+
78+ return response ;
79+ }
80+
2781 private void resolveTargetFile (String uri ) {
2882 if (uri .matches ("/$" )) { //matches(/)
2983 this .uri = "index.html" ;
@@ -39,4 +93,28 @@ private void resolveTargetFile(String uri) {
3993 public void close () throws Exception {
4094 client .close ();
4195 }
96+
97+ private IpFilter createIpFilterFromConfig (AppConfig .IpFilterConfig config ) {
98+ IpFilter filter = new IpFilter ();
99+
100+ // Set mode
101+ if ("ALLOWLIST" .equalsIgnoreCase (config .mode ())) {
102+ filter .setMode (IpFilter .FilterMode .ALLOWLIST );
103+ } else {
104+ filter .setMode (IpFilter .FilterMode .BLOCKLIST );
105+ }
106+
107+ // Add blocked IPs
108+ for (String ip : config .blockedIps ()) {
109+ filter .addBlockedIp (ip );
110+ }
111+
112+ // Add allowed IPs
113+ for (String ip : config .allowedIps ()) {
114+ filter .addAllowedIp (ip );
115+ }
116+
117+ filter .init ();
118+ return filter ;
119+ }
42120}
0 commit comments