1

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 を回復する方法があるかどうかは誰にもわかりませんか?

4

0 に答える 0