forked from softeerbootcamp-7th/be-was
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathErrorExceptionHandler.java
More file actions
66 lines (55 loc) · 2.23 KB
/
ErrorExceptionHandler.java
File metadata and controls
66 lines (55 loc) · 2.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package exception.handler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import exception.ErrorCode;
import exception.ErrorException;
import exception.ExceptionHandler;
import http.HttpStatus;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class ErrorExceptionHandler implements ExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(ErrorException.class);
@Override
public boolean support(Throwable e) {
return e instanceof ErrorException;
}
@Override
public void handle(Throwable t, Socket connection) {
ErrorException error = (ErrorException) t;
logger.debug(error.getThrowable().toString());
ErrorCode errorCode = error.getErrorCode();
HttpStatus status = errorCode.getStatus();
String body = toJson(errorCode.getCode(), error.getMessage());
byte[] bodyBytes = body.getBytes(StandardCharsets.UTF_8);
StringBuilder sb = new StringBuilder();
sb.append("HTTP/1.1 ")
.append(status.getCode()).append("\r\n");
sb.append("Date: ")
.append(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now()))
.append("\r\n");
sb.append("Server: be-was\r\n");
sb.append("Connection: close\r\n");
sb.append("Content-Type: application/json; charset=utf-8\r\n");
sb.append("Content-Length: ").append(bodyBytes.length).append("\r\n");
sb.append("\r\n");
try (OutputStream out = connection.getOutputStream()) {
out.write(sb.toString().getBytes(StandardCharsets.US_ASCII));
out.write(bodyBytes);
out.flush();
} catch (IOException io) {
throw new RuntimeException(io);
}
}
private String toJson(String code, String message) {
String safeMsg = message == null ? "" : message
.replace("\\", "\\\\")
.replace("\"", "\\\"")
.replace("\n", "\\n")
.replace("\r", "\\r");
return "{\"code\":\"" + code + "\",\"message\":\"" + safeMsg + "\"}";
}
}