diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ProxyProtocolTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ProxyProtocolTest.java index 9c3a18b183a..69889e4bd56 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/ProxyProtocolTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ProxyProtocolTest.java @@ -30,6 +30,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.util.TypeUtil; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; @@ -57,7 +58,7 @@ public class ProxyProtocolTest } @Test - public void testProxyProtocol() throws Exception + public void testProxyProtocolV1() throws Exception { final String remoteAddr = "192.168.0.0"; final int remotePort = 12345; @@ -111,4 +112,85 @@ public class ProxyProtocolTest } } } + + @Test + public void testProxyProtocolV2() throws Exception + { + final String remoteAddr = "192.168.0.1"; + final int remotePort = 12345; + start(new AbstractHandler() + { + @Override + public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + { + if (remoteAddr.equals(request.getRemoteAddr()) && + remotePort == request.getRemotePort()) + baseRequest.setHandled(true); + } + }); + + try (Socket socket = new Socket("localhost", connector.getLocalPort())) + { + String proxy = + // Preamble + "0D0A0D0A000D0A515549540A" + + + // V2, PROXY + "21" + + + // 0x1 : AF_INET 0x1 : STREAM. Address length is 2*4 + 2*2 = 12 bytes. + "11" + + + // length of remaining header (4+4+2+2+6+3 = 21) + "0015" + + + // uint32_t src_addr; uint32_t dst_addr; uint16_t src_port; uint16_t dst_port; + "C0A80001" + + "7f000001" + + "3039" + + "1F90" + + + // NOOP value 0 + "040000" + + + // NOOP value ABCDEF + "040003ABCDEF"; + + String request1 = + "GET /1 HTTP/1.1\r\n" + + "Host: localhost\r\n" + + "\r\n"; + OutputStream output = socket.getOutputStream(); + output.write(TypeUtil.fromHexString(proxy)); + output.write(request1.getBytes(StandardCharsets.UTF_8)); + output.flush(); + + InputStream input = socket.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)); + String response1 = reader.readLine(); + assertTrue(response1.startsWith("HTTP/1.1 200 ")); + while (true) + { + if (reader.readLine().isEmpty()) + break; + } + + // Send a second request to verify that the proxied IP is retained. + String request2 = + "GET /2 HTTP/1.1\r\n" + + "Host: localhost\r\n" + + "Connection: close\r\n" + + "\r\n"; + output.write(request2.getBytes(StandardCharsets.UTF_8)); + output.flush(); + + String response2 = reader.readLine(); + assertTrue(response2.startsWith("HTTP/1.1 200 ")); + while (true) + { + if (reader.readLine() == null) + break; + } + } + } }