New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Pass resolved (address, port) to opensocket callback. #18
Conversation
I think I generally agree but this patch will have to wait until 7.19.0.1 is released. |
goto error; | ||
} | ||
|
||
if (inet_ntop(saddr->sa_family, &sin->sin_addr, addr_str, 16) == NULL) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Both of these changes are excellent. I generally abhor constant sprinkled in code. What's the best way to handle this? Do you want to make the change on your end? or should I make the changes and overwrite the current pull branch?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can simply make another commit on this branch and push it.
Accepted, thanks! |
Version 7.19.3 [requires libcurl-7.19.0 or better] - 2014-01-09 --------------------------------------------------------------- * Added CURLOPT_NOPROXY. * Added CURLINFO_LOCAL_PORT, CURLINFO_PRIMARY_PORT and CURLINFO_LOCAL_IP (patch by Adam Jacob Muller). * When running on Python 2.x, for compatibility with Python 3.x, Unicode strings containing ASCII code points only are now accepted in setopt() calls. * PycURL now requires that compile time SSL backend used by libcurl is the same as the one used at runtime. setup.py supports --with-ssl, --with-gnutls and --with-nss options like libcurl does, to specify which backend libcurl uses. On some systems PycURL can automatically figure out libcurl's backend. If the backend is not one for which PycURL provides crypto locks (i.e., any of the other backends supported by libcurl), no runtime SSL backend check is performed. * Default PycURL user agent string is now built at runtime, and will include the user agent string of libcurl loaded at runtime rather than the one present at compile time. * PycURL will now use WSAduplicateSocket rather than dup on Windows to duplicate sockets obtained from OPENSOCKETFUNCTION. Using dup may have caused crashes, OPENSOCKETFUNCTION should now be usable on Windows. * A new script, winbuild.py, was added to build PycURL on Windows against Python 2.6, 2.7, 3.2 and 3.3. * Added CURL_LOCK_DATA_SSL_SESSION (patch by Tom Pierce). * Added E_OPERATION_TIMEDOUT (patch by Romuald Brunet). * setup.py now handles --help argument and will print PycURL-specific configuration options in addition to distutils help. * Windows build configuration has been redone: PYCURL_USE_LIBCURL_DLL #define is gone, use --use-libcurl-dll argument to setup.py to build against a libcurl DLL. CURL_STATICLIB is now #defined only when --use-libcurl-dll is not given to setup.py, and PycURL is built against libcurl statically. --libcurl-lib-name option can be used to override libcurl import library name. * Added CURLAUTH_DIGEST_IE as pycurl.HTTPAUTH_DIGEST_IE. * Added CURLOPT_POSTREDIR option and CURL_REDIR_POST_301, CURL_REDIR_POST_302, CURL_REDIR_POST_303 and CURL_REDIR_POST_ALL constants. CURL_REDIR_POST_303 requires libcurl 7.26.0 or higher, all others require libcurl 7.19.1 or higher. * PycURL now supports Python 3.1 through 3.3. Python 3.0 might work but it appears to ship with broken distutils, making virtualenv not function on it. * PycURL multi objects now have the multi constants defined on them. Previously the constants were only available on pycurl module. The new behavior matches that of curl and share objects. * PycURL share objects can now be closed via the close() method. * PycURL will no longer call `curl-config --static-libs` if `curl-config --libs` succeeds and returns output. Systems on which neither `curl-config --libs` nor `curl-config --static-libs` do the right thing should provide a `curl-config` wrapper that is sane. * Added CURLFORM_BUFFER and CURLFORM_BUFFERPTR. * pycurl.version and user agent string now include both PycURL version and libcurl version as separate items. * Added CURLOPT_DNS_SERVERS. * PycURL can now be dynamically linked against libcurl on Windows if PYCURL_USE_LIBCURL_DLL is #defined during compilation. * Breaking change: opensocket callback now takes an additional (address, port) tuple argument. Existing callbacks will need to be modified to accept this new argument. pycurl/pycurl#18 Version 7.19.0.3 [requires libcurl-7.19.0 or better] - 2013-12-24 ----------------------------------------------------------------- * Re-release of 7.19.0.2 with minor changes to build Windows packages due to botched 7.19.0.2 files on PyPi. http://curl.haxx.se/mail/curlpython-2013-12/0021.html Version 7.19.0.2 [requires libcurl-7.19.0 or better] - 2013-10-08 ----------------------------------------------------------------- * Fixed a bug in a commit made in 2008 but not released until 7.19.0.1 which caused CURLOPT_POSTFIELDS to not correctly increment reference count of the object being given as its argument, despite libcurl not copying the data provided by said object. * Added support for libcurl pause/unpause functionality, via curl_easy_pause call and returning READFUNC_PAUSE from read callback function. Version 7.19.0.1 [requires libcurl-7.19.0 or better] - 2013-09-23 ----------------------------------------------------------------- * Test matrix tool added to test against all supported Python and libcurl versions. * Python 2.4 is now the minimum required version. * Source code, bugs and patches are now kept on GitHub. * Added CURLINFO_CERTINFO and CURLOPT_CERTINFO. * Added CURLOPT_RESOLVE. * PycURL can now be used with Python binaries without thread support. * gcrypt is no longer initialized when a newer version of gnutls is used. * Marked NSS as supported. * Fixed relative URL request logic. * Fixed a memory leak in util_curl_init. * Added CURLOPT_USERNAME and CURLOPT_PASSWORD. * Fixed handling of big timeout values. * Added GLOBAL_ACK_EINTR. * setopt(..., None) can be used as unsetopt(). * CURLOPT_RANGE can now be unset. * Write callback can return -1 to signal user abort. * Reorganized tests into an automated test suite. * Added CURLOPT_SEEKFUNCTION and CURLOPT_SEEKDATA. * Cleaned up website. * Fix pycurl.reset() (patch by <johansen at sun.com>). * Fix install routine in setup.py where certain platforms (Solaris, Mac OSX, etc) would search for a static copy of libcurl (dbp). * Fixed build on OpenSolaris 0906 and other platforms on which curl-config does not have a --static-libs option. * No longer keep string options copies in the Curl Python objects, since string options are now managed by libcurl.
Version 7.19.3 [requires libcurl-7.19.0 or better] - 2014-01-09 --------------------------------------------------------------- * Added CURLOPT_NOPROXY. * Added CURLINFO_LOCAL_PORT, CURLINFO_PRIMARY_PORT and CURLINFO_LOCAL_IP (patch by Adam Jacob Muller). * When running on Python 2.x, for compatibility with Python 3.x, Unicode strings containing ASCII code points only are now accepted in setopt() calls. * PycURL now requires that compile time SSL backend used by libcurl is the same as the one used at runtime. setup.py supports --with-ssl, --with-gnutls and --with-nss options like libcurl does, to specify which backend libcurl uses. On some systems PycURL can automatically figure out libcurl's backend. If the backend is not one for which PycURL provides crypto locks (i.e., any of the other backends supported by libcurl), no runtime SSL backend check is performed. * Default PycURL user agent string is now built at runtime, and will include the user agent string of libcurl loaded at runtime rather than the one present at compile time. * PycURL will now use WSAduplicateSocket rather than dup on Windows to duplicate sockets obtained from OPENSOCKETFUNCTION. Using dup may have caused crashes, OPENSOCKETFUNCTION should now be usable on Windows. * A new script, winbuild.py, was added to build PycURL on Windows against Python 2.6, 2.7, 3.2 and 3.3. * Added CURL_LOCK_DATA_SSL_SESSION (patch by Tom Pierce). * Added E_OPERATION_TIMEDOUT (patch by Romuald Brunet). * setup.py now handles --help argument and will print PycURL-specific configuration options in addition to distutils help. * Windows build configuration has been redone: PYCURL_USE_LIBCURL_DLL #define is gone, use --use-libcurl-dll argument to setup.py to build against a libcurl DLL. CURL_STATICLIB is now #defined only when --use-libcurl-dll is not given to setup.py, and PycURL is built against libcurl statically. --libcurl-lib-name option can be used to override libcurl import library name. * Added CURLAUTH_DIGEST_IE as pycurl.HTTPAUTH_DIGEST_IE. * Added CURLOPT_POSTREDIR option and CURL_REDIR_POST_301, CURL_REDIR_POST_302, CURL_REDIR_POST_303 and CURL_REDIR_POST_ALL constants. CURL_REDIR_POST_303 requires libcurl 7.26.0 or higher, all others require libcurl 7.19.1 or higher. * PycURL now supports Python 3.1 through 3.3. Python 3.0 might work but it appears to ship with broken distutils, making virtualenv not function on it. * PycURL multi objects now have the multi constants defined on them. Previously the constants were only available on pycurl module. The new behavior matches that of curl and share objects. * PycURL share objects can now be closed via the close() method. * PycURL will no longer call `curl-config --static-libs` if `curl-config --libs` succeeds and returns output. Systems on which neither `curl-config --libs` nor `curl-config --static-libs` do the right thing should provide a `curl-config` wrapper that is sane. * Added CURLFORM_BUFFER and CURLFORM_BUFFERPTR. * pycurl.version and user agent string now include both PycURL version and libcurl version as separate items. * Added CURLOPT_DNS_SERVERS. * PycURL can now be dynamically linked against libcurl on Windows if PYCURL_USE_LIBCURL_DLL is #defined during compilation. * Breaking change: opensocket callback now takes an additional (address, port) tuple argument. Existing callbacks will need to be modified to accept this new argument. pycurl/pycurl#18 Version 7.19.0.3 [requires libcurl-7.19.0 or better] - 2013-12-24 ----------------------------------------------------------------- * Re-release of 7.19.0.2 with minor changes to build Windows packages due to botched 7.19.0.2 files on PyPi. http://curl.haxx.se/mail/curlpython-2013-12/0021.html Version 7.19.0.2 [requires libcurl-7.19.0 or better] - 2013-10-08 ----------------------------------------------------------------- * Fixed a bug in a commit made in 2008 but not released until 7.19.0.1 which caused CURLOPT_POSTFIELDS to not correctly increment reference count of the object being given as its argument, despite libcurl not copying the data provided by said object. * Added support for libcurl pause/unpause functionality, via curl_easy_pause call and returning READFUNC_PAUSE from read callback function. Version 7.19.0.1 [requires libcurl-7.19.0 or better] - 2013-09-23 ----------------------------------------------------------------- * Test matrix tool added to test against all supported Python and libcurl versions. * Python 2.4 is now the minimum required version. * Source code, bugs and patches are now kept on GitHub. * Added CURLINFO_CERTINFO and CURLOPT_CERTINFO. * Added CURLOPT_RESOLVE. * PycURL can now be used with Python binaries without thread support. * gcrypt is no longer initialized when a newer version of gnutls is used. * Marked NSS as supported. * Fixed relative URL request logic. * Fixed a memory leak in util_curl_init. * Added CURLOPT_USERNAME and CURLOPT_PASSWORD. * Fixed handling of big timeout values. * Added GLOBAL_ACK_EINTR. * setopt(..., None) can be used as unsetopt(). * CURLOPT_RANGE can now be unset. * Write callback can return -1 to signal user abort. * Reorganized tests into an automated test suite. * Added CURLOPT_SEEKFUNCTION and CURLOPT_SEEKDATA. * Cleaned up website. * Fix pycurl.reset() (patch by <johansen at sun.com>). * Fix install routine in setup.py where certain platforms (Solaris, Mac OSX, etc) would search for a static copy of libcurl (dbp). * Fixed build on OpenSolaris 0906 and other platforms on which curl-config does not have a --static-libs option. * No longer keep string options copies in the Curl Python objects, since string options are now managed by libcurl.
Version 7.19.3 [requires libcurl-7.19.0 or better] - 2014-01-09 --------------------------------------------------------------- * Added CURLOPT_NOPROXY. * Added CURLINFO_LOCAL_PORT, CURLINFO_PRIMARY_PORT and CURLINFO_LOCAL_IP (patch by Adam Jacob Muller). * When running on Python 2.x, for compatibility with Python 3.x, Unicode strings containing ASCII code points only are now accepted in setopt() calls. * PycURL now requires that compile time SSL backend used by libcurl is the same as the one used at runtime. setup.py supports --with-ssl, --with-gnutls and --with-nss options like libcurl does, to specify which backend libcurl uses. On some systems PycURL can automatically figure out libcurl's backend. If the backend is not one for which PycURL provides crypto locks (i.e., any of the other backends supported by libcurl), no runtime SSL backend check is performed. * Default PycURL user agent string is now built at runtime, and will include the user agent string of libcurl loaded at runtime rather than the one present at compile time. * PycURL will now use WSAduplicateSocket rather than dup on Windows to duplicate sockets obtained from OPENSOCKETFUNCTION. Using dup may have caused crashes, OPENSOCKETFUNCTION should now be usable on Windows. * A new script, winbuild.py, was added to build PycURL on Windows against Python 2.6, 2.7, 3.2 and 3.3. * Added CURL_LOCK_DATA_SSL_SESSION (patch by Tom Pierce). * Added E_OPERATION_TIMEDOUT (patch by Romuald Brunet). * setup.py now handles --help argument and will print PycURL-specific configuration options in addition to distutils help. * Windows build configuration has been redone: PYCURL_USE_LIBCURL_DLL #define is gone, use --use-libcurl-dll argument to setup.py to build against a libcurl DLL. CURL_STATICLIB is now #defined only when --use-libcurl-dll is not given to setup.py, and PycURL is built against libcurl statically. --libcurl-lib-name option can be used to override libcurl import library name. * Added CURLAUTH_DIGEST_IE as pycurl.HTTPAUTH_DIGEST_IE. * Added CURLOPT_POSTREDIR option and CURL_REDIR_POST_301, CURL_REDIR_POST_302, CURL_REDIR_POST_303 and CURL_REDIR_POST_ALL constants. CURL_REDIR_POST_303 requires libcurl 7.26.0 or higher, all others require libcurl 7.19.1 or higher. * PycURL now supports Python 3.1 through 3.3. Python 3.0 might work but it appears to ship with broken distutils, making virtualenv not function on it. * PycURL multi objects now have the multi constants defined on them. Previously the constants were only available on pycurl module. The new behavior matches that of curl and share objects. * PycURL share objects can now be closed via the close() method. * PycURL will no longer call `curl-config --static-libs` if `curl-config --libs` succeeds and returns output. Systems on which neither `curl-config --libs` nor `curl-config --static-libs` do the right thing should provide a `curl-config` wrapper that is sane. * Added CURLFORM_BUFFER and CURLFORM_BUFFERPTR. * pycurl.version and user agent string now include both PycURL version and libcurl version as separate items. * Added CURLOPT_DNS_SERVERS. * PycURL can now be dynamically linked against libcurl on Windows if PYCURL_USE_LIBCURL_DLL is #defined during compilation. * Breaking change: opensocket callback now takes an additional (address, port) tuple argument. Existing callbacks will need to be modified to accept this new argument. pycurl/pycurl#18 Version 7.19.0.3 [requires libcurl-7.19.0 or better] - 2013-12-24 ----------------------------------------------------------------- * Re-release of 7.19.0.2 with minor changes to build Windows packages due to botched 7.19.0.2 files on PyPi. http://curl.haxx.se/mail/curlpython-2013-12/0021.html Version 7.19.0.2 [requires libcurl-7.19.0 or better] - 2013-10-08 ----------------------------------------------------------------- * Fixed a bug in a commit made in 2008 but not released until 7.19.0.1 which caused CURLOPT_POSTFIELDS to not correctly increment reference count of the object being given as its argument, despite libcurl not copying the data provided by said object. * Added support for libcurl pause/unpause functionality, via curl_easy_pause call and returning READFUNC_PAUSE from read callback function. Version 7.19.0.1 [requires libcurl-7.19.0 or better] - 2013-09-23 ----------------------------------------------------------------- * Test matrix tool added to test against all supported Python and libcurl versions. * Python 2.4 is now the minimum required version. * Source code, bugs and patches are now kept on GitHub. * Added CURLINFO_CERTINFO and CURLOPT_CERTINFO. * Added CURLOPT_RESOLVE. * PycURL can now be used with Python binaries without thread support. * gcrypt is no longer initialized when a newer version of gnutls is used. * Marked NSS as supported. * Fixed relative URL request logic. * Fixed a memory leak in util_curl_init. * Added CURLOPT_USERNAME and CURLOPT_PASSWORD. * Fixed handling of big timeout values. * Added GLOBAL_ACK_EINTR. * setopt(..., None) can be used as unsetopt(). * CURLOPT_RANGE can now be unset. * Write callback can return -1 to signal user abort. * Reorganized tests into an automated test suite. * Added CURLOPT_SEEKFUNCTION and CURLOPT_SEEKDATA. * Cleaned up website. * Fix pycurl.reset() (patch by <johansen at sun.com>). * Fix install routine in setup.py where certain platforms (Solaris, Mac OSX, etc) would search for a static copy of libcurl (dbp). * Fixed build on OpenSolaris 0906 and other platforms on which curl-config does not have a --static-libs option. * No longer keep string options copies in the Curl Python objects, since string options are now managed by libcurl.
Version 7.19.3 [requires libcurl-7.19.0 or better] - 2014-01-09 --------------------------------------------------------------- * Added CURLOPT_NOPROXY. * Added CURLINFO_LOCAL_PORT, CURLINFO_PRIMARY_PORT and CURLINFO_LOCAL_IP (patch by Adam Jacob Muller). * When running on Python 2.x, for compatibility with Python 3.x, Unicode strings containing ASCII code points only are now accepted in setopt() calls. * PycURL now requires that compile time SSL backend used by libcurl is the same as the one used at runtime. setup.py supports --with-ssl, --with-gnutls and --with-nss options like libcurl does, to specify which backend libcurl uses. On some systems PycURL can automatically figure out libcurl's backend. If the backend is not one for which PycURL provides crypto locks (i.e., any of the other backends supported by libcurl), no runtime SSL backend check is performed. * Default PycURL user agent string is now built at runtime, and will include the user agent string of libcurl loaded at runtime rather than the one present at compile time. * PycURL will now use WSAduplicateSocket rather than dup on Windows to duplicate sockets obtained from OPENSOCKETFUNCTION. Using dup may have caused crashes, OPENSOCKETFUNCTION should now be usable on Windows. * A new script, winbuild.py, was added to build PycURL on Windows against Python 2.6, 2.7, 3.2 and 3.3. * Added CURL_LOCK_DATA_SSL_SESSION (patch by Tom Pierce). * Added E_OPERATION_TIMEDOUT (patch by Romuald Brunet). * setup.py now handles --help argument and will print PycURL-specific configuration options in addition to distutils help. * Windows build configuration has been redone: PYCURL_USE_LIBCURL_DLL #define is gone, use --use-libcurl-dll argument to setup.py to build against a libcurl DLL. CURL_STATICLIB is now #defined only when --use-libcurl-dll is not given to setup.py, and PycURL is built against libcurl statically. --libcurl-lib-name option can be used to override libcurl import library name. * Added CURLAUTH_DIGEST_IE as pycurl.HTTPAUTH_DIGEST_IE. * Added CURLOPT_POSTREDIR option and CURL_REDIR_POST_301, CURL_REDIR_POST_302, CURL_REDIR_POST_303 and CURL_REDIR_POST_ALL constants. CURL_REDIR_POST_303 requires libcurl 7.26.0 or higher, all others require libcurl 7.19.1 or higher. * PycURL now supports Python 3.1 through 3.3. Python 3.0 might work but it appears to ship with broken distutils, making virtualenv not function on it. * PycURL multi objects now have the multi constants defined on them. Previously the constants were only available on pycurl module. The new behavior matches that of curl and share objects. * PycURL share objects can now be closed via the close() method. * PycURL will no longer call `curl-config --static-libs` if `curl-config --libs` succeeds and returns output. Systems on which neither `curl-config --libs` nor `curl-config --static-libs` do the right thing should provide a `curl-config` wrapper that is sane. * Added CURLFORM_BUFFER and CURLFORM_BUFFERPTR. * pycurl.version and user agent string now include both PycURL version and libcurl version as separate items. * Added CURLOPT_DNS_SERVERS. * PycURL can now be dynamically linked against libcurl on Windows if PYCURL_USE_LIBCURL_DLL is #defined during compilation. * Breaking change: opensocket callback now takes an additional (address, port) tuple argument. Existing callbacks will need to be modified to accept this new argument. pycurl/pycurl#18 Version 7.19.0.3 [requires libcurl-7.19.0 or better] - 2013-12-24 ----------------------------------------------------------------- * Re-release of 7.19.0.2 with minor changes to build Windows packages due to botched 7.19.0.2 files on PyPi. http://curl.haxx.se/mail/curlpython-2013-12/0021.html Version 7.19.0.2 [requires libcurl-7.19.0 or better] - 2013-10-08 ----------------------------------------------------------------- * Fixed a bug in a commit made in 2008 but not released until 7.19.0.1 which caused CURLOPT_POSTFIELDS to not correctly increment reference count of the object being given as its argument, despite libcurl not copying the data provided by said object. * Added support for libcurl pause/unpause functionality, via curl_easy_pause call and returning READFUNC_PAUSE from read callback function. Version 7.19.0.1 [requires libcurl-7.19.0 or better] - 2013-09-23 ----------------------------------------------------------------- * Test matrix tool added to test against all supported Python and libcurl versions. * Python 2.4 is now the minimum required version. * Source code, bugs and patches are now kept on GitHub. * Added CURLINFO_CERTINFO and CURLOPT_CERTINFO. * Added CURLOPT_RESOLVE. * PycURL can now be used with Python binaries without thread support. * gcrypt is no longer initialized when a newer version of gnutls is used. * Marked NSS as supported. * Fixed relative URL request logic. * Fixed a memory leak in util_curl_init. * Added CURLOPT_USERNAME and CURLOPT_PASSWORD. * Fixed handling of big timeout values. * Added GLOBAL_ACK_EINTR. * setopt(..., None) can be used as unsetopt(). * CURLOPT_RANGE can now be unset. * Write callback can return -1 to signal user abort. * Reorganized tests into an automated test suite. * Added CURLOPT_SEEKFUNCTION and CURLOPT_SEEKDATA. * Cleaned up website. * Fix pycurl.reset() (patch by <johansen at sun.com>). * Fix install routine in setup.py where certain platforms (Solaris, Mac OSX, etc) would search for a static copy of libcurl (dbp). * Fixed build on OpenSolaris 0906 and other platforms on which curl-config does not have a --static-libs option. * No longer keep string options copies in the Curl Python objects, since string options are now managed by libcurl.
This change brings pycurl closer to supporting all the functionality of libcurl. An example of how this extra information can be used is to create sockets to proxies based on the ultimate address being connected to.
The relevant libcurl docs: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTOPENSOCKETFUNCTION
I created two implementations, the current one returning the address as a string in its dotted decimal form, and the other returning the address as a byte string of its binary form. The current one, I believe is more pythonic and easier to work with. However, the later does not rely on pycurl to understand and be able to create a string representation of the address, which may be an issue of non-IPv4/6 addresses.
Also, both implementations are not strictly backward compatible for existing python programs using this callback because the callback is assumed to accept 4 arguments. The current implementation could get around this by calling the callback with 4 arguments, then check for a TypeError with a message that the function takes 3 arguments, and finally call the function without the 4th address argument. I don't particularly like this option though because it seems a little hackish and brittle to parse/search the error string, which (I don't know) could be different for different languages. It doesn't seem unreasonable to require existing uses to add a 4th parameter or *args to the callback.
Comments welcome.