Skip to content

Commit b037ec6

Browse files
committed
Add middleware support
1 parent 3d9213b commit b037ec6

File tree

5 files changed

+104
-43
lines changed

5 files changed

+104
-43
lines changed

src/express/Express.java

Lines changed: 49 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package express;
22

3-
import com.sun.net.httpserver.*;
3+
import com.sun.net.httpserver.Filter;
4+
import com.sun.net.httpserver.HttpContext;
5+
import com.sun.net.httpserver.HttpServer;
46
import express.events.Action;
57
import express.events.HttpRequest;
68
import express.http.Request;
79
import express.http.Response;
8-
import express.middleware.ExpressMiddleware;
910

11+
import java.io.File;
1012
import java.io.IOException;
1113
import java.net.InetSocketAddress;
1214
import java.util.ArrayList;
@@ -15,60 +17,72 @@
1517

1618
public class Express {
1719

20+
private final List<Filter> MIDDLEWARE = Collections.synchronizedList(new ArrayList<>());
1821
private final List<Filter> FILTER = Collections.synchronizedList(new ArrayList<>());
22+
int middlewareIndex = 0;
1923

2024
private HttpServer httpServer;
2125
private HttpContext httpContext;
2226
private HttpRequest request404;
2327

24-
public Express() {
25-
26-
}
27-
2828
public void use(HttpRequest request) {
29-
add("*", "*", request);
29+
addFilter(true, "*", "*", request);
3030
}
3131

3232
public void use(String context, HttpRequest request) {
33-
add("*", context, request);
34-
}
35-
36-
public void use(String method, String context, HttpRequest request) {
37-
add(method.toUpperCase(), context, request);
33+
addFilter(true, "*", context, request);
3834
}
3935

40-
public void on(String method, String context, HttpRequest request) {
41-
add(method.toUpperCase(), context, request);
36+
public void use(String context, String requestMethod, HttpRequest request) {
37+
addFilter(true, requestMethod.toUpperCase(), context, request);
4238
}
4339

4440
public void all(String context, HttpRequest request) {
45-
add("*", context, request);
41+
addFilter(false, "*", context, request);
4642
}
4743

4844
public void get(String context, HttpRequest request) {
49-
add("GET", context, request);
45+
addFilter(false, "GET", context, request);
5046
}
5147

5248
public void post(String context, HttpRequest request) {
53-
add("POST", context, request);
49+
addFilter(false, "POST", context, request);
5450
}
5551

5652
public void put(String context, HttpRequest request) {
57-
add("PUT", context, request);
53+
addFilter(false, "PUT", context, request);
5854
}
5955

6056
public void delete(String context, HttpRequest request) {
61-
add("DELETE", context, request);
57+
addFilter(false, "DELETE", context, request);
6258
}
6359

6460
public void patch(String context, HttpRequest request) {
65-
add("PATCH", context, request);
61+
addFilter(false, "PATCH", context, request);
62+
}
63+
64+
private void addFilter(boolean middleware, String requestMethod, String context, HttpRequest request) {
65+
ExpressFilter handler = new ExpressFilter(requestMethod, context, request);
66+
if (httpContext == null) {
67+
if (middleware) {
68+
MIDDLEWARE.add(handler);
69+
} else {
70+
FILTER.add(handler);
71+
}
72+
} else {
73+
List<Filter> filters = httpContext.getFilters();
74+
75+
if (middleware) {
76+
filters.add(middlewareIndex, handler);
77+
middlewareIndex++;
78+
} else filters.add(handler);
79+
}
6680
}
6781

68-
private void add(String requestMethod, String context, HttpRequest request) {
69-
ExpressMiddleware handler = new ExpressMiddleware(requestMethod, context, request);
82+
private void addFirst(String requestMethod, String context, HttpRequest request) {
83+
ExpressFilter handler = new ExpressFilter(requestMethod, context, request);
7084
if (httpContext == null) {
71-
FILTER.add(handler);
85+
MIDDLEWARE.add(handler);
7286
} else {
7387
httpContext.getFilters().add(handler);
7488
}
@@ -78,7 +92,6 @@ public void listen() throws IOException {
7892
launch(null, 80);
7993
}
8094

81-
8295
public void listen(int port) throws IOException {
8396
launch(null, port);
8497
}
@@ -110,6 +123,7 @@ private void launch(Action action, int port) throws IOException {
110123
}
111124
});
112125

126+
httpContext.getFilters().addAll(MIDDLEWARE);
113127
httpContext.getFilters().addAll(FILTER);
114128

115129
httpServer.start();
@@ -121,4 +135,15 @@ private void launch(Action action, int port) throws IOException {
121135
}).start();
122136
}
123137

138+
public static HttpRequest statics(String path) {
139+
return (req, res) -> {
140+
File reqFile = new File(path + req.getURI().getPath());
141+
142+
if (reqFile.exists()) {
143+
String extension = reqFile.getAbsolutePath().replaceAll("^(.*\\.|.*\\\\|.+$)", "");
144+
String contentType = ExpressUtils.getContentType(extension);
145+
res.send(reqFile, contentType);
146+
}
147+
};
148+
}
124149
}

src/express/middleware/ExpressMiddleware.java renamed to src/express/ExpressFilter.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package express.middleware;
1+
package express;
22

33
import com.sun.net.httpserver.Filter;
44
import com.sun.net.httpserver.HttpExchange;
@@ -11,19 +11,23 @@
1111
import java.util.regex.Matcher;
1212
import java.util.regex.Pattern;
1313

14-
public class ExpressMiddleware extends Filter {
14+
public class ExpressFilter extends Filter {
1515

1616
private final HttpRequest REQUEST;
1717
private final String REQUEST_METHOD;
18+
19+
private final String CONTEXT;
1820
private final String[] CONTEXT_PARAMS;
1921
private final String CONTEXT_REGEX;
2022
private final Pattern CONTEXT_PATTERN;
2123

2224
private String description;
2325

24-
public ExpressMiddleware(String requestMethod, String context, HttpRequest httpRequest) {
26+
public ExpressFilter(String requestMethod, String context, HttpRequest httpRequest) {
2527
this.REQUEST_METHOD = requestMethod;
2628
this.REQUEST = httpRequest;
29+
30+
this.CONTEXT = context;
2731
this.CONTEXT_PARAMS = context.split("(/)(:|[^:]+|)(:|)");
2832
this.CONTEXT_REGEX = "\\Q" + context.replaceAll(":([^/]+)", "\\\\E([^/]+)\\\\Q") + "\\E";
2933
this.CONTEXT_PATTERN = Pattern.compile(CONTEXT_REGEX);
@@ -37,7 +41,15 @@ public void doFilter(HttpExchange httpExchange, Chain chain) throws IOException
3741
String requestMethod = httpExchange.getRequestMethod();
3842
String requestPath = request.getURI().getRawPath();
3943

40-
if (!requestMethod.equals(REQUEST_METHOD) || !requestPath.matches(CONTEXT_REGEX)) {
44+
if ((requestMethod.equals(REQUEST_METHOD)) || (REQUEST_METHOD.equals("*") && CONTEXT.equals("*"))) {
45+
REQUEST.handle(request, response);
46+
47+
if (!response.isClosed())
48+
chain.doFilter(httpExchange);
49+
return;
50+
}
51+
52+
if (!requestPath.matches(CONTEXT_REGEX) && !CONTEXT.equals("*")) {
4153
chain.doFilter(httpExchange);
4254
return;
4355
}
@@ -61,13 +73,12 @@ public void doFilter(HttpExchange httpExchange, Chain chain) throws IOException
6173
REQUEST.handle(request, response);
6274
}
6375

76+
public void setDescription(String description) {
77+
this.description = description;
78+
}
6479

6580
@Override
6681
public String description() {
6782
return description;
6883
}
69-
70-
public void setDescription(String description) {
71-
this.description = description;
72-
}
7384
}

src/express/http/Request.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import java.util.HashMap;
1313
import java.util.List;
1414

15-
public class Request{
15+
public class Request {
1616

1717
private final HttpExchange HTTP_EXCHANGE;
1818
private final URI URI;
@@ -29,6 +29,7 @@ public Request(HttpExchange exchange) {
2929
this.HEADER = exchange.getRequestHeaders();
3030
this.BODY = exchange.getRequestBody();
3131

32+
this.params = new HashMap<>();
3233
this.QUERYS = ExpressUtils.parseRawQuery(exchange.getRequestURI());
3334
this.COOKIES = ExpressUtils.parseCookies(exchange.getRequestHeaders());
3435
}
@@ -69,6 +70,10 @@ public URI getURI() {
6970
return this.URI;
7071
}
7172

73+
public String getPath() {
74+
return this.URI.getPath();
75+
}
76+
7277
public String getMethod() {
7378
return HTTP_EXCHANGE.getRequestMethod();
7479
}

src/test/Get.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,39 +9,39 @@
99
public class Get {
1010

1111
public static void main(String[] args) throws IOException {
12-
Express express = new Express();
12+
Express app = new Express();
1313

1414
// Test case for url
15-
express.get("/", (req, res) -> res.send("Called /"));
15+
app.get("/", (req, res) -> res.send("Called /"));
1616

1717
// Test case for url
18-
express.get("/user", (req, res) -> res.send("Called /user"));
18+
app.get("/user", (req, res) -> res.send("Called /user"));
1919

2020
// Test case for url
21-
express.get("/user/bob", (req, res) -> res.send("Called /user/bob"));
21+
app.get("/user/bob", (req, res) -> res.send("Called /user/bob"));
2222

2323
// Test case for url querying
24-
express.get("/getposts", (req, res) -> {
24+
app.get("/getposts", (req, res) -> {
2525
String age = req.getQuery("age");
2626
String from = req.getQuery("from");
2727
res.send("Age: " + age + "\nFrom: " + from);
2828
});
2929

3030
// Test case for param placeholder
31-
express.get("/hello/:username", (req, res) -> {
31+
app.get("/hello/:username", (req, res) -> {
3232
String username = req.getParam("username");
3333
res.send("User " + username + " sad hello!");
3434
});
3535

3636
// Test case for multiple param placeholder
37-
express.get("/hello/:username/:count", (req, res) -> {
37+
app.get("/hello/:username/:count", (req, res) -> {
3838
String username = req.getParam("username");
3939
String count = req.getParam("count");
4040
res.send("User " + username + " want to say " + count + " times hello!");
4141
});
4242

4343
// Test case for cookie setting & multiple param placeholder
44-
express.get("/cookie/:name/:val", (req, res) -> {
44+
app.get("/cookie/:name/:val", (req, res) -> {
4545
String name = req.getParam("name");
4646
String val = req.getParam("val");
4747
Cookie cookie = new Cookie(name, val);
@@ -50,14 +50,14 @@ public static void main(String[] args) throws IOException {
5050
});
5151

5252
// Test case for cookie reading
53-
express.get("/showcookies", (req, res) -> {
53+
app.get("/showcookies", (req, res) -> {
5454
HashMap<String, Cookie> cookies = req.getCookies();
5555
StringBuffer buffer = new StringBuffer();
5656
cookies.forEach((s, cookie) -> buffer.append(s).append(": ").append(cookie));
5757
res.send(buffer.toString());
5858
});
5959

60-
express.listen(() -> System.out.println("Express is listening!"));
60+
app.listen(() -> System.out.println("Express is listening!"));
6161
}
6262

6363
}

src/test/Use.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package test;
2+
3+
import express.Express;
4+
import express.cookie.Cookie;
5+
6+
import java.io.IOException;
7+
import java.util.HashMap;
8+
9+
public class Use {
10+
11+
public static void main(String[] args) throws IOException {
12+
Express app = new Express();
13+
14+
// Test for static file service
15+
app.use(Express.statics("examplepath\\test_statics"));
16+
17+
app.listen(() -> System.out.println("Express is listening!"));
18+
}
19+
20+
}

0 commit comments

Comments
 (0)