Multipart / form-data запрос с несколькими файлами: запрос кажется искаженным из-за нечетной последовательности байтов - PullRequest
1 голос
/ 23 марта 2020

Нам нужно отправить multipart/form-data запрос, содержащий два файла. Поскольку у нас возникли некоторые проблемы с запросами, мы настроили страницу bin запроса, чтобы попытаться проанализировать сами запросы, поскольку Postman, похоже, работал нормально.

Мой второй файл создается другим сервисом в виде потока байтов и представляет собой JSON объект. Этот поток байтов, похоже, имеет в конце NUL (0) байт-терминатор.

Если я добавлю этот второй файл в запрос multipart/form-data, получится что-то вроде следующих результатов:

enter image description here

Если тело выглядит следующим образом:

--9ac41cec-a0ff-4afd-b687-6b8c2f1bddd6.
Content-Disposition: form-data; name="metadata"; filename="metadata-1584981615.json".
Content-Type: application/json.
Content-Length: 581.
.
{"...":"..."}.
--9ac41cec-a0ff-4afd-b687-6b8c2f1bddd6.
Content-Disposition: form-data; name="file"; filename="file-1584981615.json".
Content-Type: application/json.
Content-Length: 12205.
.
{"...":"..."}..
--9ac41cec-a0ff-4afd-b687-6b8c2f1bddd6--.

Очевидно, это в высшей степени неверно. Похоже, что запрос multipart добавляет символы . в конце каждой строки.

Мне удалось воспроизвести это поведение с Spring Web 5.1.5.RELEASE, okHttp 3.14.7 и Apache HttpComponents 4.5.7. Поведение, по-видимому, не меняется, если я удаляю терминатор байтов NUL (0) из потока байтов.

Вот странная часть: принимающий веб-сервер принимает этот запрос как действительный multipart/form-data request.

Для записи вот как выглядит действительный запрос (который также принимается веб-сервером) с точки зрения bin запроса (другой file):

enter image description here

--83611e7f-ad57-4893-9d1b-5ba2c4543d2a
Content-Disposition: form-data; name="metadata"; filename="metadata-1584982345.json"
Content-Type: application/json
Content-Length: 895

{"...": "..."}

--83611e7f-ad57-4893-9d1b-5ba2c4543d2a
Content-Disposition: form-data; name="file"; filename="file-1584982345.json"
Content-Type: application/json
Content-Length: 9868

{"...": "..."}
--83611e7f-ad57-4893-9d1b-5ba2c4543d2a--

Помимо наличия явного терминатора в конце (который, кажется, не имеет значения вообще), поток байтов не выглядит нарушенным. new String(bytes) дает действительный JSON объект. Поэтому я думаю, что это должно быть что-то еще.

Кто-нибудь сталкивался с этой проблемой раньше? Я не уверен, как приступить к отладке этой проблемы, и я вполне уверен, что отправка неправильных запросов, даже если они могут быть приняты удаленным сервером в это время, почти наверняка гарантирует, что мой код сломается где-нибудь вдоль линии. ..

...