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,34 +18,115 @@ public class ConnectionHandler implements AutoCloseable {
918
1019 Socket client ;
1120 String uri ;
21+ private final List <Filter > filters ;
22+ String webRoot ;
1223
1324 public ConnectionHandler (Socket client ) {
1425 this .client = client ;
26+ this .filters = buildFilters ();
27+ this .webRoot = null ;
28+ }
29+
30+ public ConnectionHandler (Socket client , String webRoot ) {
31+ this .client = client ;
32+ this .webRoot = webRoot ;
33+ this .filters = buildFilters ();
34+ }
35+
36+ private List <Filter > buildFilters () {
37+ List <Filter > list = new ArrayList <>();
38+ AppConfig config = ConfigLoader .get ();
39+ AppConfig .IpFilterConfig ipFilterConfig = config .ipFilter ();
40+ if (Boolean .TRUE .equals (ipFilterConfig .enabled ())) {
41+ list .add (createIpFilterFromConfig (ipFilterConfig ));
42+ }
43+ // Add more filters here...
44+ return list ;
1545 }
1646
1747 public void runConnectionHandler () throws IOException {
18- StaticFileHandler sfh = new StaticFileHandler ();
48+ StaticFileHandler sfh ;
49+
50+ if (webRoot != null ) {
51+ sfh = new StaticFileHandler (webRoot );
52+ } else {
53+ sfh = new StaticFileHandler ();
54+ }
55+
1956 HttpParser parser = new HttpParser ();
2057 parser .setReader (client .getInputStream ());
2158 parser .parseRequest ();
2259 parser .parseHttp ();
60+
61+ HttpRequest request = new HttpRequest (
62+ parser .getMethod (),
63+ parser .getUri (),
64+ parser .getVersion (),
65+ parser .getHeadersMap (),
66+ ""
67+ );
68+
69+ String clientIp = client .getInetAddress ().getHostAddress ();
70+ request .setAttribute ("clientIp" , clientIp );
71+
72+ HttpResponseBuilder response = applyFilters (request );
73+
74+ int statusCode = response .getStatusCode ();
75+ if (statusCode == HttpResponseBuilder .SC_FORBIDDEN ||
76+ statusCode == HttpResponseBuilder .SC_BAD_REQUEST ) {
77+ byte [] responseBytes = response .build ();
78+ client .getOutputStream ().write (responseBytes );
79+ client .getOutputStream ().flush ();
80+ return ;
81+ }
82+
2383 resolveTargetFile (parser .getUri ());
2484 sfh .sendGetRequest (client .getOutputStream (), uri );
2585 }
2686
87+ private HttpResponseBuilder applyFilters (HttpRequest request ) {
88+ HttpResponseBuilder response = new HttpResponseBuilder ();
89+
90+ FilterChainImpl chain = new FilterChainImpl (filters );
91+ chain .doFilter (request , response );
92+
93+ return response ;
94+ }
95+
2796 private void resolveTargetFile (String uri ) {
28- if (uri . matches ( "/$" )) { //matches(/)
97+ if (uri == null || "/" . equals ( uri )) {
2998 this .uri = "index.html" ;
30- } else if (uri .matches ("^(?!.*\\ .html$).*$" )) {
31- this .uri = uri .concat (".html" );
3299 } else {
33- this .uri = uri ;
100+ this .uri = uri . startsWith ( "/" ) ? uri . substring ( 1 ) : uri ;
34101 }
35-
36102 }
37103
38104 @ Override
39105 public void close () throws Exception {
40106 client .close ();
41107 }
42- }
108+
109+ private IpFilter createIpFilterFromConfig (AppConfig .IpFilterConfig config ) {
110+ IpFilter filter = new IpFilter ();
111+
112+ // Set mode
113+ if ("ALLOWLIST" .equalsIgnoreCase (config .mode ())) {
114+ filter .setMode (IpFilter .FilterMode .ALLOWLIST );
115+ } else {
116+ filter .setMode (IpFilter .FilterMode .BLOCKLIST );
117+ }
118+
119+ // Add blocked IPs
120+ for (String ip : config .blockedIps ()) {
121+ filter .addBlockedIp (ip );
122+ }
123+
124+ // Add allowed IPs
125+ for (String ip : config .allowedIps ()) {
126+ filter .addAllowedIp (ip );
127+ }
128+
129+ filter .init ();
130+ return filter ;
131+ }
132+ }
0 commit comments