ยป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 aNum = CFDictionaryGetValue(proxyDict,
68n/a kSCPropNetProxiesExcludeSimpleHostnames);
69n/a if (aNum == NULL) {
70n/a v = PyBool_FromLong(0);
71n/a } else {
72n/a v = PyBool_FromLong(cfnum_to_int32(aNum));
73n/a }
74n/a if (v == NULL) goto error;
75n/a
76n/a r = PyDict_SetItemString(result, "exclude_simple", v);
77n/a Py_DECREF(v); v = NULL;
78n/a if (r == -1) goto error;
79n/a
80n/a anArray = CFDictionaryGetValue(proxyDict,
81n/a kSCPropNetProxiesExceptionsList);
82n/a if (anArray != NULL) {
83n/a CFIndex len = CFArrayGetCount(anArray);
84n/a CFIndex i;
85n/a v = PyTuple_New(len);
86n/a if (v == NULL) goto error;
87n/a
88n/a r = PyDict_SetItemString(result, "exceptions", v);
89n/a Py_DECREF(v);
90n/a if (r == -1) goto error;
91n/a
92n/a for (i = 0; i < len; i++) {
93n/a CFStringRef aString = NULL;
94n/a
95n/a aString = CFArrayGetValueAtIndex(anArray, i);
96n/a if (aString == NULL) {
97n/a PyTuple_SetItem(v, i, Py_None);
98n/a Py_INCREF(Py_None);
99n/a } else {
100n/a PyObject* t = cfstring_to_pystring(aString);
101n/a if (!t) {
102n/a PyTuple_SetItem(v, i, Py_None);
103n/a Py_INCREF(Py_None);
104n/a } else {
105n/a PyTuple_SetItem(v, i, t);
106n/a }
107n/a }
108n/a }
109n/a }
110n/a
111n/a CFRelease(proxyDict);
112n/a return result;
113n/a
114n/aerror:
115n/a if (proxyDict) CFRelease(proxyDict);
116n/a Py_XDECREF(result);
117n/a return NULL;
118n/a}
119n/a
120n/astatic int
121n/aset_proxy(PyObject* proxies, char* proto, CFDictionaryRef proxyDict,
122n/a CFStringRef enabledKey,
123n/a CFStringRef hostKey, CFStringRef portKey)
124n/a{
125n/a CFNumberRef aNum;
126n/a
127n/a aNum = CFDictionaryGetValue(proxyDict, enabledKey);
128n/a if (aNum && cfnum_to_int32(aNum)) {
129n/a CFStringRef hostString;
130n/a
131n/a hostString = CFDictionaryGetValue(proxyDict, hostKey);
132n/a aNum = CFDictionaryGetValue(proxyDict, portKey);
133n/a
134n/a if (hostString) {
135n/a int r;
136n/a PyObject* h = cfstring_to_pystring(hostString);
137n/a PyObject* v;
138n/a if (h) {
139n/a if (aNum) {
140n/a int32_t port = cfnum_to_int32(aNum);
141n/a v = PyString_FromFormat("http://%s:%ld",
142n/a PyString_AS_STRING(h),
143n/a (long)port);
144n/a } else {
145n/a v = PyString_FromFormat("http://%s",
146n/a PyString_AS_STRING(h));
147n/a }
148n/a Py_DECREF(h);
149n/a if (!v) return -1;
150n/a r = PyDict_SetItemString(proxies, proto,
151n/a v);
152n/a Py_DECREF(v);
153n/a return r;
154n/a }
155n/a }
156n/a
157n/a }
158n/a return 0;
159n/a}
160n/a
161n/a
162n/a
163n/astatic PyObject*
164n/aget_proxies(PyObject* mod __attribute__((__unused__)))
165n/a{
166n/a PyObject* result = NULL;
167n/a int r;
168n/a CFDictionaryRef proxyDict = NULL;
169n/a
170n/a proxyDict = SCDynamicStoreCopyProxies(NULL);
171n/a if (proxyDict == NULL) {
172n/a return PyDict_New();
173n/a }
174n/a
175n/a result = PyDict_New();
176n/a if (result == NULL) goto error;
177n/a
178n/a r = set_proxy(result, "http", proxyDict,
179n/a kSCPropNetProxiesHTTPEnable,
180n/a kSCPropNetProxiesHTTPProxy,
181n/a kSCPropNetProxiesHTTPPort);
182n/a if (r == -1) goto error;
183n/a r = set_proxy(result, "https", proxyDict,
184n/a kSCPropNetProxiesHTTPSEnable,
185n/a kSCPropNetProxiesHTTPSProxy,
186n/a kSCPropNetProxiesHTTPSPort);
187n/a if (r == -1) goto error;
188n/a r = set_proxy(result, "ftp", proxyDict,
189n/a kSCPropNetProxiesFTPEnable,
190n/a kSCPropNetProxiesFTPProxy,
191n/a kSCPropNetProxiesFTPPort);
192n/a if (r == -1) goto error;
193n/a r = set_proxy(result, "gopher", proxyDict,
194n/a kSCPropNetProxiesGopherEnable,
195n/a kSCPropNetProxiesGopherProxy,
196n/a kSCPropNetProxiesGopherPort);
197n/a if (r == -1) goto error;
198n/a
199n/a CFRelease(proxyDict);
200n/a return result;
201n/aerror:
202n/a if (proxyDict) CFRelease(proxyDict);
203n/a Py_XDECREF(result);
204n/a return NULL;
205n/a}
206n/a
207n/astatic PyMethodDef mod_methods[] = {
208n/a {
209n/a "_get_proxy_settings",
210n/a (PyCFunction)get_proxy_settings,
211n/a METH_NOARGS,
212n/a NULL,
213n/a },
214n/a {
215n/a "_get_proxies",
216n/a (PyCFunction)get_proxies,
217n/a METH_NOARGS,
218n/a NULL,
219n/a },
220n/a { 0, 0, 0, 0 }
221n/a};
222n/a
223n/avoid init_scproxy(void)
224n/a{
225n/a (void)Py_InitModule4("_scproxy", mod_methods, NULL, NULL, PYTHON_API_VERSION);
226n/a}