1package dev.rafex.ether.http.jetty12.response;
31import java.time.Clock;
32import java.util.Objects;
34import org.eclipse.jetty.server.Response;
35import org.eclipse.jetty.util.Callback;
37import dev.rafex.ether.http.core.HttpError;
38import dev.rafex.ether.http.problem.model.ProblemDetails;
39import dev.rafex.ether.json.JsonCodec;
44 private final Clock clock;
47 this(jsonCodec, Clock.systemUTC());
52 this.clock = Objects.requireNonNull(clock);
56 error(
response, callback, 404,
"not_found",
null,
"resource not found",
null);
59 public void notFound(
final Response
response,
final Callback callback,
final String path) {
60 error(
response, callback, 404,
"not_found",
null,
"resource not found", path);
64 error(
response, callback, 400,
"bad_request",
"bad_request", message,
null);
68 error(
response, callback, 401,
"unauthorized", code,
null,
null);
71 public void forbidden(
final Response
response,
final Callback callback,
final String code) {
72 error(
response, callback, 403,
"forbidden", code,
null,
null);
76 error(
response, callback, 500,
"internal_server_error",
"internal_error", message,
null);
79 public void error(
final Response
response,
final Callback callback,
final HttpError mapped) {
83 public void error(
final Response
response,
final Callback callback,
final HttpError mapped,
final String path) {
88 error(
response, callback, mapped.status(), mapped.code(),
null, mapped.message(), path);
91 public void error(
final Response
response,
final Callback callback,
final int status,
final String
error,
96 public void error(
final Response
response,
final Callback callback,
final int status,
final String
error,
97 final String code,
final String message) {
101 public void error(
final Response
response,
final Callback callback,
final int status,
final String
error,
102 final String code,
final String message,
final String path) {
114 private static String normalizeError(
final String
error) {
121 private ProblemDetails toProblem(
final int status,
final String
error,
final String code,
final String message,
123 final var normalizedError = normalizeError(
error);
124 final var title = toTitle(normalizedError);
125 final var builder = ProblemDetails.builder().type(URI.create(
"https://rafex.dev/problems/" + normalizedError))
126 .title(title).status(status).detail(message ==
null || message.isBlank() ? title : message)
127 .property(
"error", normalizedError).property(
"timestamp", clock.instant().toString());
128 if (code !=
null && !code.isBlank()) {
129 builder.property(
"code", code);
131 if (path !=
null && !path.isBlank()) {
132 builder.instance(URI.create(path));
133 builder.property(
"path", path);
135 return builder.build();
138 private static String toTitle(
final String
error) {
139 final var normalized = normalizeError(
error).replace(
'_',
' ').trim();
140 if (normalized.isEmpty()) {
143 final var parts = normalized.split(
"\\s+");
144 final var title =
new StringBuilder();
145 for (
final var part : parts) {
146 if (part.isEmpty()) {
149 if (!title.isEmpty()) {
152 title.append(Character.toUpperCase(part.charAt(0)));
153 if (part.length() > 1) {
154 title.append(part.substring(1));
157 return title.toString();
void error(final Response response, final Callback callback, final int status, final String error, final String code)
void badRequest(final Response response, final Callback callback, final String message)
JettyApiErrorResponses(final JsonCodec jsonCodec, final Clock clock)
void unauthorized(final Response response, final Callback callback, final String code)
void notFound(final Response response, final Callback callback)
void error(final Response response, final Callback callback, final HttpError mapped)
JettyApiErrorResponses(final JsonCodec jsonCodec)
void internalServerError(final Response response, final Callback callback, final String message)
void notFound(final Response response, final Callback callback, final String path)
void error(final Response response, final Callback callback, final int status, final String error, final String code, final String message, final String path)
void problem(final Response response, final Callback callback, final ProblemDetails problem)
void error(final Response response, final Callback callback, final int status, final String error, final String code, final String message)
void error(final Response response, final Callback callback, final HttpError mapped, final String path)
void forbidden(final Response response, final Callback callback, final String code)