#include #include "helpers.h" #include "proxy.h" int proxy_settings_parse(PyObject *obj, ProxySettings *settings) { settings->mode = PROXY_MODE_AUTO; settings->proxy_list = NULL; settings->username = NULL; settings->password = NULL; if (!obj || Py_Is(obj, Py_GetConstantBorrowed(Py_CONSTANT_NONE))) { return 1; } int mode; if (!PyArg_ParseTuple( obj, "iO&O&O&:proxy_settings", &mode, as_utf16, &settings->proxy_list, as_utf16, &settings->username, as_utf16, &settings->password )) { // PyArg_ParseTuple calls cleanup for successful O& converters when a // later conversion fails, so these pointers no longer own memory. settings->proxy_list = NULL; settings->username = NULL; settings->password = NULL; return 0; } if (mode < PROXY_MODE_AUTO || mode > PROXY_MODE_OVERRIDE) { PyErr_SetString(PyExc_ValueError, "invalid proxy mode"); proxy_settings_clear(settings); return 0; } settings->mode = (ProxyMode)mode; if (settings->mode == PROXY_MODE_OVERRIDE && !settings->proxy_list) { PyErr_SetString(PyExc_ValueError, "proxy override requires a proxy list"); proxy_settings_clear(settings); return 0; } return 1; } void proxy_settings_clear(ProxySettings *settings) { PyMem_Free(settings->proxy_list); PyMem_Free(settings->username); PyMem_Free(settings->password); settings->mode = PROXY_MODE_AUTO; settings->proxy_list = NULL; settings->username = NULL; settings->password = NULL; }