Springboot/HttpServletResponse не получает фактическое тело HTTPJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Springboot/HttpServletResponse не получает фактическое тело HTTP

Сообщение Anonymous »

Я столкнулся со странной проблемой в проекте загрузки Spring, когда тело невозможно получить в контроллере.
Это немного специфично: я использую схему bc tls psk для связи с SIM-картами, и она имеет несколько лет работал без сбоев, но теперь при обмене с определенными картами/устройствами полезная нагрузка, отправленная картой, недоступна в моем контроллере.
Я использую Springboot 2.5.15, Java 8, BC jdk8on 1.78.1.
Я взял трассировку tcpdump и вижу полезную нагрузку AF 80 23 11 .. .. 00 00 (сим-карта говорит так, пожалуйста, не судите их!).
Поэтому я не могу получить эту полезную нагрузку, хотя она присутствует в как трассировке TCP, так и в заголовке длины содержимого< /strong> скажите мне, что он там.
Вот скриншот TCPDUMP:
[img]https: //i.sstatic.net/DdBTJjw4.jpg[/img]

Мой контроллер:

Код: Выделить всё

public void anyRequest(@RequestHeader(value = CONTENT_TYPE, required = false) String requestContentType,
@RequestHeader(value = HEADER_X_ADMIN_PROTOCOL) String adminProtocol,
@RequestHeader(value = HEADER_X_ADMIN_FROM) String adminFrom,
@RequestHeader(value = HEADER_X_ADMIN_RESUME, required = false, defaultValue = "false") boolean adminResume,
@RequestHeader(value = HEADER_X_ADMIN_SCRIPT_STATUS, required = false) String adminScriptStatus,
@RequestBody(required = false) byte[] body, final HttpServletRequest request,
final HttpServletResponse response) throws InterruptedException, IOException {
Обычно я получаю тело вот так:

Код: Выделить всё

Long contentLength = request.getContentLengthLong();
log.info("Request Content lenght in header: {}", contentLength);
if (body != null) {
log.info("body content {} ", Hex.encodeHexString(body));
}
И опять же, это работает в 99 % случаев. Но когда я использую конкретное устройство, этого не происходит, тело остается нулевым.
Я даже пытался получить его несколькими другими способами, но безуспешно
Попытка 1:

Код: Выделить всё

if (body == null && contentLength > 0) {

log.warn("Body seems null while Content length Header is {} ", contentLength);
log.info("Trying alternative way to retreive the body {} ", contentLength);
InputStream is = request.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[16384];
while ((nRead = is.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
body = buffer.toByteArray();
}
Попытка номер 2: (на самом деле это возврат байтового массива нулей, но попробовать стоило)

Код: Выделить всё

private byte[] alternateBodybytes(InputStream serveltInputStream, int contentLength) throws IOException {

byte[] bytes = new byte[contentLength];
for (int r, offset = 0; (r = serveltInputStream.read(bytes, offset, bytes.length - offset)) > -1;) {
offset += r;
}

return bytes;

}
На данный момент у меня заканчиваются варианты, и я ищу предложения, если они у вас есть?
  • Есть ли есть ли другой способ получить необработанную полезную нагрузку, возможно, на более низком уровне стека в рамках Springboot?
  • Я надеюсь, что мне не придется обновлять Spring/Java, так как это заставило бы меня много нужно сделать больше регрессии, но, возможно, пришло время.
Что вы думаете? Есть совет?
Примечание. Ниже приведены TCP-трассировки транзакции, в которой мне удалось получить тело из тела @RequestBody(required = false) byte[], мне кажется, то же самое, да?
Изображение


Подробнее здесь: https://stackoverflow.com/questions/790 ... -http-body
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»