diff --git a/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java b/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java index 11eb688c7e..1cc4ed2f94 100644 --- a/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java +++ b/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 the original author or authors. + * Copyright 2016-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +35,7 @@ import java.util.Set; import java.util.Vector; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Collectors; import jakarta.servlet.ReadListener; @@ -403,30 +404,27 @@ private void proxy() { private void appendXForwarded(URI uri) { // Append the legacy headers if they were already added upstream - String host = headers.getFirst("x-forwarded-host"); - if (host == null) { - return; + appendXForwardedHeader("x-forwarded-host", () -> uri.getHost()); + appendXForwardedHeader("x-forwarded-proto", () -> uri.getScheme()); + } + + private void appendXForwardedHeader(String headerName, Supplier uriValue) { + String existingValue = headers.getFirst(headerName); + if (existingValue != null) { + StringBuilder builder = new StringBuilder(existingValue); + builder.append(",").append(uriValue.get()); + headers.set(headerName, builder.toString()); } - host = host + "," + uri.getHost(); - headers.set("x-forwarded-host", host); - String proto = headers.getFirst("x-forwarded-proto"); - if (proto == null) { - return; - } - proto = proto + "," + uri.getScheme(); - headers.set("x-forwarded-proto", proto); } private void appendForwarded(URI uri) { - String forwarded = headers.getFirst("forwarded"); - if (forwarded != null) { - forwarded = forwarded + ","; - } - else { - forwarded = ""; + String forwarded = headers.getFirst("forwarded"); + StringBuilder builder = new StringBuilder(); + if (StringUtils.hasText(forwarded)) { + builder.append(forwarded).append(","); } - forwarded = forwarded + forwarded(uri, webRequest.getHeader("host")); - headers.set("forwarded", forwarded); + builder.append(forwarded(uri, webRequest.getHeader("host"))); + headers.set("forwarded", builder.toString()); } private String forwarded(URI uri, String hostHeader) {