Skip to content

Commit 54195e6

Browse files
authored
Merge pull request #24 from onlyskin/responder-refactor
Responder refactor
2 parents e69be9b + 72ae6c7 commit 54195e6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+755
-661
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package httpserver;
2+
3+
import httpserver.request.Request;
4+
import httpserver.responder.MethodResponder;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
public class MethodResponderSupplier {
10+
private final List<MethodResponder> methodResponders;
11+
12+
public MethodResponderSupplier() {
13+
this.methodResponders = new ArrayList<>();
14+
}
15+
16+
public MethodResponder supplyResponder(Request request) throws Exception {
17+
for (MethodResponder methodResponder: methodResponders) {
18+
if (methodResponder.handles(request)) {
19+
return methodResponder;
20+
}
21+
}
22+
throw new Exception();
23+
}
24+
25+
public void registerResponder(MethodResponder methodResponder) {
26+
this.methodResponders.add(methodResponder);
27+
}
28+
29+
public List<MethodResponder> allResponders() {
30+
return methodResponders;
31+
}
32+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package httpserver;
2+
3+
import httpserver.file.FileOperator;
4+
import httpserver.file.Html;
5+
import httpserver.file.PathExaminer;
6+
import httpserver.header.RangeHeaderValueParser;
7+
import httpserver.responder.*;
8+
import httpserver.route.*;
9+
10+
public class MethodResponderSupplierFactory {
11+
public MethodResponderSupplier makeResponderSupplier() {
12+
MethodResponderSupplier methodResponderSupplier = new MethodResponderSupplier();
13+
14+
PathExaminer pathExaminer = new PathExaminer();
15+
FileOperator fileOperator = new FileOperator();
16+
Router router = makeRouter(pathExaminer, fileOperator);
17+
Html html = new Html();
18+
RangeHeaderValueParser rangeHeaderValueParser = new RangeHeaderValueParser();
19+
Hasher hasher = new Hasher();
20+
21+
methodResponderSupplier.registerResponder(new GetResponder(
22+
router,
23+
pathExaminer,
24+
html,
25+
rangeHeaderValueParser));
26+
methodResponderSupplier.registerResponder(new HeadResponder(
27+
router,
28+
pathExaminer,
29+
html,
30+
rangeHeaderValueParser));
31+
methodResponderSupplier.registerResponder(new PostResponder(
32+
pathExaminer,
33+
fileOperator));
34+
methodResponderSupplier.registerResponder(new PutResponder(
35+
pathExaminer,
36+
fileOperator));
37+
methodResponderSupplier.registerResponder(new PatchResponder(
38+
pathExaminer,
39+
fileOperator,
40+
hasher));
41+
methodResponderSupplier.registerResponder(new DeleteResponder(
42+
pathExaminer,
43+
fileOperator));
44+
methodResponderSupplier.registerResponder(new OptionsResponder(methodResponderSupplier));
45+
46+
return methodResponderSupplier;
47+
}
48+
49+
private Router makeRouter(PathExaminer pathExaminer, FileOperator fileOperator) {
50+
Route[] routeList = new Route[]{
51+
new CoffeeRoute(),
52+
new TeaRoute(),
53+
new LogsRoute(),
54+
new CookieRoute(),
55+
new EatCookieRoute(),
56+
new ParametersRoute(),
57+
new FormGetRoute(pathExaminer, fileOperator),
58+
new RedirectRoute(),
59+
};
60+
return new Router(routeList);
61+
}
62+
}

src/main/java/httpserver/ResponderSupplier.java

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

src/main/java/httpserver/ResponderSupplierFactory.java

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

src/main/java/httpserver/SocketHandler.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
import httpserver.request.Request;
44
import httpserver.request.RequestParser;
5-
import httpserver.responder.GeneralResponder;
5+
import httpserver.responder.Responder;
66
import httpserver.response.BadRequestResponse;
7+
import httpserver.response.MethodNotAllowedResponse;
78
import httpserver.response.Response;
89

910
import java.io.IOException;
@@ -13,18 +14,18 @@ public class SocketHandler implements Runnable {
1314
private final AppConfig appConfig;
1415
private final InputStream inputStream;
1516
private final RequestParser requestParser;
16-
private final GeneralResponder generalResponder;
17+
private final Responder responder;
1718
private final ResponseWriter responseWriter;
1819

1920
public SocketHandler(AppConfig appConfig,
2021
InputStream inputStream,
2122
RequestParser requestParser,
22-
GeneralResponder generalResponder,
23+
Responder responder,
2324
ResponseWriter responseWriter) {
2425
this.appConfig = appConfig;
2526
this.inputStream = inputStream;
2627
this.requestParser = requestParser;
27-
this.generalResponder = generalResponder;
28+
this.responder = responder;
2829
this.responseWriter = responseWriter;
2930
}
3031

@@ -33,7 +34,9 @@ public void run() {
3334

3435
try {
3536
Request request = requestParser.parse(inputStream);
36-
response = generalResponder.respond(appConfig, request);
37+
response = responder.respond(appConfig, request);
38+
} catch (IllegalArgumentException e) {
39+
response = new MethodNotAllowedResponse();
3740
} catch (Exception e) {
3841
response = new BadRequestResponse();
3942
}

src/main/java/httpserver/SocketHandlerFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package httpserver;
22

33
import httpserver.request.RequestParser;
4-
import httpserver.responder.GeneralResponder;
4+
import httpserver.responder.Responder;
55

66
import java.io.IOException;
77
import java.io.InputStream;
@@ -13,15 +13,15 @@ public SocketHandler newSocketHandler(AppConfig appConfig, Socket clientSocket)
1313
return new SocketHandler(appConfig,
1414
clientSocket.getInputStream(),
1515
new RequestParser(appConfig),
16-
new GeneralResponder(new ResponderSupplierFactory().makeResponderSupplier()),
16+
new Responder(new MethodResponderSupplierFactory().makeResponderSupplier()),
1717
new ResponseWriter(clientSocket.getOutputStream()));
1818
}
1919

2020
public SocketHandler newSocketHandlerFromStreams(AppConfig appConfig, InputStream inputStream, OutputStream outputStream) throws IOException {
2121
return new SocketHandler(appConfig,
2222
inputStream,
2323
new RequestParser(appConfig),
24-
new GeneralResponder(new ResponderSupplierFactory().makeResponderSupplier()),
24+
new Responder(new MethodResponderSupplierFactory().makeResponderSupplier()),
2525
new ResponseWriter(outputStream));
2626
}
2727
}

src/main/java/httpserver/file/PathExaminer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212

1313
public class PathExaminer {
1414

15-
public Path getFullPath(Path root, String requestPathString) {
16-
return root.resolve(requestPathString.substring(1));
15+
public Path getFullPath(Path root, String requestPath) {
16+
return root.resolve(requestPath.substring(1));
1717
}
1818

1919
public Path getPath(String input) {

src/main/java/httpserver/header/RangeHeaderValueParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ private Range getRange(String[] parts) {
3636
}
3737

3838
private String[] getParts(String headerValue) {
39-
String rangeString = headerValue.substring(6);
40-
return rangeString.split("-", 2);
39+
String range = headerValue.substring(6);
40+
return range.split("-", 2);
4141
}
4242

4343
private int parseRangeValue(String value) {

src/main/java/httpserver/request/Request.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,32 @@
11
package httpserver.request;
22

3+
import httpserver.Method;
34
import httpserver.Parameter;
45
import httpserver.header.Header;
56

67
import java.util.ArrayList;
78
import java.util.List;
89

910
public class Request {
10-
private final String method;
11+
private final Method method;
1112
private final String pathString;
1213
private final Header[] headers;
1314
private final String queryString;
1415
private final String body;
1516

16-
public Request(String method, String pathString, Header[] headers, String queryString) {
17+
public Request(Method method, String pathString, Header[] headers, String queryString) {
1718
this(method, pathString, headers, queryString, "");
1819
}
1920

20-
public Request(String method, String pathString, Header[] headers, String queryString, String body) {
21+
public Request(Method method, String pathString, Header[] headers, String queryString, String body) {
2122
this.method = method;
2223
this.pathString = pathString;
2324
this.headers = headers;
2425
this.queryString = queryString;
2526
this.body = body;
2627
}
2728

28-
public String getMethodString() {
29+
public Method getMethod() {
2930
return method;
3031
}
3132

src/main/java/httpserver/request/RequestParser.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import httpserver.AppConfig;
44
import httpserver.Logger;
5+
import httpserver.Method;
56
import httpserver.header.Header;
67

78
import java.io.*;
@@ -17,16 +18,24 @@ public RequestParser(AppConfig appConfig) {
1718
this.contentLength = 0;
1819
}
1920

20-
public Request parse(InputStream inputStream) throws IOException {
21+
public Request parse(InputStream inputStream)
22+
throws IOException, IllegalArgumentException {
2123
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
2224

2325
RequestLine requestLine = getRequestLine(bufferedReader);
2426

27+
Method method;
28+
try {
29+
method = requestLine.getMethod();
30+
} catch (IllegalArgumentException e) {
31+
throw new IllegalArgumentException();
32+
}
33+
2534
Header[] headers = getHeaders(bufferedReader);
2635

2736
String body = getBody(bufferedReader);
2837

29-
return new Request(requestLine.getMethod(),
38+
return new Request(method,
3039
requestLine.getPath(),
3140
headers,
3241
requestLine.getQueryString(),
@@ -44,8 +53,8 @@ private class RequestLine {
4453
private final String path;
4554
private final String queryString;
4655

47-
private String getMethod() {
48-
return method;
56+
private Method getMethod() throws IllegalArgumentException {
57+
return Method.valueOf(method);
4958
}
5059

5160
private String getPath() {

0 commit comments

Comments
 (0)