summaryrefslogtreecommitdiff
path: root/curl/curl-7.26.0_win-proxy.patch
blob: e3beb4004885014310ce72200145287761f87a7b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
--- curl-7.26.0/lib/Makefile.vc9
+++ misc/build/curl-7.26.0/lib/Makefile.vc9
@@ -116,7 +116,7 @@ LFLAGS     = /nologo /machine:$(MACHINE)
 SSLLIBS    = libeay32.lib ssleay32.lib
 ZLIBLIBSDLL= zdll.lib
 ZLIBLIBS   = zlib.lib
-WINLIBS    = ws2_32.lib wldap32.lib
+WINLIBS    = ws2_32.lib wldap32.lib winhttp.lib
 CFLAGS     = $(CFLAGS) $(EXCFLAGS)
 
 CFGSET     = FALSE
--- curl-7.26.0/lib/url.c
+++ misc/build/curl-7.26.0/lib/url.c
@@ -80,6 +80,10 @@ void idn_free (void *ptr);
 int curl_win32_idn_to_ascii(const char *in, char **out);
 #endif  /* USE_LIBIDN */
 
+#ifdef WIN32
+#include <WinHttp.h>
+#endif
+
 #include "urldata.h"
 #include "netrc.h"
 
@@ -4111,6 +4115,21 @@ static bool check_noproxy(const char* name, const char* no_proxy)
   return FALSE;
 }
 
+#ifdef WIN32
+static char* wstrToCstr( LPWSTR wStr )
+{
+  int bufSize;
+  char* out = NULL;
+  if(wStr != NULL) {
+    bufSize = WideCharToMultiByte(
+      CP_ACP,  0, wStr, -1, NULL, 0, NULL, NULL );
+    out = ( char* )malloc( bufSize * sizeof(char));
+    WideCharToMultiByte( CP_ACP, 0, wStr, -1, out, bufSize, NULL, NULL );
+  }
+  return out;
+}
+#endif
+
 /****************************************************************
 * Detect what (if any) proxy to use. Remember that this selects a host
 * name and is not limited to HTTP proxies only.
@@ -4119,6 +4138,7 @@ static bool check_noproxy(const char* name, const char* no_proxy)
 static char *detect_proxy(struct connectdata *conn)
 {
   char *proxy = NULL;
+  char *no_proxy=NULL;
 
 #ifndef CURL_DISABLE_HTTP
   /* If proxy was not specified, we check for default proxy environment
@@ -4138,7 +4158,63 @@ static char *detect_proxy(struct connectdata *conn)
    * For compatibility, the all-uppercase versions of these variables are
    * checked if the lowercase versions don't exist.
    */
-  char *no_proxy=NULL;
+#ifdef WIN32
+  WINHTTP_CURRENT_USER_IE_PROXY_CONFIG *ieProxyConfig;
+  ieProxyConfig = (WINHTTP_CURRENT_USER_IE_PROXY_CONFIG*)
+    malloc(sizeof(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG));
+  if(WinHttpGetIEProxyConfigForCurrentUser(ieProxyConfig)) {
+    if(!ieProxyConfig->fAutoDetect) {
+      char *ieProxy;
+      char *ieNoProxy;
+      char* pos;
+
+      ieProxy = wstrToCstr(ieProxyConfig->lpszProxy);
+      ieNoProxy = wstrToCstr(ieProxyConfig->lpszProxyBypass);
+
+      /* Convert the ieNoProxy into a proper no_proxy value */
+      if(NULL != ieNoProxy) {
+        no_proxy = strdup(ieNoProxy);
+        pos = strpbrk(no_proxy, "; ");
+        while(NULL != pos) {
+          no_proxy[pos-no_proxy] = ',';
+          pos = strpbrk(no_proxy, "; ");
+        }
+      }
+
+      if(!check_noproxy(conn->host.name, no_proxy)) {
+        /* Look for the http proxy setting */
+        char* tok;
+
+        if(NULL != ieProxy) {
+          tok = strtok(ieProxy, ";");
+          if(strchr(tok, '=') == NULL) {
+            proxy = strdup(ieProxy);
+          }
+          else {
+            do {
+              if(strncmp(tok, "http=", 5) == 0) {
+                /* We found HTTP proxy value, then use it */
+                proxy = strdup( tok + 5 );
+              }
+              tok = strtok(NULL, ";");
+            }
+            while(NULL != tok);
+          }
+        }
+      }
+
+      free(ieProxy);
+      free(ieNoProxy);
+    }
+    else {
+      /* TODO Handle the Proxy config Auto Detection case */
+    }
+
+    GlobalFree( ieProxyConfig->lpszAutoConfigUrl );
+    GlobalFree( ieProxyConfig->lpszProxy );
+    GlobalFree( ieProxyConfig->lpszProxyBypass );
+  }
+#else /* !WIN32 */
   char proxy_env[128];
 
   no_proxy=curl_getenv("no_proxy");
@@ -4189,9 +4265,9 @@ static char *detect_proxy(struct connectdata *conn)
     }
   } /* if(!check_noproxy(conn->host.name, no_proxy)) - it wasn't specified
        non-proxy */
+#endif /* WIN32 */
   if(no_proxy)
     free(no_proxy);
-
 #else /* !CURL_DISABLE_HTTP */
 
   (void)conn;