Skip to content

Commit 4c41988

Browse files
committed
Further simplifies StaticResourceAction by pulling out GetStaticResourceAction to handle only GET requests for resources in public directory.
1 parent 7ec83c3 commit 4c41988

6 files changed

Lines changed: 136 additions & 56 deletions

File tree

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.github.mh120888.cobspecapp;
2+
3+
import com.github.mh120888.httpmessage.HTTPHeaders;
4+
import com.github.mh120888.httpmessage.HTTPRequest;
5+
import com.github.mh120888.httpmessage.HTTPResponse;
6+
import com.github.mh120888.httpmessage.HTTPStatus;
7+
8+
public class GetStatusResourceAction extends StaticResourceAction {
9+
public GetStatusResourceAction(String filepath) {
10+
super(filepath);
11+
}
12+
13+
public GetStatusResourceAction(String filepath, FileIO fileInputOutput) {
14+
super (filepath, fileInputOutput);
15+
}
16+
17+
public HTTPResponse getResponse(HTTPRequest request, HTTPResponse response) {
18+
this.request = request;
19+
20+
if (isPartialContentRequest()) {
21+
response.setStatus(HTTPStatus.PARTIAL_CONTENT);
22+
setBodyAndHeadersForPartialContentRequest(response);
23+
} else {
24+
response.setStatus(HTTPStatus.OK);
25+
response.setBody(getBody());
26+
}
27+
28+
return response;
29+
}
30+
31+
private boolean isPartialContentRequest() {
32+
return request.containsHeader(HTTPHeaders.RANGE);
33+
}
34+
35+
private byte[] getBody() {
36+
if (isPathADirectory()) {
37+
return getBodyForDirectory();
38+
} else {
39+
return getBodyDefault();
40+
}
41+
}
42+
43+
private void setBodyAndHeadersForPartialContentRequest(HTTPResponse response) {
44+
byte[] fullBodyContents = getBody();
45+
int[] range = request.getHeaderParser().parseRangeHeader(request.getHeader(HTTPHeaders.RANGE), fullBodyContents);
46+
response.addHeader(HTTPHeaders.CONTENT_RANGE, "bytes " + range[0] + "-" + range[1] + "/" + fullBodyContents.length);
47+
response.setBody(getCorrectPortionOfFileContents(fullBodyContents, range));
48+
}
49+
50+
boolean isPathADirectory() {
51+
String filePath = publicDirectory + request.getPath();
52+
return fileIO.isDirectory(filePath);
53+
}
54+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.github.mh120888.cobspecapp;
2+
3+
import com.github.mh120888.httpmessage.HTTPRequest;
4+
import com.github.mh120888.httpmessage.HTTPResponse;
5+
6+
public class MethodNotAllowedAction implements Action {
7+
public HTTPResponse getResponse(HTTPRequest request, HTTPResponse response) {
8+
return response;
9+
}
10+
}

src/main/java/com/github/mh120888/cobspecapp/StaticResourceAction.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
import java.util.Arrays;
99

1010
public class StaticResourceAction implements Action {
11-
private static String publicDirectory;
12-
private HTTPRequest request;
11+
static String publicDirectory;
12+
HTTPRequest request;
1313
FileIO fileIO;
1414

1515
public StaticResourceAction(String filepath) {
@@ -25,10 +25,7 @@ public StaticResourceAction(String filepath, FileIO fileInputOutput) {
2525
public HTTPResponse getResponse(HTTPRequest request, HTTPResponse response) {
2626
this.request = request;
2727

28-
if (isPartialContentRequest()) {
29-
response.setStatus(HTTPStatus.PARTIAL_CONTENT);
30-
setBodyAndHeadersForPartialContentRequest(response);
31-
} else if (isAnyOtherValidRequest()) {
28+
if (isAnyOtherValidRequest()) {
3229
response.setStatus(HTTPStatus.OK);
3330
response.setBody(getBody());
3431
} else {
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.github.mh120888.cobspecapp;
2+
3+
import com.github.mh120888.basichttpmessage.BasicHTTPMessageFactory;
4+
import com.github.mh120888.httpmessage.HTTPHeaders;
5+
import com.github.mh120888.httpmessage.HTTPResponse;
6+
import com.github.mh120888.httpmessage.HTTPStatus;
7+
import com.github.mh120888.mocks.MockFileIO;
8+
import com.github.mh120888.mocks.MockHTTPRequest;
9+
import org.junit.Before;
10+
import org.junit.Test;
11+
12+
import java.io.IOException;
13+
14+
import static org.junit.Assert.*;
15+
16+
public class GetStatusResourceActionTest {
17+
public static String publicDirectory = "/Users/matthewhiggins/Desktop/cob_spec/public";
18+
GetStatusResourceAction action;
19+
20+
@Before
21+
public void setUp() throws Exception {
22+
action = new GetStatusResourceAction(publicDirectory);
23+
}
24+
25+
@Test
26+
public void getResponseDataReturnsCorrectResponseLineForGet() {
27+
HTTPResponse response = ResponseGenerator.generateResponse("GET", "/", action);
28+
29+
assertTrue(response.getFormattedResponse().contains(Integer.toString(HTTPStatus.OK)));
30+
}
31+
32+
@Test
33+
public void getIndexResponseIncludesLinksToOtherResourcesInPublic() {
34+
HTTPResponse response = ResponseGenerator.generateResponse("GET", "/", action);
35+
36+
assertTrue(response.getFormattedResponse().contains("<a href=\"/file1\">file1</a>"));
37+
}
38+
39+
@Test
40+
public void getRequestForAnExistingFileReturnsTheContentsOfThatFile() throws IOException {
41+
MockFileIO fakeFileIO = new MockFileIO("Fake contents");
42+
fakeFileIO.respondToIsDirectoryWith(false);
43+
GetStatusResourceAction action = new GetStatusResourceAction(publicDirectory, fakeFileIO);
44+
MockHTTPRequest request = new MockHTTPRequest();
45+
request.setMethod("GET");
46+
request.setPathWithParams("/fake-image.png");
47+
48+
HTTPResponse response = action.getResponse(request, new BasicHTTPMessageFactory().getNewResponse());
49+
50+
assertTrue(response.getFormattedResponse().contains("Fake contents"));
51+
}
52+
53+
@Test
54+
public void getRequestWithRangeHeadersReturnsA206Response() {
55+
MockFileIO fakeFileIO = new MockFileIO("Fake contents");
56+
fakeFileIO.respondToIsDirectoryWith(false);
57+
GetStatusResourceAction action = new GetStatusResourceAction(publicDirectory, fakeFileIO);
58+
MockHTTPRequest request = new MockHTTPRequest();
59+
request.setMethod("GET");
60+
request.setPathWithParams("/fake-image.png");
61+
request.addHeader(HTTPHeaders.RANGE, "bytes=0-4");
62+
63+
HTTPResponse response = action.getResponse(request, new BasicHTTPMessageFactory().getNewResponse());
64+
65+
assertTrue(response.getFormattedResponse().contains(Integer.toString(HTTPStatus.PARTIAL_CONTENT)));
66+
}
67+
}

src/test/java/com/github/mh120888/cobspecapp/RouterTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ public void setUp() throws Exception {
2323
}
2424

2525
@Test
26-
public void routeReturnsStaticResourceActionForAStaticResource() {
26+
public void routeReturnsGetStaticResourceActionForGETAStaticResource() {
2727
String[] fileNamesInPublicDirectory = { "fakefile" };
2828
fileIO.setFileNames(fileNamesInPublicDirectory);
2929
request.setRequestLine("GET /fakefile HTTP/1.1");
3030

3131
Action action = new Router(publicDirectory, fileIO).route(request);
3232

33-
assertTrue(action instanceof StaticResourceAction);
33+
assertTrue(action instanceof GetStatusResourceAction);
3434
}
3535

3636
@Test

src/test/java/com/github/mh120888/cobspecapp/StaticResourceActionTest.java

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
package com.github.mh120888.cobspecapp;
22

3-
import com.github.mh120888.basichttpmessage.BasicHTTPMessageFactory;
4-
import com.github.mh120888.httpmessage.HTTPHeaders;
53
import com.github.mh120888.httpmessage.HTTPResponse;
64
import com.github.mh120888.httpmessage.HTTPStatus;
7-
import com.github.mh120888.mocks.MockFileIO;
8-
import com.github.mh120888.mocks.MockHTTPRequest;
95
import org.junit.Assert;
106
import org.junit.Before;
117
import org.junit.Test;
128

13-
import java.io.IOException;
149

1510
import static org.junit.Assert.assertTrue;
1611

@@ -23,13 +18,6 @@ public void setUp() throws Exception {
2318
action = new StaticResourceAction(publicDirectory);
2419
}
2520

26-
@Test
27-
public void getResponseDataReturnsCorrectResponseLineForGet() {
28-
HTTPResponse response = ResponseGenerator.generateResponse("GET", "/", action);
29-
30-
assertTrue(response.getFormattedResponse().contains(Integer.toString(HTTPStatus.OK)));
31-
}
32-
3321
@Test
3422
public void getResponseReturns200ForHeadRequest() {
3523
HTTPResponse response = ResponseGenerator.generateResponse("HEAD", "/", action);
@@ -44,49 +32,13 @@ public void getResponseReturns405ForInvalidMethods() {
4432
assertTrue(response.getFormattedResponse().contains(Integer.toString(HTTPStatus.METHOD_NOT_ALLOWED)));
4533
}
4634

47-
@Test
48-
public void getIndexResponseIncludesLinksToOtherResourcesInPublic() {
49-
HTTPResponse response = ResponseGenerator.generateResponse("GET", "/", action);
50-
51-
assertTrue(response.getFormattedResponse().contains("<a href=\"/file1\">file1</a>"));
52-
}
53-
5435
@Test
5536
public void postRequestWithNoParamsReturnsA405() {
5637
HTTPResponse response = ResponseGenerator.generateResponse("POST", "/", action);
5738

5839
assertTrue(response.getFormattedResponse().contains(Integer.toString(HTTPStatus.METHOD_NOT_ALLOWED)));
5940
}
6041

61-
@Test
62-
public void getRequestForAnExistingFileReturnsTheContentsOfThatFile() throws IOException {
63-
MockFileIO fakeFileIO = new MockFileIO("Fake contents");
64-
fakeFileIO.respondToIsDirectoryWith(false);
65-
StaticResourceAction fakeAction = new StaticResourceAction(publicDirectory, fakeFileIO);
66-
MockHTTPRequest request = new MockHTTPRequest();
67-
request.setMethod("GET");
68-
request.setPathWithParams("/fake-image.png");
69-
70-
HTTPResponse response = fakeAction.getResponse(request, new BasicHTTPMessageFactory().getNewResponse());
71-
72-
assertTrue(response.getFormattedResponse().contains("Fake contents"));
73-
}
74-
75-
@Test
76-
public void getRequestWithRangeHeadersReturnsA206Response() {
77-
MockFileIO fakeFileIO = new MockFileIO("Fake contents");
78-
fakeFileIO.respondToIsDirectoryWith(false);
79-
StaticResourceAction action = new StaticResourceAction(publicDirectory, fakeFileIO);
80-
MockHTTPRequest request = new MockHTTPRequest();
81-
request.setMethod("GET");
82-
request.setPathWithParams("/fake-image.png");
83-
request.addHeader(HTTPHeaders.RANGE, "bytes=0-4");
84-
85-
HTTPResponse response = action.getResponse(request, new BasicHTTPMessageFactory().getNewResponse());
86-
87-
assertTrue(response.getFormattedResponse().contains(Integer.toString(HTTPStatus.PARTIAL_CONTENT)));
88-
}
89-
9042
@Test
9143
public void getCorrectPortionOfFileContentsReturnsTheCorrectPortionOfFile() {
9244
byte[] fullContents = "All of the contents".getBytes();

0 commit comments

Comments
 (0)