Search code examples
pythondjangocurllibcurlpycurl

Trouble with pycurl.POSTFIELDS


I'm familiar with CURL in PHP but am using it for the first time in Python with pycurl.

I keep getting the error:

Exception Type:     error
Exception Value:    (2, '')

I have no idea what this could mean. Here is my code:

data = {'cmd': '_notify-synch',
        'tx': str(request.GET.get('tx')),
        'at': paypal_pdt_test
        }

post = urllib.urlencode(data)

b = StringIO.StringIO()

ch = pycurl.Curl()
ch.setopt(pycurl.URL, 'https://www.sandbox.paypal.com/cgi-bin/webscr')
ch.setopt(pycurl.POST, 1)
ch.setopt(pycurl.POSTFIELDS, post)
ch.setopt(pycurl.WRITEFUNCTION, b.write)
ch.perform()
ch.close()

The error is referring to the line ch.setopt(pycurl.POSTFIELDS, post)


Solution

  • It would appear that your pycurl installation (or curl library) is damaged somehow. From the curl error codes documentation:

    CURLE_FAILED_INIT (2)
    Very early initialization code failed. This is likely to be an internal error or problem.
    

    You will possibly need to re-install or recompile curl or pycurl.

    However, to do a simple POST request like you're doing, you can actually use python's "urllib" instead of CURL:

    import urllib
    
    postdata = urllib.urlencode(data)
    
    resp = urllib.urlopen('https://www.sandbox.paypal.com/cgi-bin/webscr', data=postdata)
    
    # resp is a file-like object, which means you can iterate it,
    # or read the whole thing into a string
    output = resp.read()
    
    # resp.code returns the HTTP response code
    print resp.code # 200
    
    # resp has other useful data, .info() returns a httplib.HTTPMessage
    http_message = resp.info()
    print http_message['content-length']  # '1536' or the like
    print http_message.type  # 'text/html' or the like
    print http_message.typeheader # 'text/html; charset=UTF-8' or the like
    
    
    # Make sure to close
    resp.close()
    

    to open an https:// URL, you may need to install PyOpenSSL: http://pypi.python.org/pypi/pyOpenSSL

    Some distibutions include this, others provide it as an extra package right through your favorite package manager.


    Edit: Have you called pycurl.global_init() yet? I still recommend urllib/urllib2 where possible, as your script will be more easily moved to other systems.