ยปCore Development>Code coverage>Mac/Modules/_scproxy.c

Python code coverage for Mac/Modules/_scproxy.c

#countcontent
1n/a/*
2n/a * Helper method for urllib to fetch the proxy configuration settings
3n/a * using the SystemConfiguration framework.
4n/a */
5n/a#include <Python.h>
6n/a#include <SystemConfiguration/SystemConfiguration.h>
7n/a
8n/astatic int32_t
9n/acfnum_to_int32(CFNumberRef num)
10n/a{
11n/a int32_t result;
12n/a
13n/a CFNumberGetValue(num, kCFNumberSInt32Type, &result);
14n/a return result;
15n/a}
16n/a
17n/astatic PyObject*
18n/acfstring_to_pystring(CFStringRef ref)
19n/a{
20n/a const char* s;
21n/a
22n/a s = CFStringGetCStringPtr(ref, kCFStringEncodingUTF8);
23n/a if (s) {
24n/a return PyString_FromString(s);
25n/a
26n/a } else {
27n/a CFIndex len = CFStringGetLength(ref);
28n/a Boolean ok;
29n/a PyObject* result;
30n/a result = PyString_FromStringAndSize(NULL, len*4);
31n/a
32n/a ok = CFStringGetCString(ref,
33n/a PyString_AS_STRING(result),
34n/a PyString_GET_SIZE(result),
35n/a kCFStringEncodingUTF8);
36n/a if (!ok) {
37n/a Py_DECREF(result);
38n/a return NULL;
39n/a } else {
40n/a _PyString_Resize(&result,
41n/a strlen(PyString_AS_STRING(result)));
42n/a }
43n/a return result;
44n/a }
45n/a}
46n/a
47n/a
48n/astatic PyObject*
49n/aget_proxy_settings(PyObject* mod __attribute__((__unused__)))
50n/a{
51n/a CFDictionaryRef proxyDict = NULL;
52n/a CFNumberRef aNum = NULL;
53n/a CFArrayRef anArray = NULL;
54n/a PyObject* result = NULL;
55n/a PyObject* v;
56n/a int r;
57n/a
58n/a proxyDict = SCDynamicStoreCopyProxies(NULL);
59n/a if (!proxyDict) {
60n/a Py_INCREF(Py_None);
61n/a return Py_None;
62n/a }
63n/a
64n/a result = PyDict_New();
65n/a if (result == NULL) goto error;
66n/a
67n/a if (&kSCPropNetProxiesExcludeSimpleHostnames != NULL) {
68n/a aNum = CFDictionaryGetValue(proxyDict,
69n/a kSCPropNetProxiesExcludeSimpleHostnames);
70n/a if (aNum == NULL) {
71n/a v = PyBool_FromLong(0);
72n/a } else {
73n/a v = PyBool_FromLong(cfnum_to_int32(aNum));
74n/a }
75n/a } else {
76n/a v = PyBool_FromLong(1);
77n/a }
78n/a
79n/a if (v == NULL) goto error;
80n/a
81n/a r = PyDict_SetItemString(result, "exclude_simple", v);
82n/a Py_DECREF(v); v = NULL;
83n/a if (r == -1) goto error;
84n/a
85n/a anArray = CFDictionaryGetValue(proxyDict,
86n/a kSCPropNetProxiesExceptionsList);
87n/a if (anArray != NULL) {
88n/a CFIndex len = CFArrayGetCount(anArray);
89n/a CFIndex i;
90n/a v = PyTuple_New(len);
91n/a if (v == NULL) goto error;
92n/a
93n/a r = PyDict_SetItemString(result, "exceptions", v);
94n/a Py_DECREF(v);
95n/a if (r == -1) goto error;
96n/a
97n/a for (i = 0; i < len; i++) {
98n/a CFStringRef aString = NULL;
99n/a
100n/a aString = CFArrayGetValueAtIndex(anArray, i);
101n/a if (aString == NULL) {
102n/a PyTuple_SetItem(v, i, Py_None);
103n/a Py_INCREF(Py_None);
104n/a } else {
105n/a PyObject* t = cfstring_to_pystring(aString);
106n/a if (!t) {
107n/a PyTuple_SetItem(v, i, Py_None);
108n/a Py_INCREF(Py_None);
109n/a } else {
110n/a PyTuple_SetItem(v, i, t);
111n/a }
112n/a }
113n/a }
114n/a }
115n/a
116n/a CFRelease(proxyDict);
117n/a return result;
118n/a
119n/aerror:
120n/a if (proxyDict) CFRelease(proxyDict);
121n/a Py_XDECREF(result);
122n/a return NULL;
123n/a}
124n/a
125n/astatic int
126n/aset_proxy(PyObject* proxies, char* proto, CFDictionaryRef proxyDict,
127n/a CFStringRef enabledKey,
128n/a CFStringRef hostKey, CFStringRef portKey)
129n/a{
130n/a CFNumberRef aNum;
131n/a
132n/a aNum = CFDictionaryGetValue(proxyDict, enabledKey);
133n/a if (aNum && cfnum_to_int32(aNum)) {
134n/a CFStringRef hostString;
135n/a
136n/a hostString = CFDictionaryGetValue(proxyDict, hostKey);
137n/a aNum = CFDictionaryGetValue(proxyDict, portKey);
138n/a
139n/a if (hostString) {
140n/a int r;
141n/a PyObject* h = cfstring_to_pystring(hostString);
142n/a PyObject* v;
143n/a if (h) {
144n/a if (aNum) {
145n/a int32_t port = cfnum_to_int32(aNum);
146n/a v = PyString_FromFormat("http://%s:%ld",
147n/a PyString_AS_STRING(h),
148n/a (long)port);
149n/a } else {
150n/a v = PyString_FromFormat("http://%s",
151n/a PyString_AS_STRING(h));
152n/a }
153n/a Py_DECREF(h);
154n/a if (!v) return -1;
155n/a r = PyDict_SetItemString(proxies, proto,
156n/a v);
157n/a Py_DECREF(v);
158n/a return r;
159n/a }
160n/a }
161n/a
162n/a }
163n/a return 0;
164n/a}
165n/a
166n/a
167n/a
168n/astatic PyObject*
169n/aget_proxies(PyObject* mod __attribute__((__unused__)))
170n/a{
171n/a PyObject* result = NULL;
172n/a int r;
173n/a CFDictionaryRef proxyDict = NULL;
174n/a
175n/a proxyDict = SCDynamicStoreCopyProxies(NULL);
176n/a if (proxyDict == NULL) {
177n/a return PyDict_New();
178n/a }
179n/a
180n/a result = PyDict_New();
181n/a if (result == NULL) goto error;
182n/a
183n/a r = set_proxy(result, "http", proxyDict,
184n/a kSCPropNetProxiesHTTPEnable,
185n/a kSCPropNetProxiesHTTPProxy,
186n/a kSCPropNetProxiesHTTPPort);
187n/a if (r == -1) goto error;
188n/a r = set_proxy(result, "https", proxyDict,
189n/a kSCPropNetProxiesHTTPSEnable,
190n/a kSCPropNetProxiesHTTPSProxy,
191n/a kSCPropNetProxiesHTTPSPort);
192n/a if (r == -1) goto error;
193n/a r = set_proxy(result, "ftp", proxyDict,
194n/a kSCPropNetProxiesFTPEnable,
195n/a kSCPropNetProxiesFTPProxy,
196n/a kSCPropNetProxiesFTPPort);
197n/a if (r == -1) goto error;
198n/a r = set_proxy(result, "gopher", proxyDict,
199n/a kSCPropNetProxiesGopherEnable,
200n/a kSCPropNetProxiesGopherProxy,
201n/a kSCPropNetProxiesGopherPort);
202n/a if (r == -1) goto error;
203n/a
204n/a CFRelease(proxyDict);
205n/a return result;
206n/aerror:
207n/a if (proxyDict) CFRelease(proxyDict);
208n/a Py_XDECREF(result);
209n/a return NULL;
210n/a}
211n/a
212n/astatic PyMethodDef mod_methods[] = {
213n/a {
214n/a "_get_proxy_settings",
215n/a (PyCFunction)get_proxy_settings,
216n/a METH_NOARGS,
217n/a NULL,
218n/a },
219n/a {
220n/a "_get_proxies",
221n/a (PyCFunction)get_proxies,
222n/a METH_NOARGS,
223n/a NULL,
224n/a },
225n/a { 0, 0, 0, 0 }
226n/a};
227n/a
228n/avoid init_scproxy(void)
229n/a{
230n/a (void)Py_InitModule4("_scproxy", mod_methods, NULL, NULL, PYTHON_API_VERSION);
231n/a}