talend tRESTПодозрение клиента на проблемы с ответом 204 No Content без заголовка content-length: 0 - PullRequest
1 голос
/ 05 августа 2020

Мы используем talend для создания ETL. Один из используемых нами компонентов - tRESTClient , чтобы взаимодействовать со службой REST на нашей платформе. Мы используем talend версии 7.1.

Недавно эта служба REST изменила версию своей библиотеки HTTP-сервера ( libmicrohttpd , служба REST основана на C / C ++). В частности, перешел с limicrohttpd 0.9.48 на 0.9.70. И поскольку мы внесли изменения, интеграция в ETL начала давать сбой. Мы видим подобное сообщение в трассировке talend:

--------------------------------------
time=2020-08-05 08:26:01| lvl=INFO | ver=1.0| Inbound Message
----------------------------
ID: 1
Response-Code: 204
Encoding: ISO-8859-1
Content-Type: 
Headers: {Cache-Control=[no-cache, no-store, max-age=0, must-revalidate], connection=[keep-alive], Date=[Wed, 05 Aug 2020 06:26:03 GMT], Expires=[0], fiware-correlator=[894f7ff0-d6e4-11ea-b1bd-fa163ec74401], Pragma=[no-cache], Referrer-Policy=[same-origin], Server=[nginx], Strict-Transport-Security=[max-age=31536000; includeSubdomains;], X-Content-Type-Options=[nosniff], X-Frame-Options=[SAMEORIGIN], X-XSS-Protection=[1; mode=block]}
--------------------------------------
Exception in component tRESTClient_1 (VLCI_ETL_MEDIOAMBIENTE_INSERT_CB)
javax.ws.rs.client.ResponseProcessingException: Problem with reading the data, class org.dom4j.Document, ContentType: */*.
                at org.apache.cxf.jaxrs.impl.ResponseImpl.reportMessageHandlerProblem(ResponseImpl.java:437)
                at org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.java:379)
                at org.apache.cxf.jaxrs.impl.ResponseImpl.readEntity(ResponseImpl.java:314)
                at org.apache.cxf.jaxrs.impl.ResponseImpl.readEntity(ResponseImpl.java:304)
              …

Мы все еще исследуем проблему, но подозреваем, что одно из изменений, внесенных в libmicrohttpd, могло быть связано. В частности, с libmicrohttd 0.9.48 (когда работает ETL) заголовок Content-Length: 0 был включен в 204 ответа. В libmicrohttpd 0.9.70 (когда ETL не работает) такой заголовок Content-Length: 0 не включается.

Это известная проблема? Я имею в виду, ожидается ли сбой tRESTClient (версия 7.1), если «Content-Lengh: 0» не включен в 204 ответа?

Обратите внимание, что спецификация HTTP довольно четко определяет использование Content-Length в 204 ответах. Из RF C 7321 (который, насколько мне известно, является нормативным стандартом для HTTP) раздел 6.1 :

Сервер НЕ ДОЛЖЕН отправлять поле заголовка Content-Length в любой ответ с кодом состояния 1xx (информационный) или 204 (без содержимого) »

, поэтому, если tRESTClient не поддерживает его, я понимаю, что это ошибка в talend (может быть решена в версии после версии 7.1 релизы?)

Любые отзывы об этом действительно приветствуются! Спасибо за внимание.

1 Ответ

2 голосов
/ 06 августа 2020

Наконец, похоже, мы решили проблему следующим образом.

В случае сбоя компонент использовал эту конфигурацию:

enter image description here

We have changed Accept Type from "JSON" to "Any" in the following way:

введите описание изображения здесь

И теперь он работает.

Я предполагаю, что с типом принятия «JSON» компонент ожидает полезной нагрузки ответа, и это проблема c в дело 204 без содержания. Использование "Any" снимает это ограничение.

Возможно, в данном случае это сработало случайно с нестандартным заголовком content-length: 0 ... В любом случае это немного странно, я думаю, что tRESTClient должен лучше справляться с этой ситуацией чем это. Возможно, это поведение уже исправлено в версиях после 7.1.

Любые отзывы или комментарии по этому решению приветствуются. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...