Я пытаюсь написать прокси-сервер, используя встроенный Jetty (9.4.9.v20180320). В идеале мы хотим использовать AsyncMiddlemanServlet, чтобы мы могли перехватывать контент и дополнять / заменять его, прежде чем он будет возвращен клиенту. Как это часто бывает, он работает нормально с HTTP, но я не могу добиться успеха с HTTPS.
Это прокси-сервер, который используется внутри, чтобы добавить некоторые возможности к старому серверному продукту, который обращается к внутреннему содержимому, размещенному на HTTPS. Мне нужно, чтобы серверный элемент диалога выполнял необходимый HTTPS-диалог для получения контента (что я могу сделать в простом «обычном» сервлете с использованием apache HttpClient), и мне нужно, чтобы прокси-сторона также управляла CONNECT. запрос, как это то, что мы получаем, когда старый серверный продукт запрашивает содержимое HTTPS. Конечно, в этом случае есть два разных SSL-соединения: старый серверный продукт с нашим прокси-сервером и наш прокси-сервер с контентом.
Из многих прочитанных видно, что проблема в том, что сервлеты не реализуют возможность отвечать на запрос CONNECT. Я пробовал много разных примеров, включая переопределение newHttpClient, например:
@Override
protected HttpClient newHttpClient() {
return new HttpClient(new SslContextFactory());
}
, а также реализация createHttpClient согласно « Jetty ProxyServlet с поддержкой SSL », но безрезультатно.
Самая близкая вещь, которую я нашел, это добавить connectHandler следующим образом (используя простой proxyServlet):
public static void main( String[] args )
{
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(10106);
server.addConnector(connector);
// Setup handler to handle CONNECT methods
ConnectHandler proxy = new ConnectHandler();
server.setHandler(proxy);
// Setup proxy servlet
ServletContextHandler context = new ServletContextHandler(proxy,
"/",ServletContextHandler.SESSIONS);
myProxyServlet mps = new myProxyServlet();
context.addServlet(new ServletHolder(mps), "/*");
try{
server.start();
} catch(Exception e){
System.out.println("oh dear ;-) " + e.getMessage());
}
}
Это своего рода работает в том смысле, что использование curl для вызова прокси-запроса на содержимое https возвращает содержимое, но оно не идет рядом с моим proxyServlet (или моим обычным сервлетом, когда я использую его вместо этого).
мы тестируем с curl следующим образом:
curl --insecure -x localhost:10106 /6337288/jetty-proxyservlet-s-podderzhkoi-ssl_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
Есть ли способ использовать ConnectHandler с моим сервлетом? Или простой простой сервлет, или, что лучше всего, AsyncMiddlemanServlet? Или есть лучший способ добиться того, что я пытаюсь сделать?