Вызов клиента xmlrpc в python не возвращается - PullRequest
2 голосов
/ 30 марта 2010

Использование Python 2.6.4, windows

С помощью следующего скрипта я хочу протестировать определенный сервер xmlrpc. Я вызываю несуществующую функцию и надеюсь на трассировку с ошибкой. Вместо этого функция не возвращает. В чем может быть причина?

import xmlrpclib
s = xmlrpclib.Server("http://127.0.0.1:80", verbose=True)
s.functioncall()

Вывод:

send: 'POST /RPC2 HTTP/1.0\r\nHost: 127.0.0.1:80\r\nUser-Agent: xmlrpclib.py/1.0
.1 (by www.pythonware.com)\r\nContent-Type: text/xml\r\nContent-Length: 106\r\n\
r\n'
send: "<?xml version='1.0'?>\n<methodCall>\n<methodName>functioncall</methodName
>\n<params>\n</params>\n</methodCall>\n"
reply: 'HTTP/1.1 200 OK\r\n'
header: Content-Type: text/xml
header: Cache-Control: no-cache
header: Content-Length: 376
header: Date: Tue, 30 Mar 2010 13:27:21 GMT
body: '<?xml version="1.0"?>\r\n<methodResponse>\r\n<fault>\r\n<value>\r\n<struc
t>\r\n<member>\r\n<name>faultCode</name>\r\n<value><i4>1</i4></value>\r\n</membe
r>\r\n<member>\r\n<name>faultString</name>\r\n<value><string>PVSS00ctrl   (2), 2
010.03.30 15:27:21.395, CTRL, SEVERE,     72, Function not defined, functioncall
, , \n</string></value>\r\n</member>\r\n</struct>\r\n</value>\r\n</fault>\r\n</m
ethodResponse>\r\n'

(здесь программа зависает и не возвращается, пока я не убью сервер)

edit: сервер написан на c ++ с использованием собственной библиотеки xmlrpc

edit: обнаружена проблема, похожая на ту же проблему http://bugs.python.org/issue1727418

Ответы [ 2 ]

5 голосов
/ 30 марта 2010

Как вы заметили, это ошибка на сервере (клиент утверждает, что понимает 1.0, а сервер игнорирует это и все равно отвечает в 1.1, поэтому не закрывает сокет). В Python есть обходной путь для таких ошибочных серверов в 2.7 и 3.2, см. эту проблему , но этот обходной путь не был в 2.6.4. К сожалению, из 2.6.5 NEWS.txt похоже, что мы также не перенесли его в 2.6.5. Патч для обхода в 2.7 - здесь , возможно, вы можете попробовать применить его к 2.6.5 самостоятельно, если просто невозможно исправить глючный сервер ...?

2 голосов
/ 30 марта 2010

Скорее всего, тестируемый сервер не закрывает TCP-соединение после отправки ответа вашему клиенту. Таким образом, клиент зависает, ожидая, пока сервер закроет соединение, прежде чем он сможет вернуться из функции.

...