HTTP: недопустимая фрагментированная кодировка

У меня есть клиентское приложение .NET, которое использует стороннюю библиотеку для доступа к серверу через http. Библиотека выдает следующую ошибку:

The server committed a protocol violation. Section=ResponseBody Detail=Response chunk format is invalid

Программное обеспечение уже установлено десятки раз, поэтому я думаю, что это проблема в системе клиента, я подозреваю, что это прокси между ними.

Я использовал Fiddler, чтобы получить первую подсказку. При прослушивании Fiddler обратите внимание на нарушение протокола:

Illegal chunked encoding. 'MIME-Version: 1.0' is not a hexadecimal number.

Fiddler показывает следующий ответ:

MIME-Version: 1.0
Content-Type: Multipart/Related; boundary=MIME_boundary_RsidtvFKHs9ymusS/NI6l56qcD8r76ye; type=text/xml

--MIME_boundary_RsidtvFKHs9ymusS/NI6l56qcD8r76ye
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: 8bit
Content-ID: <osci@message>
Content-Length: 1545

<?xml version="1.0" encoding="UTF-8"?>

<soap:Envelope xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ soapMessageEncrypted.xsd http://www.w3.org/2000/09/xmldsig# oscisig.xsd http://www.w3.org/2001/04/xmlenc# oscienc.xsd"><soap:Body><xenc:EncryptedData MimeType="Multipart/Related"><xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"></xenc:EncryptionMethod><ds:KeyInfo><xenc:EncryptedKey><xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"></xenc:EncryptionMethod><ds:KeyInfo><ds:X509Data><ds:X509Certificate>MIID0jCCArqgAwIBAgIJAMg6MGbE+zZRMA0GCSqGSIb3DQEBDQUAMIGJMQswCQYDVQQGEwJERTEf
MB0GA1UECAwWTWVja2xlbmJ1cmctVm9ycG9tbWVybjERMA8GA1UEBwwIU2Nod2VyaW4xLDAqBgNV
BAoMI0NvbXB1dGVyLUJlcm

Как видите, ответ неожиданно остановился.

Кто-нибудь знает, в чем может быть проблема или как их исправить?


person Hurby    schedule 04.01.2016    source источник
comment
Что такое заголовки HTTP?   -  person Danny_ds    schedule 04.01.2016
comment
Заголовок запроса выглядит следующим образом: POST /osci-manager-entry/externalentry HTTP/1.0 Host: [the-host] Content-Length: 3984 Proxy-Connection: Keep-Alive Заголовок ответа содержит следующее: HTTP/ 1.0 200 OK Дата: понедельник, 04 января 2016 г. 12:10:31 GMT Передача-кодирование: chunked Content-Type: text/plain; charset=iso-8859-1 Соединение: Keep-Alive   -  person Hurby    schedule 05.01.2016


Ответы (1)


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

POST /osci-manager-entry/externalentry HTTP/1.0
Host: [the-host]
Content-Length: 3984
Proxy-Connection: Keep-Alive

Заголовок ответа содержит следующее:

HTTP/1.0 200 OK
Date: Mon, 04 Jan 2016 12:10:31 GMT
Transfer-Encoding: chunked
Content-Type: text/plain; charset=iso-8859-1
Connection: Keep-Alive

Программное обеспечение уже установлено десятки раз, поэтому я думаю, что это проблема в системе клиента, я подозреваю, что это прокси между ними.

Скорее всего, проблема связана с использованием в данном случае HTTP/1.0. Передача по частям и Keep-Alive не являются стандартными в HTTP/1.0.

При кодировании передачи по частям каждый фрагмент должен начинаться с шестнадцатеричного числа, указывающего размер фрагмента. что следует. Очевидно, что этого номера здесь нет: Illegal chunked encoding. 'MIME-Version: 1.0' is not a hexadecimal number.

В HTTP/1.0 Keep-Alive и групповое кодирование передачи не могут использоваться вместе:

Сервер HTTP/1.1 также может устанавливать постоянные соединения с клиентами HTTP/1.0 после получения маркера соединения Keep-Alive. Однако постоянное соединение с клиентом HTTP/1.0 не может использовать фрагментированное кодирование передачи и, следовательно, ДОЛЖНО использовать Content-Length для маркировки конечной границы каждого сообщения.

person Danny_ds    schedule 05.01.2016
comment
Да, безусловно, обратный прокси-сервер работает с ответом, который берет первый фрагмент и передает его как полный ответ HTTP/1.0, не заменяя заголовок Transfer-Encoding заголовком Content-length и не анализируя другие фрагменты. плохой прокси. - person regilero; 05.01.2016
comment
Это именно то, что я понял после подсказки Danny_ds. Я смог унаследовать класс сторонней библиотеки и реализовать собственный транспортный модуль, который работает. @Danny_ds большое спасибо - person Hurby; 06.01.2016