Skip to content

Commit f19f849

Browse files
committed
Change ReponseWriter to log the exception if writing to the OutputStream (of a socket in the real app) throws an IOException
1 parent 67fbb15 commit f19f849

File tree

7 files changed

+32
-13
lines changed

7 files changed

+32
-13
lines changed

src/main/java/httpserver/App.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public static void main(String[] args) throws IOException {
1616
PathExaminer pathExaminer = new PathExaminer();
1717
Path root = pathExaminer.getPath(fileDirectory);
1818
Path logPath = pathExaminer.concatenate(root,"logs");
19-
AppConfig appConfig = new AppConfig(root, new Logger(logPath, new FileOperator(), System.out));
19+
AppConfig appConfig = new AppConfig(root, new Logger(logPath, new FileOperator(), System.err));
2020

2121
ServerFactory serverFactory = new ServerFactory(new ServerSocketFactory(), appConfig);
2222
SocketHandlerFactory socketHandlerFactory = new SocketHandlerFactory();

src/main/java/httpserver/Logger.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
public class Logger {
1010
private final FileOperator fileOperator;
1111
private final Path logPath;
12-
private final PrintStream printStream;
12+
private final PrintStream errorStream;
1313

14-
public Logger(Path logPath, FileOperator fileOperator, PrintStream printStream) throws IOException {
14+
public Logger(Path logPath, FileOperator fileOperator, PrintStream errorStream) throws IOException {
1515
this.fileOperator = fileOperator;
1616
this.logPath = logPath;
17-
this.printStream = printStream;
17+
this.errorStream = errorStream;
1818
createFileIfDoesntExist(logPath);
1919
}
2020

@@ -23,7 +23,7 @@ public void log(String logString) {
2323
try {
2424
fileOperator.appendToFile(logPath, logBytes);
2525
} catch (IOException e) {
26-
printStream.print(e);
26+
errorStream.print(e);
2727
}
2828
}
2929

src/main/java/httpserver/ResponseWriter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
public class ResponseWriter {
1212
private final HashMap<Integer, String> statuses;
1313
private final OutputStream outputStream;
14+
private final Logger logger;
1415

15-
public ResponseWriter(OutputStream outputStream) {
16+
public ResponseWriter(OutputStream outputStream, Logger logger) {
1617
this.outputStream = outputStream;
18+
this.logger = logger;
1719
this.statuses = new HashMap<>();
1820
statuses.put(200, "OK");
1921
statuses.put(204, "No Content");
@@ -35,7 +37,7 @@ public void write(Response response) {
3537
writeEmptyLine();
3638
writePayload(response);
3739
} catch (IOException e) {
38-
System.out.println("Error while writing to output stream.");
40+
logger.log(e.toString());
3941
}
4042
}
4143

src/main/java/httpserver/SocketHandlerFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ public SocketHandler newSocketHandler(AppConfig appConfig, Socket clientSocket)
1414
clientSocket.getInputStream(),
1515
new RequestParser(appConfig),
1616
new Responder(new MethodResponderSupplierFactory().makeResponderSupplier()),
17-
new ResponseWriter(clientSocket.getOutputStream()));
17+
new ResponseWriter(clientSocket.getOutputStream(), appConfig.getLogger()));
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),
2424
new Responder(new MethodResponderSupplierFactory().makeResponderSupplier()),
25-
new ResponseWriter(outputStream));
25+
new ResponseWriter(outputStream, appConfig.getLogger()));
2626
}
2727
}

src/test/java/httpserver/LoggerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void writesToLogAndReadsFromLog() throws Exception {
4949
}
5050

5151
@Test
52-
public void printsErrorToStdoutIfCantWriteToLog() throws Exception {
52+
public void printsErrorToStdErrIfCantWriteToLog() throws Exception {
5353
FileOperator fileOperatorMock = mock(FileOperator.class);
5454
doThrow(new IOException()).when(fileOperatorMock).appendToFile(any(), any());
5555
Logger logger = new Logger(logPath, fileOperatorMock, printStreamMock);

src/test/java/httpserver/ResponseWriterTest.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,21 @@
99

1010
import java.io.ByteArrayOutputStream;
1111
import java.io.IOException;
12+
import java.io.OutputStream;
13+
import java.io.PrintStream;
1214

1315
import static org.junit.Assert.*;
16+
import static org.mockito.Mockito.*;
1417

1518
public class ResponseWriterTest {
1619
private final ResponseWriter responseWriter;
1720
private final ByteArrayOutputStream outputStream;
21+
private final Logger logger;
1822

1923
public ResponseWriterTest() {
20-
this.outputStream = new ByteArrayOutputStream();
21-
this.responseWriter = new ResponseWriter(outputStream);
24+
outputStream = new ByteArrayOutputStream();
25+
logger = mock(Logger.class);
26+
responseWriter = new ResponseWriter(outputStream, logger);
2227
}
2328

2429
@Test
@@ -44,6 +49,18 @@ public void writesResponseHeaders() throws Exception {
4449
assertTrue(output.contains("Content-Length: 7"));
4550
}
4651

52+
@Test
53+
public void logsExceptionIfWritingThrowsException() throws Exception {
54+
OutputStream outputStreamMock = mock(OutputStream.class);
55+
doThrow(new IOException()).when(outputStreamMock).write(any());
56+
ResponseWriter responseWriter = new ResponseWriter(outputStreamMock, logger);
57+
Response response = new OkResponse("example".getBytes());
58+
59+
responseWriter.write(response);
60+
61+
verify(logger).log(any());
62+
}
63+
4764
@Test
4865
public void itWritesTheFirstLineFor404() throws Exception {
4966
String output = outputForResponse(new NotFoundResponse());

src/test/java/httpserver/SocketHandlerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class SocketHandlerTest {
3535

3636
public SocketHandlerTest() throws IOException {
3737
root = tempDir();
38-
logger = new Logger(root.resolve("logs"), new FileOperator(), System.out);
38+
logger = new Logger(root.resolve("logs"), new FileOperator(), System.err);
3939
appConfig = new AppConfig(root, logger);
4040
relativePath1 = root.relativize(tempFileOptions(root, "aaa", "temp"));
4141
relativePath2 = root.relativize(tempFileOptions(root, "bbb", "temp"));

0 commit comments

Comments
 (0)