11package org .example .server ;
22
3+ import org .example .filter .Filter ;
4+ import org .example .filter .FilterChainImpl ;
5+ import org .example .httpparser .HttpRequest ;
6+ import org .example .http .HttpResponseBuilder ;
7+
38import java .util .ArrayList ;
49import java .util .Comparator ;
510import java .util .List ;
11+ import java .util .function .BiConsumer ;
612
713public class ConfigurableFilterPipeline {
814
@@ -12,7 +18,8 @@ public ConfigurableFilterPipeline(List<FilterRegistration> registrations) {
1218 this .registrations = registrations ;
1319 }
1420
15- public HttpResponse execute (HttpRequest request , TerminalHandler handler ) {
21+ public HttpResponseBuilder execute (HttpRequest request ,
22+ BiConsumer <HttpRequest , HttpResponseBuilder > terminalHandler ) {
1623
1724 List <FilterRegistration > globalRegs = new ArrayList <>();
1825 List <FilterRegistration > routeRegs = new ArrayList <>();
@@ -21,7 +28,7 @@ public HttpResponse execute(HttpRequest request, TerminalHandler handler) {
2128 if (reg .isGlobal ()) {
2229 globalRegs .add (reg );
2330 } else {
24- if (matchesAny (reg .routePatterns (), request .path ())) {
31+ if (matchesAny (reg .routePatterns (), request .getPath ())) {
2532 routeRegs .add (reg );
2633 }
2734 }
@@ -33,19 +40,21 @@ public HttpResponse execute(HttpRequest request, TerminalHandler handler) {
3340 globalRegs .sort (byOrder );
3441 routeRegs .sort (byOrder );
3542
36- List <HttpFilter > allFilters = new ArrayList <>(globalRegs .size () + routeRegs .size ());
43+ List <Filter > allFilters = new ArrayList <>(globalRegs .size () + routeRegs .size ());
3744 for (FilterRegistration reg : globalRegs ) {
3845 allFilters .add (reg .filter ());
3946 }
4047 for (FilterRegistration reg : routeRegs ) {
4148 allFilters .add (reg .filter ());
4249 }
4350
44- return buildChain (allFilters , handler ).next (request );
51+ HttpResponseBuilder response = new HttpResponseBuilder ();
52+ new FilterChainImpl (allFilters , terminalHandler ).doFilter (request , response );
53+ return response ;
4554 }
4655
4756 private boolean matchesAny (List <String > patterns , String path ) {
48- if (patterns == null ) return false ;
57+ if (patterns == null || path == null ) return false ;
4958
5059 for (String pattern : patterns ) {
5160 if (RoutePattern .matches (pattern , path )) {
@@ -55,77 +64,4 @@ private boolean matchesAny(List<String> patterns, String path) {
5564
5665 return false ;
5766 }
58-
59- private FilterChain buildChain (List <HttpFilter > filters , TerminalHandler handler ) {
60-
61- FilterChain chain = new FilterChain () {
62- @ Override
63- public HttpResponse next (HttpRequest request ) {
64- return handler .handle (request );
65- }
66- };
67-
68- for (int i = filters .size () - 1 ; i >= 0 ; i --) {
69-
70- HttpFilter currentFilter = filters .get (i );
71- FilterChain nextChain = chain ;
72-
73- chain = new FilterChain () {
74- @ Override
75- public HttpResponse next (HttpRequest request ) {
76- return currentFilter .handle (request , nextChain );
77- }
78- };
79- }
80-
81- return chain ;
82- }
83- }
84-
85- class HttpRequest {
86- private final String method ;
87- private final String path ;
88-
89- public HttpRequest (String method , String path ) {
90- this .method = method ;
91- this .path = path ;
92- }
93-
94- public String path () {
95- return path ;
96- }
97-
98- public String getMethod () {
99- return method ;
100- }
101- }
102-
103- class HttpResponse {
104- private final int statusCode ;
105- private final String body ;
106-
107- public HttpResponse (int statusCode , String body ) {
108- this .statusCode = statusCode ;
109- this .body = body ;
110- }
111-
112- public int getStatusCode () {
113- return statusCode ;
114- }
115-
116- public String getBody () {
117- return body ;
118- }
119- }
120-
121- interface HttpFilter {
122- HttpResponse handle (HttpRequest request , FilterChain chain );
123- }
124-
125- interface FilterChain {
126- HttpResponse next (HttpRequest request );
127- }
128-
129- interface TerminalHandler {
130- HttpResponse handle (HttpRequest request );
13167}
0 commit comments