Skip to content

Commit 3d9213b

Browse files
committed
Use httpserver.Filter / remove old middleware schema
1 parent aadd590 commit 3d9213b

File tree

6 files changed

+116
-208
lines changed

6 files changed

+116
-208
lines changed

src/express/Express.java

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,77 @@
11
package express;
22

3-
import com.sun.net.httpserver.HttpServer;
3+
import com.sun.net.httpserver.*;
44
import express.events.Action;
55
import express.events.HttpRequest;
6+
import express.http.Request;
7+
import express.http.Response;
8+
import express.middleware.ExpressMiddleware;
69

7-
import java.io.File;
810
import java.io.IOException;
911
import java.net.InetSocketAddress;
1012
import java.util.ArrayList;
11-
import java.util.concurrent.ConcurrentHashMap;
13+
import java.util.Collections;
14+
import java.util.List;
1215

1316
public class Express {
1417

15-
protected final ConcurrentHashMap<String, ArrayList<ExpressHandler>> MITTLEWARE = new ConcurrentHashMap<>();
16-
protected final ConcurrentHashMap<String, ArrayList<ExpressHandler>> REQUEST = new ConcurrentHashMap<>();
18+
private final List<Filter> FILTER = Collections.synchronizedList(new ArrayList<>());
1719

18-
protected HttpServer httpServer;
20+
private HttpServer httpServer;
21+
private HttpContext httpContext;
22+
private HttpRequest request404;
1923

2024
public Express() {
25+
2126
}
2227

2328
public void use(HttpRequest request) {
24-
addToRouteMap(MITTLEWARE, "*", "*", request);
29+
add("*", "*", request);
2530
}
2631

2732
public void use(String context, HttpRequest request) {
28-
addToRouteMap(MITTLEWARE, "*", context, request);
33+
add("*", context, request);
2934
}
3035

3136
public void use(String method, String context, HttpRequest request) {
32-
addToRouteMap(MITTLEWARE, method.toUpperCase(), context, request);
37+
add(method.toUpperCase(), context, request);
3338
}
3439

3540
public void on(String method, String context, HttpRequest request) {
36-
addToRouteMap(REQUEST, method.toUpperCase(), context, request);
41+
add(method.toUpperCase(), context, request);
3742
}
3843

3944
public void all(String context, HttpRequest request) {
40-
addToRouteMap(REQUEST, "*", context, request);
45+
add("*", context, request);
4146
}
4247

4348
public void get(String context, HttpRequest request) {
44-
addToRouteMap(REQUEST, "GET", context, request);
49+
add("GET", context, request);
4550
}
4651

4752
public void post(String context, HttpRequest request) {
48-
addToRouteMap(REQUEST, "POST", context, request);
53+
add("POST", context, request);
4954
}
5055

5156
public void put(String context, HttpRequest request) {
52-
addToRouteMap(REQUEST, "PUT", context, request);
57+
add("PUT", context, request);
5358
}
5459

5560
public void delete(String context, HttpRequest request) {
56-
addToRouteMap(REQUEST, "DELETE", context, request);
61+
add("DELETE", context, request);
5762
}
5863

5964
public void patch(String context, HttpRequest request) {
60-
addToRouteMap(REQUEST, "PATCH", context, request);
65+
add("PATCH", context, request);
6166
}
6267

63-
private void addToRouteMap(ConcurrentHashMap<String, ArrayList<ExpressHandler>> routemap, String key, String context, HttpRequest request) {
64-
65-
if (!routemap.containsKey(key))
66-
routemap.put(key, new ArrayList<>());
67-
68-
routemap.get(key).add(new ExpressHandler(context, request));
68+
private void add(String requestMethod, String context, HttpRequest request) {
69+
ExpressMiddleware handler = new ExpressMiddleware(requestMethod, context, request);
70+
if (httpContext == null) {
71+
FILTER.add(handler);
72+
} else {
73+
httpContext.getFilters().add(handler);
74+
}
6975
}
7076

7177
public void listen() throws IOException {
@@ -85,12 +91,26 @@ public void listen(int port, Action action) throws IOException {
8591
launch(action, port);
8692
}
8793

94+
public void set404(HttpRequest request) {
95+
this.request404 = request;
96+
}
97+
8898
private void launch(Action action, int port) throws IOException {
8999
new Thread(() -> {
90100
try {
91101
httpServer = HttpServer.create(new InetSocketAddress("localhost", port), 0);
92102
httpServer.setExecutor(null);
93-
httpServer.createContext("/", new ExpressContext(this));
103+
httpContext = httpServer.createContext("/", httpExchange -> {
104+
if (request404 != null) {
105+
Request request = new Request(httpExchange);
106+
Response response = new Response(httpExchange);
107+
request404.handle(request, response);
108+
} else {
109+
System.err.println("Not 404 Handler specified");
110+
}
111+
});
112+
113+
httpContext.getFilters().addAll(FILTER);
94114

95115
httpServer.start();
96116
action.action();
@@ -101,16 +121,4 @@ private void launch(Action action, int port) throws IOException {
101121
}).start();
102122
}
103123

104-
public static HttpRequest statics(String path) {
105-
return (req, res) -> {
106-
File reqFile = new File(path + req.getURI().getPath());
107-
108-
if (reqFile.exists()) {
109-
String extension = reqFile.getAbsolutePath().replaceAll("^(.*\\.|.*\\\\|.+$)", "");
110-
String contentType = ExpressUtils.getContentType(extension);
111-
res.send(reqFile, contentType);
112-
}
113-
};
114-
}
115-
116124
}

src/express/ExpressContext.java

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/express/ExpressContextThread.java

Lines changed: 0 additions & 74 deletions
This file was deleted.

src/express/ExpressHandler.java

Lines changed: 0 additions & 56 deletions
This file was deleted.
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package express.middleware;
2+
3+
import com.sun.net.httpserver.Filter;
4+
import com.sun.net.httpserver.HttpExchange;
5+
import express.events.HttpRequest;
6+
import express.http.Request;
7+
import express.http.Response;
8+
9+
import java.io.IOException;
10+
import java.util.HashMap;
11+
import java.util.regex.Matcher;
12+
import java.util.regex.Pattern;
13+
14+
public class ExpressMiddleware extends Filter {
15+
16+
private final HttpRequest REQUEST;
17+
private final String REQUEST_METHOD;
18+
private final String[] CONTEXT_PARAMS;
19+
private final String CONTEXT_REGEX;
20+
private final Pattern CONTEXT_PATTERN;
21+
22+
private String description;
23+
24+
public ExpressMiddleware(String requestMethod, String context, HttpRequest httpRequest) {
25+
this.REQUEST_METHOD = requestMethod;
26+
this.REQUEST = httpRequest;
27+
this.CONTEXT_PARAMS = context.split("(/)(:|[^:]+|)(:|)");
28+
this.CONTEXT_REGEX = "\\Q" + context.replaceAll(":([^/]+)", "\\\\E([^/]+)\\\\Q") + "\\E";
29+
this.CONTEXT_PATTERN = Pattern.compile(CONTEXT_REGEX);
30+
}
31+
32+
@Override
33+
public void doFilter(HttpExchange httpExchange, Chain chain) throws IOException {
34+
Request request = new Request(httpExchange);
35+
Response response = new Response(httpExchange);
36+
37+
String requestMethod = httpExchange.getRequestMethod();
38+
String requestPath = request.getURI().getRawPath();
39+
40+
if (!requestMethod.equals(REQUEST_METHOD) || !requestPath.matches(CONTEXT_REGEX)) {
41+
chain.doFilter(httpExchange);
42+
return;
43+
}
44+
45+
HashMap<String, String> params = new HashMap<>();
46+
Matcher matcher = CONTEXT_PATTERN.matcher(requestPath);
47+
48+
if (matcher.find()) {
49+
50+
for (int i = 1; i <= matcher.groupCount() && i < CONTEXT_PARAMS.length; i++) {
51+
String g = matcher.group(i);
52+
params.put(CONTEXT_PARAMS[i], g);
53+
}
54+
55+
} else {
56+
chain.doFilter(httpExchange);
57+
return;
58+
}
59+
60+
request.setParams(params);
61+
REQUEST.handle(request, response);
62+
}
63+
64+
65+
@Override
66+
public String description() {
67+
return description;
68+
}
69+
70+
public void setDescription(String description) {
71+
this.description = description;
72+
}
73+
}

src/test/Use.java

Lines changed: 0 additions & 21 deletions
This file was deleted.

0 commit comments

Comments
 (0)