diff --git a/handler-proxy/src/main/java/io/netty/handler/proxy/HttpProxyHandler.java b/handler-proxy/src/main/java/io/netty/handler/proxy/HttpProxyHandler.java index 39305bd29b..278eb10316 100644 --- a/handler-proxy/src/main/java/io/netty/handler/proxy/HttpProxyHandler.java +++ b/handler-proxy/src/main/java/io/netty/handler/proxy/HttpProxyHandler.java @@ -18,11 +18,9 @@ package io.netty.handler.proxy; import static java.util.Objects.requireNonNull; -import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; -import io.netty.handler.codec.base64.Base64; import io.netty.handler.codec.http.DefaultFullHttpRequest; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.HttpClientCodec; @@ -35,16 +33,20 @@ import io.netty.handler.codec.http.HttpUtil; import io.netty.handler.codec.http.HttpVersion; import io.netty.handler.codec.http.LastHttpContent; import io.netty.util.AsciiString; -import io.netty.util.CharsetUtil; import java.net.InetSocketAddress; import java.net.SocketAddress; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Base64; public final class HttpProxyHandler extends ProxyHandler { private static final String PROTOCOL = "http"; private static final String AUTH_BASIC = "basic"; + private static final byte[] BASIC_BYTES = "Basic ".getBytes(StandardCharsets.UTF_8); + private final HttpClientCodec codec = new HttpClientCodec(); private final String username; private final String password; @@ -93,13 +95,12 @@ public final class HttpProxyHandler extends ProxyHandler { this.username = username; this.password = password; - ByteBuf authz = Unpooled.copiedBuffer(username + ':' + password, CharsetUtil.UTF_8); - ByteBuf authzBase64 = Base64.encode(authz, false); + byte[] authzBase64 = Base64.getEncoder().encode( + (username + ':' + password).getBytes(StandardCharsets.UTF_8)); + byte[] authzHeader = Arrays.copyOf(BASIC_BYTES, 6 + authzBase64.length); + System.arraycopy(authzBase64, 0, authzHeader, 6, authzBase64.length); - authorization = new AsciiString("Basic " + authzBase64.toString(CharsetUtil.US_ASCII)); - - authz.release(); - authzBase64.release(); + authorization = new AsciiString(authzHeader, /*copy=*/ false); this.outboundHeaders = headers; this.ignoreDefaultPortsInConnectHostHeader = ignoreDefaultPortsInConnectHostHeader; diff --git a/handler-proxy/src/test/java/io/netty/handler/proxy/HttpProxyServer.java b/handler-proxy/src/test/java/io/netty/handler/proxy/HttpProxyServer.java index eb216b574d..a2defa4146 100644 --- a/handler-proxy/src/test/java/io/netty/handler/proxy/HttpProxyServer.java +++ b/handler-proxy/src/test/java/io/netty/handler/proxy/HttpProxyServer.java @@ -16,13 +16,11 @@ package io.netty.handler.proxy; -import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.codec.base64.Base64; import io.netty.handler.codec.http.DefaultFullHttpResponse; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.FullHttpResponse; @@ -32,11 +30,12 @@ import io.netty.handler.codec.http.HttpObjectAggregator; import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.handler.codec.http.HttpServerCodec; import io.netty.handler.codec.http.HttpVersion; -import io.netty.util.CharsetUtil; import io.netty.util.internal.SocketUtils; import java.net.InetSocketAddress; import java.net.SocketAddress; +import java.nio.charset.StandardCharsets; +import java.util.Base64; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.*; @@ -88,15 +87,11 @@ final class HttpProxyServer extends ProxyServer { CharSequence authz = req.headers().get(HttpHeaderNames.PROXY_AUTHORIZATION); if (authz != null) { String[] authzParts = authz.toString().split(" ", 2); - ByteBuf authzBuf64 = Unpooled.copiedBuffer(authzParts[1], CharsetUtil.US_ASCII); - ByteBuf authzBuf = Base64.decode(authzBuf64); + byte[] authzCreds = Base64.getDecoder().decode(authzParts[1]); String expectedAuthz = username + ':' + password; authzSuccess = "Basic".equals(authzParts[0]) && - expectedAuthz.equals(authzBuf.toString(CharsetUtil.US_ASCII)); - - authzBuf64.release(); - authzBuf.release(); + expectedAuthz.equals(new String(authzCreds, StandardCharsets.UTF_8)); } } else { authzSuccess = true; @@ -159,7 +154,7 @@ final class HttpProxyServer extends ProxyServer { ctx.pipeline().get(HttpServerCodec.class).removeOutboundHandler(); if (sendGreeting) { - ctx.write(Unpooled.copiedBuffer("0\n", CharsetUtil.US_ASCII)); + ctx.write(Unpooled.copiedBuffer("0\n", StandardCharsets.US_ASCII)); } return true;