pycurl を使用してサーバーと対話しようとしていますが、500 エラーが発生します。サーバーから返されるエラーのテキストを確認できるようにしたいのですが、pycurl ではこれを行う方法がないようです。
たとえば、サーバーで「curl」をポイントすると、次のようになります。
$ curl -H "Content-Type: text/xml; charset=utf-8" -k -d @subcase.xml -X POST https://192.168.1.110/vision.asmx
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<detail>
<ExceptionMessage>Invalid Case Objid -1 or idNumber 76029744 or Case is closed.</ExceptionMessage>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
しかし、同じことを行う pycurl を作成しようとすると、サーバーから戻ってくる HTML が飲み込まれてしまうようです。
class Storage:
'''An object used to hold the output of a pyCurl command'''
def __init__(self):
self.contents = []
def store(self, buf):
self.contents.append(buf)
def __str__(self):
return '\n'.join(self.contents)
def go_get_it(url):
curl_obj = pycurl.Curl()
curl_obj.setopt(pycurl.URL, str(url))
output = Storage()
header = Storage()
curl_obj.setopt(pycurl.WRITEFUNCTION, output.store)
curl_obj.setopt(pycurl.HEADERFUNCTION, header.store)
response = Response(header, output)
if self.debug_level:
curl_obj.setopt(pycurl.VERBOSE, 1)
curl_obj.setopt(pycurl.DEBUGFUNCTION, self.curl_debug)
try:
curl_obj.perform()
status_code = curl_obj.getinfo(pycurl.HTTP_CODE)
response.set_status_code(status_code)
return response
except pycurl.error, curl_err:
print curl_obj.errstr()
サーバーが 500 エラーをスローしない場合、output
オブジェクトにはサーバーからの HTML 応答が含まれます。ただし、例外が発生した場合、出力オブジェクトは空です。サーバーから返される HTML もcurl_err
(私が知る限り) では利用できません。
この状況でサーバーから戻ってくる HTML を回復する方法があるかどうかは誰にもわかりませんか?