Из документов ,
сразу после отправки ответа 101 (протоколы переключения) сервер, как ожидается, продолжит отвечать на исходный запрос, как если бы он получил свойэквивалентно новому протоколу (т. е. сервер все еще имеет невыполненный запрос для удовлетворения после изменения протокола, и ожидается, что он сделает это без необходимости повторения запроса).
Если поле заголовка Upgradeпринимается в запросе GET, и сервер решает переключить протоколы, он сначала отвечает сообщением 101 (Switching Protocols) в HTTP / 1.1 и , а затем сразу следует, что с новым протоколом эквивалент ответа GET нацелевой ресурс . Это позволяет обновить соединение до протоколов с такой же семантикой, что и у HTTP, без затрат на задержку дополнительного обхода.
Я сделал свои перехватчики (используя OkHttp) следующим образом
public class H2cUpgradeRequestInterceptor implements Interceptor {
private static final Log logger = LogFactory.getLog(H2cUpgradeRequestInterceptor.class);
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request upgradeRequest = request.newBuilder().addHeader("Connection", "Upgrade, HTTP2-Settings")
.addHeader("Upgrade", "h2c").addHeader("HTTP2-Settings", "AAMAAABkAARAAAAAAAIAAAAA").build();
Response upgradeResponse = chain.proceed(upgradeRequest);
if (upgradeResponse != null && upgradeResponse.code() == HttpStatus.SC_SWITCHING_PROTOCOLS) {
logger.debug("Switching Protocols success"); // Success. Got 101 in reply.
}
upgradeResponse.body(); // returns null
// I am clueless on how to read the response hereafter.
// As per the docs, the 101 status code reply will be followed by a data stream. How can I access this?
return upgradeResponse;
}
}
Так что в основном, для одного запроса. Сначала я получу 101 ответ в случае успешного обновления, а затем другой ответ в соответствии с обновленным протоколом (если я правильно понял?). Есть ли способ добиться этого с OkHttp? Или любой другой клиент также будет полезен.
Спасибо!