Клиент Apache Http выполняет запрос без отправки включающего объекта
У меня есть такой сценарий:
1) Клиент отправляет HTTP-запрос с закрывающей сущностью на сервер через сокет.
2) Сервер выгружает закрывающий объект в другое место, назовем его Хранилище.
От меня требуется реализовать только Сервер.
До сих пор мне удалось реализовать его с помощью библиотеки компонентов HTTP Apache, используя что-то вроде:
// The request from the client
org.apache.http.HttpRequest request = ...;
// The org.apache.http.entity.InputStreamEntity will
// read bytes from the socket and write to the Storage
HttpEntity entity = new InputStreamEntity(...)
BasicHttpEntityEnclosingRequest requestToStorage = new ......
requestToStorage.setEntity(entity);
CloseableHttpClient httpClient = ...
CloseableHttpResponse response = httpClient.execute(target, requestToStorage );
Все идет нормально. Проблема в том, что сервер хранения требует аутентификации. Когда Сервер делает первый запрос (через Apache Http Client API), Хранилище отвечает запросом 407 Authentication Required. Клиент Apache Http выполняет первоначальное рукопожатие, а затем повторно отправляет запрос, но теперь нет никакой сущности, поскольку она уже была использована для первого запроса.
Одно из решений - кэшировать объект от клиента, но он может быть очень большим, более 1 ГБ.
Вопрос: Есть ли лучшее решение, например, предварительная отправка только заголовков запроса?
1 ответ
Использовать expect-continue
рукопожатие.
CloseableHttpClient client = HttpClients.custom()
.setDefaultRequestConfig(
RequestConfig.custom()
.setExpectContinueEnabled(true)
.build())
.build();