HTTP CONNECT тунели на Java Socket в OpenJDK 25
Използвайте пътя през HTTP прокси сокет в OpenJDK 25, за да достигнете разрешена TCP услуга, като държите прокси адреса и дестинацията отделни.
Собствен TCP протокол може да преминава през HTTP прокси, когато това прокси разрешава CONNECT към дестинацията. Приложният протокол не трябва да става HTTP: HTTP установява тунела, след което приложението обменя своите байтове вътре в него.
OpenJDK 25 предоставя път през HTTP прокси в Socket(Proxy). Неговата реализация извършва CONNECT обмена и връща свързан сокет, който приложението да използва.
Proxy route = new Proxy(
Proxy.Type.HTTP,
new InetSocketAddress("proxy.example", 8080));
try (Socket socket = new Socket(route)) {
socket.setSoTimeout(10000);
socket.connect(
InetSocketAddress.createUnresolved("tcp-service.example", 8443),
5000);
InputStream input = socket.getInputStream();
OutputStream output = socket.getOutputStream();
}Този фрагмент използва класове от java.net и java.io. Заменете двата крайни адреса и извършете обмена на протокола, преди да излезете от блока try. За разрешена публична TCP цел избирайте HTTP кандидати от списъка с HTTP прокси само след като проверите разрешението за CONNECT за порта на тази цел. Прокси адресът е мястото, към което Java се свързва първо; адресът, подаден на connect, идентифицира услугата, до която проксито трябва да достигне.
Неразрешената дестинация запазва името си на хост за CONNECT заявката на тази реализация. Разрешената InetSocketAddress вместо това подава своя разрешен IP адрес към тази заявка. Тази разлика е важна, когато проксито трябва да разреши името на услугата или да приложи политика, основана на името на хоста.
Какво ви оставя успешна връзка
Получените потоци носят данните на тунелираната услуга. Те не показват отделен HTTP отговор, който приложението ви да прочете и изхвърли. Добавянето на втори CONNECT обмен би изпратило HTTP текст към услугата, след като JDK вече е установил тунела.
Примерът задава таймаут за свързване и таймаут за четене от сокета; това са отделни контроли, а не един общ краен срок за сесията на приложението.
Разрешението за CONNECT все още принадлежи на проксито. Крайна точка, която препраща обикновени уеб заявки, може да отхвърли порта на услугата или да изиска удостоверяване, преди да отвори тунел. Дръжте тези откази отделно от сървър, който приема тунела, но по-късно отхвърля приложния ви протокол.
Ако този протокол се нуждае от TLS, договорете TLS през свързания сокет с предвиденото име на хост на услугата и нормалните проверки на сертификата. Само CONNECT не шифрова потока. За истински HTTP API HTTP клиентът остава по-удобният интерфейс, защото обработва и HTTP съобщения.