◐ Shell
clean mode source ↗

gh-85283: Build _scproxy extension with limited C API by vstinner · Pull Request #111008 · python/cpython

Expand Up @@ -2,6 +2,10 @@ * Helper method for urllib to fetch the proxy configuration settings * using the SystemConfiguration framework. */
// Need limited C API version 3.13 for Py_MOD_PER_INTERPRETER_GIL_SUPPORTED #define Py_LIMITED_API 0x030d0000
#include <Python.h> #include <SystemConfiguration/SystemConfiguration.h>
Expand All @@ -21,8 +25,7 @@ cfstring_to_pystring(CFStringRef ref)
s = CFStringGetCStringPtr(ref, kCFStringEncodingUTF8); if (s) { return PyUnicode_DecodeUTF8( s, strlen(s), NULL); return PyUnicode_DecodeUTF8(s, strlen(s), NULL);
} else { CFIndex len = CFStringGetLength(ref); Expand All @@ -43,8 +46,7 @@ cfstring_to_pystring(CFStringRef ref) PyMem_Free(buf); return NULL; } else { result = PyUnicode_DecodeUTF8( buf, strlen(buf), NULL); result = PyUnicode_DecodeUTF8(buf, strlen(buf), NULL); PyMem_Free(buf); } return result; Expand Down Expand Up @@ -84,7 +86,7 @@ get_proxy_settings(PyObject* Py_UNUSED(mod), PyObject *Py_UNUSED(ignored)) if (v == NULL) goto error;
r = PyDict_SetItemString(result, "exclude_simple", v); Py_SETREF(v, NULL); Py_CLEAR(v); if (r == -1) goto error;
anArray = CFDictionaryGetValue(proxyDict, Expand All @@ -104,13 +106,11 @@ get_proxy_settings(PyObject* Py_UNUSED(mod), PyObject *Py_UNUSED(ignored))
aString = CFArrayGetValueAtIndex(anArray, i); if (aString == NULL) { PyTuple_SetItem(v, i, Py_None); Py_INCREF(Py_None); PyTuple_SetItem(v, i, Py_NewRef(Py_None)); } else { PyObject* t = cfstring_to_pystring(aString); if (!t) { PyTuple_SetItem(v, i, Py_None); Py_INCREF(Py_None); PyTuple_SetItem(v, i, Py_NewRef(Py_None)); } else { PyTuple_SetItem(v, i, t); } Expand Down Expand Up @@ -148,15 +148,13 @@ set_proxy(PyObject* proxies, const char* proto, CFDictionaryRef proxyDict, if (h) { if (aNum) { int32_t port = cfnum_to_int32(aNum); v = PyUnicode_FromFormat("http://%U:%ld", h, (long)port); v = PyUnicode_FromFormat("http://%U:%ld", h, (long)port); } else { v = PyUnicode_FromFormat("http://%U", h); } Py_DECREF(h); if (!v) return -1; r = PyDict_SetItemString(proxies, proto, v); r = PyDict_SetItemString(proxies, proto, v); Py_DECREF(v); return r; } Expand Down