Skip to content

Commit 60eeda6

Browse files
committed
Add options responder
1 parent 17c8d1d commit 60eeda6

File tree

4 files changed

+91
-1
lines changed

4 files changed

+91
-1
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package httpserver;
22

33
public enum Method {
4-
GET, POST, PUT, DELETE
4+
GET, POST, PUT, DELETE, OPTIONS
55
}

src/main/java/httpserver/ResponderSupplierFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public ResponderSupplier makeResponderSupplier() {
2424
methodResponderMap.put(Method.DELETE, new DeleteResponder(
2525
new PathExaminer(),
2626
new FileOperator()));
27+
//methodResponderMap.put(Method.OPTIONS, new OptionsResponder(this));
2728
return new ResponderSupplier(methodResponderMap, new InvalidMethodResponder());
2829
}
2930

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package httpserver.responder;
2+
3+
import httpserver.AppConfig;
4+
import httpserver.Method;
5+
import httpserver.Request;
6+
import httpserver.ResponderSupplier;
7+
import httpserver.header.Header;
8+
import httpserver.response.OkResponse;
9+
import httpserver.response.Response;
10+
11+
import java.io.IOException;
12+
import java.util.StringJoiner;
13+
14+
public class OptionsResponder implements Responder {
15+
private final ResponderSupplier responderSupplier;
16+
17+
public OptionsResponder(ResponderSupplier responderSupplier) {
18+
this.responderSupplier = responderSupplier;
19+
}
20+
21+
@Override
22+
public Response respond(AppConfig appConfig, Request request) throws IOException {
23+
Method[] methods = Method.values();
24+
StringJoiner joiner = new StringJoiner(", ");
25+
for (Method method: methods) {
26+
Responder responder = responderSupplier.responderForMethodString(method.toString());
27+
if (responder.allowed(request.getPathString())) {
28+
joiner.add(method.toString());
29+
}
30+
}
31+
Response response = new OkResponse("".getBytes());
32+
response.setHeader(new Header("Allow", joiner.toString()));
33+
return response;
34+
}
35+
36+
@Override
37+
public boolean allowed(String pathString) {
38+
return true;
39+
}
40+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package httpserver.responder;
2+
3+
import httpserver.AppConfig;
4+
import httpserver.Method;
5+
import httpserver.Request;
6+
import httpserver.ResponderSupplier;
7+
import httpserver.header.Header;
8+
import httpserver.response.Response;
9+
import org.junit.Test;
10+
11+
import java.util.HashMap;
12+
import java.util.Map;
13+
14+
import static org.junit.Assert.*;
15+
import static org.mockito.Mockito.*;
16+
17+
public class OptionsResponderTest {
18+
@Test
19+
public void responderHasListOfAllowedMethodsInAllowHeader() throws Exception {
20+
Map<Method, Responder> methodResponderMapMock = new HashMap<>();
21+
Responder trueResponderMock = mock(Responder.class);
22+
when(trueResponderMock.allowed(any())).thenReturn(true);
23+
Responder falseResponderMock = mock(Responder.class);
24+
when(falseResponderMock.allowed(any())).thenReturn(false);
25+
26+
methodResponderMapMock.put(Method.GET, trueResponderMock);
27+
methodResponderMapMock.put(Method.POST, falseResponderMock);
28+
methodResponderMapMock.put(Method.PUT, trueResponderMock);
29+
methodResponderMapMock.put(Method.DELETE, falseResponderMock);
30+
methodResponderMapMock.put(Method.OPTIONS, trueResponderMock);
31+
ResponderSupplier responderSupplier = new ResponderSupplier(methodResponderMapMock,
32+
mock(InvalidMethodResponder.class));
33+
34+
Request request = new Request("OPTIONS", "", new Header[0], "");
35+
36+
OptionsResponder optionsResponder = new OptionsResponder(responderSupplier);
37+
Response response = optionsResponder.respond(mock(AppConfig.class), request);
38+
39+
assertEquals(200, response.getStatusCode());
40+
assertEquals(new Header("Allow", "GET, PUT, OPTIONS"), response.getHeaders()[0]);
41+
}
42+
43+
@Test
44+
public void formIsAllowed() throws Exception {
45+
OptionsResponder optionsResponder = new OptionsResponder(null);
46+
assertTrue(optionsResponder.allowed("/form"));
47+
assertTrue(optionsResponder.allowed("anything"));
48+
}
49+
}

0 commit comments

Comments
 (0)