4

I need to read the internal server response in a undertow reverse proxy, but i am getting a deadlock in private String getBody(HttpServerExchange exchange)

I need to read the internal response and add a header, anyone con help me?

java.lang.IllegalStateException: UT000126: Attempted to do blocking IO from the IO thread. This is prohibited as it may result in deadlocks

public class SimpleReverseProxyClient implements ProxyClient {
    private static final ProxyTarget TARGET = new ProxyTarget() {};

    private final UndertowClient client;
    private final URI internalUri;

    public SimpleReverseProxyClient(URI internalUri) {
        this.client = UndertowClient.getInstance();
        this.internalUri = internalUri;
    }

    @Override
    public ProxyTarget findTarget(HttpServerExchange exchange) {
        return TARGET;
    }

    @Override
    public void getConnection(ProxyTarget target, HttpServerExchange exchange, ProxyCallback<ProxyConnection> callback, long timeout, TimeUnit timeUnit) {
        client.connect(
                new ConnectNotifier(callback, exchange),
                internalUri,
                exchange.getIoThread(),
                exchange.getConnection().getByteBufferPool(),
                OptionMap.EMPTY);
    }

    private final class ConnectNotifier implements ClientCallback<ClientConnection> {
        private final ProxyCallback<ProxyConnection> callback;
        private final HttpServerExchange exchange;

        private ConnectNotifier(ProxyCallback<ProxyConnection> callback, HttpServerExchange exchange) {
            this.callback = callback;
            this.exchange = exchange;
        }

        @Override
        public void completed(final ClientConnection connection) {
            final ServerConnection serverConnection = exchange.getConnection();
            serverConnection.addCloseListener(serverConnection1 -> IoUtils.safeClose(connection));
            String body = getBody(exchange);
            System.out.println(body);
            exchange.getResponseHeaders().add(new HttpString("token"), "test");
            callback.completed(exchange, new ProxyConnection(connection, "/"));
        }

        private String getBody(HttpServerExchange exchange) {
            BufferedReader reader = null;
            StringBuilder builder = new StringBuilder( );

            try {
                exchange.startBlocking( );
                reader = new BufferedReader( new InputStreamReader( exchange.getInputStream( ) ) );

                String line;
                while( ( line = reader.readLine( ) ) != null ) {
                    builder.append( line );
                }
            } catch( IOException e ) {
                e.printStackTrace( );
            } finally {
                if( reader != null ) {
                    try {
                        reader.close( );
                    } catch( IOException e ) {
                        e.printStackTrace( );
                    }
                }
            }
            String body = builder.toString( );
            return body;
        }

        @Override
        public void failed(IOException e) {
            callback.failed(exchange);
        }
    }
}


 Undertow server = Undertow.builder()
            .addHttpListener(9290, "localhost")
            .setHandler(ProxyHandler.builder()
                    .setProxyClient(new SimpleReverseProxyClient(
                            uri))
                    .build()
            ).build();
    server.start();
caeycae
  • 1,137
  • 3
  • 12
  • 28

0 Answers0