1package dev.rafex.ether.http.jetty12;
31import org.eclipse.jetty.server.Request;
33import dev.rafex.ether.http.security.proxy.TrustedProxyPolicy;
35final class JettyRequestIpResolver {
37 private JettyRequestIpResolver() {
40 static String resolve(
final Request request,
final TrustedProxyPolicy policy) {
41 final var remoteAddress = Request.getRemoteAddr(request);
42 if (policy ==
null || !policy.trustForwardedHeader() || !policy.isTrusted(remoteAddress)) {
46 if (policy.forwardedOnly()) {
47 final var forwarded = request.getHeaders().get(
"Forwarded");
48 final var forwardedFor = resolveForwarded(forwarded, policy.preferRightMostForwardedFor());
49 return forwardedFor ==
null ? remoteAddress : forwardedFor;
52 final var xForwardedFor = request.getHeaders().get(
"X-Forwarded-For");
53 final var forwardedFor = selectFromCsv(xForwardedFor, policy.preferRightMostForwardedFor());
54 return forwardedFor ==
null ? remoteAddress : forwardedFor;
57 private static String resolveForwarded(
final String forwarded,
final boolean preferRightMost) {
58 if (forwarded ==
null || forwarded.isBlank()) {
61 final List<String> entries = List.of(forwarded.split(
","));
62 if (entries.isEmpty()) {
65 final int start = preferRightMost ? entries.size() - 1 : 0;
66 final int step = preferRightMost ? -1 : 1;
67 for (
int i = start; i >= 0 && i < entries.size(); i += step) {
68 final var parts = entries.get(i).trim().split(
";");
69 for (
final var part : parts) {
70 final var token = part.trim();
71 if (token.regionMatches(
true, 0,
"for=", 0, 4)) {
72 return stripAddressDecorators(token.substring(4).trim());
79 private static String selectFromCsv(
final String raw,
final boolean preferRightMost) {
80 if (raw ==
null || raw.isBlank()) {
83 final var parts = raw.split(
",");
84 if (parts.length == 0) {
87 final var candidate = preferRightMost ? parts[parts.length - 1] : parts[0];
88 return stripAddressDecorators(candidate.trim());
91 private static String stripAddressDecorators(
final String value) {
92 if (value ==
null || value.isBlank()) {
95 var sanitized = value;
96 if (sanitized.startsWith(
"\"") && sanitized.endsWith(
"\"") && sanitized.length() > 1) {
97 sanitized = sanitized.substring(1, sanitized.length() - 1);