@@ -150,6 +150,69 @@ static int crack_url(wchar_t *url, URL_COMPONENTS *parts, int add_nuls) {
150150
151151extern " C" {
152152
153+ #define CHECK_WINHTTP (x ) if (!x) { winhttp_error (); goto exit; }
154+
155+
156+ static bool winhttp_apply_proxy (HINTERNET hSession, HINTERNET hRequest, const wchar_t *url) {
157+ bool result = false ;
158+ WINHTTP_CURRENT_USER_IE_PROXY_CONFIG proxy_config = { 0 };
159+ WINHTTP_AUTOPROXY_OPTIONS proxy_opt = {
160+ .dwFlags = WINHTTP_AUTOPROXY_ALLOW_STATIC,
161+ .fAutoLogonIfChallenged = TRUE
162+ };
163+ WINHTTP_PROXY_INFO proxy_info = { 0 };
164+
165+ // First load the global-ish config settings
166+ if (!WinHttpGetIEProxyConfigForCurrentUser (&proxy_config)) {
167+ if (GetLastError () != ERROR_FILE_NOT_FOUND) {
168+ goto exit;
169+ }
170+ // No global config, so assume auto-detect
171+ proxy_config.lpszProxy = proxy_config.lpszProxyBypass = proxy_config.lpszAutoConfigUrl = NULL ;
172+ proxy_config.fAutoDetect = TRUE ;
173+ }
174+ if (proxy_config.lpszProxy ) {
175+ GlobalFree (proxy_config.lpszProxy );
176+ }
177+ if (proxy_config.lpszProxyBypass ) {
178+ GlobalFree (proxy_config.lpszProxyBypass );
179+ }
180+ if (proxy_config.fAutoDetect ) {
181+ proxy_opt.dwFlags |= WINHTTP_AUTOPROXY_AUTO_DETECT;
182+ proxy_opt.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP
183+ | WINHTTP_AUTO_DETECT_TYPE_DNS_A;
184+ }
185+ if (proxy_config.lpszAutoConfigUrl ) {
186+ proxy_opt.dwFlags |= WINHTTP_AUTOPROXY_CONFIG_URL;
187+ proxy_opt.lpszAutoConfigUrl = proxy_config.lpszAutoConfigUrl ;
188+ }
189+
190+ // Now resolve the proxy required for the specified URL
191+ CHECK_WINHTTP (WinHttpGetProxyForUrl (hSession, url, &proxy_opt, &proxy_info));
192+
193+ // Apply the proxy settings to the request
194+ CHECK_WINHTTP (WinHttpSetOption (
195+ hRequest,
196+ WINHTTP_OPTION_PROXY,
197+ &proxy_info,
198+ sizeof (proxy_info)
199+ ));
200+
201+ result = true ;
202+ exit:
203+ if (proxy_info.lpszProxy ) {
204+ GlobalFree ((HGLOBAL)proxy_info.lpszProxy );
205+ }
206+ if (proxy_info.lpszProxyBypass ) {
207+ GlobalFree ((HGLOBAL)proxy_info.lpszProxyBypass );
208+ }
209+ if (proxy_opt.lpszAutoConfigUrl ) {
210+ GlobalFree ((HGLOBAL)proxy_opt.lpszAutoConfigUrl );
211+ }
212+ return result;
213+ }
214+
215+
153216PyObject *winhttp_urlopen (PyObject *, PyObject *args, PyObject *kwargs) {
154217 static const char * keywords[] = {" url" , " method" , " headers" , " accepts" , " chunksize" , " on_progress" , " on_cred_request" , NULL };
155218 wchar_t *url = NULL ;
@@ -202,11 +265,9 @@ PyObject *winhttp_urlopen(PyObject *, PyObject *args, PyObject *kwargs) {
202265 goto exit;
203266 }
204267
205- #define CHECK_WINHTTP (x ) if (!x) { winhttp_error (); goto exit; }
206-
207268 hSession = WinHttpOpen (
208269 NULL ,
209- WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY ,
270+ WINHTTP_ACCESS_TYPE_DEFAULT_PROXY ,
210271 WINHTTP_NO_PROXY_NAME,
211272 WINHTTP_NO_PROXY_BYPASS,
212273 url_parts.nScheme == INTERNET_SCHEME_HTTPS
@@ -218,7 +279,7 @@ PyObject *winhttp_urlopen(PyObject *, PyObject *args, PyObject *kwargs) {
218279 // retry without it.
219280 hSession = WinHttpOpen (
220281 NULL ,
221- WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY ,
282+ WINHTTP_ACCESS_TYPE_DEFAULT_PROXY ,
222283 WINHTTP_NO_PROXY_NAME,
223284 WINHTTP_NO_PROXY_BYPASS,
224285 0
@@ -248,6 +309,8 @@ PyObject *winhttp_urlopen(PyObject *, PyObject *args, PyObject *kwargs) {
248309 );
249310 CHECK_WINHTTP (hRequest);
250311
312+ CHECK_WINHTTP (winhttp_apply_proxy (hSession, hRequest, url));
313+
251314 opt = WINHTTP_DECOMPRESSION_FLAG_ALL;
252315 CHECK_WINHTTP (WinHttpSetOption (
253316 hRequest,
0 commit comments