Daniel Lehman : wininet: Copy should_bypass_proxy and domain_matches from winhttp.
Alexandre Julliard
julliard at winehq.org
Wed May 8 15:48:21 CDT 2013
Module: wine
Branch: master
Commit: cbeb11b5f83a47e57be851d5e9d1df5a82933023
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cbeb11b5f83a47e57be851d5e9d1df5a82933023
Author: Daniel Lehman <dlehman at esri.com>
Date: Mon May 6 11:16:28 2013 -0700
wininet: Copy should_bypass_proxy and domain_matches from winhttp.
---
dlls/wininet/http.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 83 insertions(+), 1 deletions(-)
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 188259d..7d5175e 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -1698,6 +1698,88 @@ static WCHAR *build_proxy_path_url(http_request_t *req)
return url;
}
+static BOOL HTTP_DomainMatches(LPCWSTR server, LPCWSTR domain)
+{
+ static const WCHAR localW[] = { '<','l','o','c','a','l','>',0 };
+ BOOL ret = FALSE;
+
+ if (!strcmpiW( domain, localW ) && !strchrW( server, '.' ))
+ ret = TRUE;
+ else if (*domain == '*')
+ {
+ if (domain[1] == '.')
+ {
+ LPCWSTR dot;
+
+ /* For a hostname to match a wildcard, the last domain must match
+ * the wildcard exactly. E.g. if the wildcard is *.a.b, and the
+ * hostname is www.foo.a.b, it matches, but a.b does not.
+ */
+ dot = strchrW( server, '.' );
+ if (dot)
+ {
+ int len = strlenW( dot + 1 );
+
+ if (len > strlenW( domain + 2 ))
+ {
+ LPCWSTR ptr;
+
+ /* The server's domain is longer than the wildcard, so it
+ * could be a subdomain. Compare the last portion of the
+ * server's domain.
+ */
+ ptr = dot + len + 1 - strlenW( domain + 2 );
+ if (!strcmpiW( ptr, domain + 2 ))
+ {
+ /* This is only a match if the preceding character is
+ * a '.', i.e. that it is a matching domain. E.g.
+ * if domain is '*.b.c' and server is 'www.ab.c' they
+ * do not match.
+ */
+ ret = *(ptr - 1) == '.';
+ }
+ }
+ else
+ ret = !strcmpiW( dot + 1, domain + 2 );
+ }
+ }
+ }
+ else
+ ret = !strcmpiW( server, domain );
+ return ret;
+}
+
+static BOOL HTTP_ShouldBypassProxy(appinfo_t *lpwai, LPCWSTR server)
+{
+ LPCWSTR ptr;
+ BOOL ret = FALSE;
+
+ if (!lpwai->proxyBypass) return FALSE;
+ ptr = lpwai->proxyBypass;
+ do {
+ LPCWSTR tmp = ptr;
+
+ ptr = strchrW( ptr, ';' );
+ if (!ptr)
+ ptr = strchrW( tmp, ' ' );
+ if (ptr)
+ {
+ if (ptr - tmp < INTERNET_MAX_HOST_NAME_LENGTH)
+ {
+ WCHAR domain[INTERNET_MAX_HOST_NAME_LENGTH];
+
+ memcpy( domain, tmp, (ptr - tmp) * sizeof(WCHAR) );
+ domain[ptr - tmp] = 0;
+ ret = HTTP_DomainMatches( server, domain );
+ }
+ ptr += 1;
+ }
+ else if (*tmp)
+ ret = HTTP_DomainMatches( server, tmp );
+ } while (ptr && !ret);
+ return ret;
+}
+
/***********************************************************************
* HTTP_DealWithProxy
*/
@@ -3247,7 +3329,7 @@ static DWORD HTTP_HttpOpenRequestW(http_session_t *session,
if (session->hostPort == INTERNET_INVALID_PORT_NUMBER)
session->hostPort = INTERNET_DEFAULT_HTTP_PORT;
- if (hIC->proxy && hIC->proxy[0])
+ if (hIC->proxy && hIC->proxy[0] && !HTTP_ShouldBypassProxy(hIC, session->hostName))
HTTP_DealWithProxy( hIC, session, request );
INTERNET_SendCallback(&session->hdr, dwContext,
More information about the wine-cvs
mailing list