From bc87b09179c21d886f668f74f8eb26535868718b Mon Sep 17 00:00:00 2001 From: Devlin Glasman Date: Thu, 20 Sep 2018 13:49:19 +0100 Subject: [PATCH 1/6] Removes '.idea' files from git tracking. --- .idea/misc.xml | 7 ------- .idea/vcs.xml | 6 ------ 2 files changed, 13 deletions(-) delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index bc8d0a3..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 8cf8e119a6edab3a9c52a3b4e1f233c17eb2fad0 Mon Sep 17 00:00:00 2001 From: Devlin Glasman Date: Thu, 20 Sep 2018 14:05:46 +0100 Subject: [PATCH 2/6] Makes default port internal to ProgramArgParser. --- .gitignore | 1 + src/main/java/http/Main.java | 3 +-- src/main/java/http/util/ProgramArgParser.java | 5 ++--- src/test/java/http/util/ProgramArgParserTest.java | 12 ++++-------- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 8d6fe30..0b51775 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff +.idea/* .idea/**/workspace.xml .idea/**/tasks.xml .idea/**/usage.statistics.xml diff --git a/src/main/java/http/Main.java b/src/main/java/http/Main.java index 2970791..d9cd5e0 100644 --- a/src/main/java/http/Main.java +++ b/src/main/java/http/Main.java @@ -13,8 +13,7 @@ public class Main { public static void main(String[] args) throws IOException { - int defaultPort = 5000; - ProgramArgParser programArgParser = new ProgramArgParser(args, defaultPort); + ProgramArgParser programArgParser = new ProgramArgParser(args); Logger logger = new Logger(); RequestRouter requestRouter = new RequestRouter(programArgParser.getRootPath(), logger); diff --git a/src/main/java/http/util/ProgramArgParser.java b/src/main/java/http/util/ProgramArgParser.java index 05b1501..aae4261 100644 --- a/src/main/java/http/util/ProgramArgParser.java +++ b/src/main/java/http/util/ProgramArgParser.java @@ -11,12 +11,11 @@ public class ProgramArgParser { private final String portSignifier = "-p"; private final String dirSignifier = "-d"; private HashMap programParameters; - private int defaultPort; + private int defaultPort = 5000; - public ProgramArgParser(String[] programArgs, int defaultPort) { + public ProgramArgParser(String[] programArgs) { addSignifiers(Arrays.asList(portSignifier, dirSignifier)); programParameters = new HashMap<>(); - this.defaultPort = defaultPort; parse(programArgs); } diff --git a/src/test/java/http/util/ProgramArgParserTest.java b/src/test/java/http/util/ProgramArgParserTest.java index 0f80bde..e1682ad 100644 --- a/src/test/java/http/util/ProgramArgParserTest.java +++ b/src/test/java/http/util/ProgramArgParserTest.java @@ -12,8 +12,7 @@ public void givenPortNumberArg_setPort() { int port = Integer.parseInt(portArg); String[] programArgs = {"-p", portArg}; - int defaultPort = 5000; - ProgramArgParser programArgParser = new ProgramArgParser(programArgs, defaultPort); + ProgramArgParser programArgParser = new ProgramArgParser(programArgs); assertEquals(port, programArgParser.getPort()); } @@ -23,8 +22,7 @@ public void givenDirArg_setRootDir() { String dirArg = "src/test/resources/"; String[] programArgs = {"-d", dirArg}; - int defaultPort = 5000; - ProgramArgParser programArgParser = new ProgramArgParser(programArgs, defaultPort); + ProgramArgParser programArgParser = new ProgramArgParser(programArgs); assertEquals(dirArg, programArgParser.getRootPath()); } @@ -36,8 +34,7 @@ public void givenPortAndDirArgs_setBoth() { String dirArg = "src/test/resources/"; String[] programArgs = {"-p", portArg, "-d", dirArg}; - int defaultPort = 5000; - ProgramArgParser programArgParser = new ProgramArgParser(programArgs, defaultPort); + ProgramArgParser programArgParser = new ProgramArgParser(programArgs); assertEquals(port, programArgParser.getPort()); assertEquals(dirArg, programArgParser.getRootPath()); @@ -46,8 +43,7 @@ public void givenPortAndDirArgs_setBoth() { @Test public void givenNoPort_setDefault() { String[] programArgs = {}; - int defaultPort = 5000; - ProgramArgParser programArgParser = new ProgramArgParser(programArgs, defaultPort); + ProgramArgParser programArgParser = new ProgramArgParser(programArgs); assertEquals(5000, programArgParser.getPort()); } From 922d4962cb1b32b566882557fada808b3049abc4 Mon Sep 17 00:00:00 2001 From: Devlin Glasman Date: Thu, 20 Sep 2018 14:11:56 +0100 Subject: [PATCH 3/6] Refactors programargparser tests. --- .../java/http/util/ProgramArgParserTest.java | 30 +++---------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/src/test/java/http/util/ProgramArgParserTest.java b/src/test/java/http/util/ProgramArgParserTest.java index e1682ad..91e7537 100644 --- a/src/test/java/http/util/ProgramArgParserTest.java +++ b/src/test/java/http/util/ProgramArgParserTest.java @@ -6,44 +6,22 @@ public class ProgramArgParserTest { - @Test - public void givenPortNumberArg_setPort() { - String portArg = "5000"; - int port = Integer.parseInt(portArg); - String[] programArgs = {"-p", portArg}; - - ProgramArgParser programArgParser = new ProgramArgParser(programArgs); - - assertEquals(port, programArgParser.getPort()); - } - - @Test - public void givenDirArg_setRootDir() { - String dirArg = "src/test/resources/"; - String[] programArgs = {"-d", dirArg}; - - ProgramArgParser programArgParser = new ProgramArgParser(programArgs); - - assertEquals(dirArg, programArgParser.getRootPath()); - } - @Test public void givenPortAndDirArgs_setBoth() { String portArg = "5000"; - int port = Integer.parseInt(portArg); String dirArg = "src/test/resources/"; String[] programArgs = {"-p", portArg, "-d", dirArg}; ProgramArgParser programArgParser = new ProgramArgParser(programArgs); - assertEquals(port, programArgParser.getPort()); + assertEquals(Integer.parseInt(portArg), programArgParser.getPort()); assertEquals(dirArg, programArgParser.getRootPath()); } @Test - public void givenNoPort_setDefault() { - String[] programArgs = {}; - ProgramArgParser programArgParser = new ProgramArgParser(programArgs); + public void givenNoPort_defaultExists() { + String[] emptyArgs = {}; + ProgramArgParser programArgParser = new ProgramArgParser(emptyArgs); assertEquals(5000, programArgParser.getPort()); } From 1ffd5363d604dc57d60a8763cecbb73e854620a8 Mon Sep 17 00:00:00 2001 From: Devlin Glasman Date: Thu, 20 Sep 2018 16:35:47 +0100 Subject: [PATCH 4/6] Some edits. --- .../java/http/Response/ResponseStatus.java | 2 +- .../java/http/server/ConnectionManager.java | 10 +++-- src/main/java/http/util/ContentType.java | 2 +- .../java/http/server/ResponseWriterTest.java | 44 +------------------ 4 files changed, 9 insertions(+), 49 deletions(-) diff --git a/src/main/java/http/Response/ResponseStatus.java b/src/main/java/http/Response/ResponseStatus.java index 50ac084..3b3a424 100644 --- a/src/main/java/http/Response/ResponseStatus.java +++ b/src/main/java/http/Response/ResponseStatus.java @@ -27,7 +27,7 @@ public byte[] getPhrase() { return phrase.getBytes(); } - public String getPhraseAsS() { + public String getPhraseAsString() { return phrase; } diff --git a/src/main/java/http/server/ConnectionManager.java b/src/main/java/http/server/ConnectionManager.java index 84d680a..620deb3 100644 --- a/src/main/java/http/server/ConnectionManager.java +++ b/src/main/java/http/server/ConnectionManager.java @@ -12,26 +12,28 @@ public class ConnectionManager { private RequestParser requestParser; - private ResponseWriter responseWriter; + private ResponseStringConstructor responseStringConstructor; private RequestRouter requestRouter; private Logger logger; + private ResponseWriter responseWriter; public ConnectionManager(RequestRouter requestRouter, Logger logger) { this.requestRouter = requestRouter; this.logger = logger; requestParser = new RequestParser(); + responseStringConstructor = new ResponseStringConstructor(); responseWriter = new ResponseWriter(); } public void respondTo(Socket clientConnection) throws IOException { - responseWriter.write(getReponse(clientConnection), clientConnection.getOutputStream()); + responseWriter.writeToSocket(getReponseAsString(clientConnection), clientConnection.getOutputStream()); clientConnection.close(); } - private Response getReponse(Socket clientConnection) throws IOException { + private String getReponseAsString(Socket clientConnection) throws IOException { Request request = getRequest(clientConnection); writeToLog(request); - return requestRouter.handle(request); + return responseStringConstructor.construct(requestRouter.handle(request)); } private Request getRequest(Socket clientConnection) throws IOException { diff --git a/src/main/java/http/util/ContentType.java b/src/main/java/http/util/ContentType.java index 98e7310..cdb83a1 100644 --- a/src/main/java/http/util/ContentType.java +++ b/src/main/java/http/util/ContentType.java @@ -18,7 +18,7 @@ public byte[] getBytesValue() { return contentTypeString.getBytes(); } - public String getValueAsS() { + public String getValueAsString() { return contentTypeString; } } diff --git a/src/test/java/http/server/ResponseWriterTest.java b/src/test/java/http/server/ResponseWriterTest.java index ffb17de..337232d 100644 --- a/src/test/java/http/server/ResponseWriterTest.java +++ b/src/test/java/http/server/ResponseWriterTest.java @@ -1,46 +1,4 @@ package http.server; -import http.Response.Response; -import http.Response.ResponseStatus; -import http.util.ContentType; -import http.util.IOHelper; -import org.junit.Test; - -import java.io.IOException; - -import static junit.framework.TestCase.assertEquals; - public class ResponseWriterTest { - - @Test - public void buildsResponse_simpleGET_NoHeaders() throws IOException { - ResponseStatus exampleStatus = ResponseStatus.OK; - ContentType exampleContentType = ContentType.TXT; - String exampleContents = "file1 contents"; - - Response mockResponse = makeResponse(exampleStatus, - exampleContentType, exampleContents.getBytes()); - IOHelper clientIO = new IOHelper(""); - - String expectedResponse = makeExpectedR(exampleStatus, - exampleContentType, exampleContents); - - ResponseWriter responseWriter = new ResponseWriter(); - responseWriter.write(mockResponse, clientIO.getOut()); - - assertEquals(expectedResponse, clientIO.getStringOutput()); - } - - private Response makeResponse(ResponseStatus status, ContentType contentType, byte[] bodyContents) { - Response mockResponse = new Response(); - mockResponse.setStatus(status); - mockResponse.setContentTypeHeader(contentType); - mockResponse.setBodyContent(bodyContents); - return mockResponse; - } - - private String makeExpectedR(ResponseStatus status, ContentType contentType, String bodyContents) { - return ("HTTP/1.1" + " " + status.getPhraseAsS() + "\r\n" + "Content-Type: " - + contentType.getValueAsS() + "\r\n\r\n" + bodyContents); - } -} \ No newline at end of file +} From 429d090953882e745b335f622b8ebbb1ea06255d Mon Sep 17 00:00:00 2001 From: Devlin Glasman Date: Thu, 20 Sep 2018 16:56:20 +0100 Subject: [PATCH 5/6] Adds ResponseWriter and ResponseConstructor. --- .../java/http/server/ConnectionManager.java | 11 +++--- .../java/http/server/ResponseConstructor.java | 30 ++++++++++++++++ src/main/java/http/server/ResponseWriter.java | 26 +------------- .../http/server/ResponseConstructorTest.java | 34 +++++++++++++++++++ .../java/http/server/ResponseWriterTest.java | 4 --- 5 files changed, 70 insertions(+), 35 deletions(-) create mode 100644 src/main/java/http/server/ResponseConstructor.java create mode 100644 src/test/java/http/server/ResponseConstructorTest.java delete mode 100644 src/test/java/http/server/ResponseWriterTest.java diff --git a/src/main/java/http/server/ConnectionManager.java b/src/main/java/http/server/ConnectionManager.java index 620deb3..00ba47e 100644 --- a/src/main/java/http/server/ConnectionManager.java +++ b/src/main/java/http/server/ConnectionManager.java @@ -3,7 +3,6 @@ import http.Handlers.RequestRouter; import http.Request.Request; import http.Request.RequestParser; -import http.Response.Response; import http.util.Logger; import java.io.IOException; @@ -12,7 +11,7 @@ public class ConnectionManager { private RequestParser requestParser; - private ResponseStringConstructor responseStringConstructor; + private ResponseConstructor responseConstructor; private RequestRouter requestRouter; private Logger logger; private ResponseWriter responseWriter; @@ -21,19 +20,19 @@ public ConnectionManager(RequestRouter requestRouter, Logger logger) { this.requestRouter = requestRouter; this.logger = logger; requestParser = new RequestParser(); - responseStringConstructor = new ResponseStringConstructor(); + responseConstructor = new ResponseConstructor(); responseWriter = new ResponseWriter(); } public void respondTo(Socket clientConnection) throws IOException { - responseWriter.writeToSocket(getReponseAsString(clientConnection), clientConnection.getOutputStream()); + responseWriter.writeToSocket(getResponse(clientConnection), clientConnection.getOutputStream()); clientConnection.close(); } - private String getReponseAsString(Socket clientConnection) throws IOException { + private byte[] getResponse(Socket clientConnection) throws IOException { Request request = getRequest(clientConnection); writeToLog(request); - return responseStringConstructor.construct(requestRouter.handle(request)); + return responseConstructor.construct(requestRouter.handle(request)); } private Request getRequest(Socket clientConnection) throws IOException { diff --git a/src/main/java/http/server/ResponseConstructor.java b/src/main/java/http/server/ResponseConstructor.java new file mode 100644 index 0000000..5397d99 --- /dev/null +++ b/src/main/java/http/server/ResponseConstructor.java @@ -0,0 +1,30 @@ +package http.server; + +import http.Response.Response; +import http.Response.ResponseHeader; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Map; + +public class ResponseConstructor { + + public byte[] construct(Response response) throws IOException { + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + responseStream.write(response.getHttpVersion()); + responseStream.write(" ".getBytes()); + responseStream.write(response.getStatus().getPhrase()); + responseStream.write("\r\n".getBytes()); + + for (Map.Entry entry : response.getHeaders().entrySet()) { + responseStream.write(entry.getKey().getLabel()); + responseStream.write(": ".getBytes()); + responseStream.write(entry.getValue()); + responseStream.write("\r\n".getBytes()); + } + + responseStream.write("\r\n".getBytes()); + responseStream.write(response.getBodyContent()); + return responseStream.toByteArray(); + } +} diff --git a/src/main/java/http/server/ResponseWriter.java b/src/main/java/http/server/ResponseWriter.java index b3fe67c..7e9c7da 100644 --- a/src/main/java/http/server/ResponseWriter.java +++ b/src/main/java/http/server/ResponseWriter.java @@ -1,35 +1,11 @@ package http.server; -import http.Response.Response; -import http.Response.ResponseHeader; - -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; -import java.util.Map; public class ResponseWriter { - public void write(Response response, OutputStream clientResponseOutput) throws IOException { - ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); - responseStream.write(response.getHttpVersion()); - responseStream.write(" ".getBytes()); - responseStream.write(response.getStatus().getPhrase()); - responseStream.write("\r\n".getBytes()); - - for (Map.Entry entry : response.getHeaders().entrySet()) { - responseStream.write(entry.getKey().getLabel()); - responseStream.write(": ".getBytes()); - responseStream.write(entry.getValue()); - responseStream.write("\r\n".getBytes()); - } - - responseStream.write("\r\n".getBytes()); - responseStream.write(response.getBodyContent()); - writeToSocket(responseStream.toByteArray(), clientResponseOutput); - } - - private void writeToSocket(byte[] response, OutputStream clientResponseOutput) throws IOException { + public void writeToSocket(byte[] response, OutputStream clientResponseOutput) throws IOException { clientResponseOutput.write(response); } } diff --git a/src/test/java/http/server/ResponseConstructorTest.java b/src/test/java/http/server/ResponseConstructorTest.java new file mode 100644 index 0000000..c6fe27b --- /dev/null +++ b/src/test/java/http/server/ResponseConstructorTest.java @@ -0,0 +1,34 @@ +package http.server; + +import http.Response.Response; +import http.Response.ResponseStatus; +import http.util.ContentType; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertArrayEquals; + +public class ResponseConstructorTest { + + @Test + public void constructsResponse() throws IOException { + ResponseStatus exampleStatus = ResponseStatus.OK; + ContentType exampleContentType = ContentType.TXT; + String exampleContents = "any contents"; + + Response mockResponse = new Response(); + mockResponse.setStatus(exampleStatus); + mockResponse.setContentTypeHeader(exampleContentType); + mockResponse.setBodyContent(exampleContents.getBytes()); + + String expectedResponse = ("HTTP/1.1" + " " + exampleStatus.getPhraseAsString() + + "\r\n" + "Content-Type: " + exampleContentType.getValueAsString() + + "\r\n\r\n" + exampleContents); + + ResponseConstructor responseConstructor = new ResponseConstructor(); + byte[] actualResponse = responseConstructor.construct(mockResponse); + + assertArrayEquals(expectedResponse.getBytes(), actualResponse); + } +} \ No newline at end of file diff --git a/src/test/java/http/server/ResponseWriterTest.java b/src/test/java/http/server/ResponseWriterTest.java deleted file mode 100644 index 337232d..0000000 --- a/src/test/java/http/server/ResponseWriterTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package http.server; - -public class ResponseWriterTest { -} From 4dbf94e7d888953f0d255730080762fff4ee63c1 Mon Sep 17 00:00:00 2001 From: Devlin Glasman Date: Thu, 20 Sep 2018 17:04:34 +0100 Subject: [PATCH 6/6] Minor edits. --- src/test/java/http/Handlers/PatchHandlerTest.java | 6 +++--- src/test/java/http/Handlers/PutHandlerTest.java | 6 +++--- src/test/java/http/util/FileContentConverterTest.java | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/test/java/http/Handlers/PatchHandlerTest.java b/src/test/java/http/Handlers/PatchHandlerTest.java index e0f34c1..b9a827a 100644 --- a/src/test/java/http/Handlers/PatchHandlerTest.java +++ b/src/test/java/http/Handlers/PatchHandlerTest.java @@ -41,7 +41,7 @@ public void givenPatchRequestWithNoEtag_setPreconditionFailedResponse() throws I @Test public void givenPathRequestWithCorrectEtag_patchFileAndSetNoContentResponse() throws NoSuchAlgorithmException, IOException { - overwriteDataToFile("some stuff".getBytes(), fullTestPath); + overwriteDataToFile("some stuff".getBytes()); String SHAData = createSHA1(); HashMap ETagHeader = new HashMap<>(); @@ -55,8 +55,8 @@ public void givenPathRequestWithCorrectEtag_patchFileAndSetNoContentResponse() t assertArrayEquals("patched content".getBytes(), fileContentConverter.getFullContents(testPatchFile)); } - private void overwriteDataToFile(byte[] content, String path) throws IOException { - Files.write(Paths.get(path), content); + private void overwriteDataToFile(byte[] content) throws IOException { + Files.write(Paths.get("src/test/resources/testPatchFile.txt"), content); } private String createSHA1() throws NoSuchAlgorithmException, IOException { diff --git a/src/test/java/http/Handlers/PutHandlerTest.java b/src/test/java/http/Handlers/PutHandlerTest.java index 2e9c726..e6ceed1 100644 --- a/src/test/java/http/Handlers/PutHandlerTest.java +++ b/src/test/java/http/Handlers/PutHandlerTest.java @@ -37,7 +37,7 @@ public void givenPutRequestForNonExistentFile_createFileAndSetCreatedResponse() @Test public void givenPutRequestForExistingFile_updateFileAndSetOKResponse() throws IOException { - overwriteDataToFile("some words".getBytes(), fullTestPath); + overwriteDataToFile("some words".getBytes()); String updatedContents = "Updated text"; Request request = new Request(HTTPVerb.PUT, resourcePath, emptyHeaders, updatedContents); @@ -54,7 +54,7 @@ private void deleteTestFileIfExists() throws IOException { } } - private void overwriteDataToFile(byte[] content, String path) throws IOException { - Files.write(Paths.get(path), content); + private void overwriteDataToFile(byte[] content) throws IOException { + Files.write(Paths.get("src/test/resources/newFile.txt"), content); } } \ No newline at end of file diff --git a/src/test/java/http/util/FileContentConverterTest.java b/src/test/java/http/util/FileContentConverterTest.java index 4118602..fe8b384 100644 --- a/src/test/java/http/util/FileContentConverterTest.java +++ b/src/test/java/http/util/FileContentConverterTest.java @@ -1,5 +1,6 @@ package http.util; +import http.server.ResponseWriter; import org.junit.Test; import java.io.File;