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/.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 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/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..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,26 +11,28 @@ public class ConnectionManager { private RequestParser requestParser; - private ResponseWriter responseWriter; + private ResponseConstructor responseConstructor; private RequestRouter requestRouter; private Logger logger; + private ResponseWriter responseWriter; public ConnectionManager(RequestRouter requestRouter, Logger logger) { this.requestRouter = requestRouter; this.logger = logger; requestParser = new RequestParser(); + responseConstructor = new ResponseConstructor(); responseWriter = new ResponseWriter(); } public void respondTo(Socket clientConnection) throws IOException { - responseWriter.write(getReponse(clientConnection), clientConnection.getOutputStream()); + responseWriter.writeToSocket(getResponse(clientConnection), clientConnection.getOutputStream()); clientConnection.close(); } - private Response getReponse(Socket clientConnection) throws IOException { + private byte[] getResponse(Socket clientConnection) throws IOException { Request request = getRequest(clientConnection); writeToLog(request); - return 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/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/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/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/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 ffb17de..0000000 --- a/src/test/java/http/server/ResponseWriterTest.java +++ /dev/null @@ -1,46 +0,0 @@ -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 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; diff --git a/src/test/java/http/util/ProgramArgParserTest.java b/src/test/java/http/util/ProgramArgParserTest.java index 0f80bde..91e7537 100644 --- a/src/test/java/http/util/ProgramArgParserTest.java +++ b/src/test/java/http/util/ProgramArgParserTest.java @@ -6,48 +6,22 @@ public class ProgramArgParserTest { - @Test - public void givenPortNumberArg_setPort() { - String portArg = "5000"; - int port = Integer.parseInt(portArg); - String[] programArgs = {"-p", portArg}; - - int defaultPort = 5000; - ProgramArgParser programArgParser = new ProgramArgParser(programArgs, defaultPort); - - assertEquals(port, programArgParser.getPort()); - } - - @Test - public void givenDirArg_setRootDir() { - String dirArg = "src/test/resources/"; - String[] programArgs = {"-d", dirArg}; - - int defaultPort = 5000; - ProgramArgParser programArgParser = new ProgramArgParser(programArgs, defaultPort); - - 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}; - int defaultPort = 5000; - ProgramArgParser programArgParser = new ProgramArgParser(programArgs, defaultPort); + 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 = {}; - int defaultPort = 5000; - ProgramArgParser programArgParser = new ProgramArgParser(programArgs, defaultPort); + public void givenNoPort_defaultExists() { + String[] emptyArgs = {}; + ProgramArgParser programArgParser = new ProgramArgParser(emptyArgs); assertEquals(5000, programArgParser.getPort()); }