Jacek Caban : urlmon: Added https pluggable protocol handler.

Alexandre Julliard julliard at winehq.org
Mon Jan 12 10:40:44 CST 2009


Module: wine
Branch: master
Commit: 954e55b55baace603f1ccbeef00ef3069eee4e95
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=954e55b55baace603f1ccbeef00ef3069eee4e95

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sun Jan 11 21:19:46 2009 +0100

urlmon: Added https pluggable protocol handler.

---

 dlls/urlmon/http.c |   51 +++++++++++++++++++++++++++++----------------------
 1 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/dlls/urlmon/http.c b/dlls/urlmon/http.c
index 20e90ed..9ca8306 100644
--- a/dlls/urlmon/http.c
+++ b/dlls/urlmon/http.c
@@ -63,6 +63,7 @@ typedef struct {
     const IInternetProtocolVtbl *lpInternetProtocolVtbl;
     const IInternetPriorityVtbl *lpInternetPriorityVtbl;
 
+    BOOL https;
     DWORD flags, grfBINDF;
     BINDINFO bind_info;
     IInternetProtocolSink *protocol_sink;
@@ -309,7 +310,8 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
     LPOLESTR user_agent = NULL, accept_mimes[257];
     HRESULT hres;
 
-    static const WCHAR wszHttp[] = {'h','t','t','p',':'};
+    static const WCHAR httpW[] = {'h','t','t','p',':'};
+    static const WCHAR httpsW[] = {'h','t','t','p','s',':'};
     static const WCHAR wszBindVerb[BINDVERB_CUSTOM][5] =
         {{'G','E','T',0},
          {'P','O','S','T',0},
@@ -330,8 +332,9 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
         goto done;
     }
 
-    if (strlenW(szUrl) < sizeof(wszHttp)/sizeof(WCHAR)
-        || memcmp(szUrl, wszHttp, sizeof(wszHttp)))
+    if(This->https
+        ? strncmpW(szUrl, httpsW, sizeof(httpsW)/sizeof(WCHAR))
+        : strncmpW(szUrl, httpW, sizeof(httpW)/sizeof(WCHAR)))
     {
         hres = MK_E_SYNTAX;
         goto done;
@@ -351,7 +354,7 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
     user = strndupW(url.lpszUserName, url.dwUserNameLength);
     pass = strndupW(url.lpszPassword, url.dwPasswordLength);
     if (!url.nPort)
-        url.nPort = INTERNET_DEFAULT_HTTP_PORT;
+        url.nPort = This->https ? INTERNET_DEFAULT_HTTPS_PORT : INTERNET_DEFAULT_HTTP_PORT;
 
     if(!(This->grfBINDF & BINDF_FROMURLMON))
         IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_DIRECTBIND, NULL);
@@ -397,7 +400,9 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
     InternetSetStatusCallbackW(This->internet, HTTPPROTOCOL_InternetStatusCallback);
 
     This->connect = InternetConnectW(This->internet, host, url.nPort, user,
-                                     pass, INTERNET_SERVICE_HTTP, 0, (DWORD_PTR)This);
+                                     pass, INTERNET_SERVICE_HTTP,
+                                     This->https ? INTERNET_FLAG_SECURE : 0,
+                                     (DWORD_PTR)This);
     if (!This->connect)
     {
         WARN("InternetConnect failed: %d\n", GetLastError());
@@ -421,6 +426,8 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
         request_flags |= INTERNET_FLAG_NO_CACHE_WRITE;
     if (This->grfBINDF & BINDF_NEEDFILE)
         request_flags |= INTERNET_FLAG_NEED_FILE;
+    if (This->https)
+        request_flags |= INTERNET_FLAG_SECURE;
     This->request = HttpOpenRequestW(This->connect, This->bind_info.dwBindVerb < BINDVERB_CUSTOM ?
                                      wszBindVerb[This->bind_info.dwBindVerb] :
                                      This->bind_info.szCustomVerb,
@@ -923,36 +930,36 @@ static const IInternetProtocolVtbl HttpProtocolVtbl = {
     HttpProtocol_UnlockRequest
 };
 
-HRESULT HttpProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj)
+HRESULT create_http_protocol(BOOL https, void **ppobj)
 {
     HttpProtocol *ret;
 
-    TRACE("(%p %p)\n", pUnkOuter, ppobj);
-
-    URLMON_LockModule();
-
-    ret = heap_alloc(sizeof(HttpProtocol));
+    ret = heap_alloc_zero(sizeof(HttpProtocol));
+    if(!ret)
+        return E_OUTOFMEMORY;
 
     ret->lpInternetProtocolVtbl = &HttpProtocolVtbl;
     ret->lpInternetPriorityVtbl = &HttpPriorityVtbl;
-    ret->flags = ret->grfBINDF = 0;
-    memset(&ret->bind_info, 0, sizeof(ret->bind_info));
-    ret->protocol_sink = 0;
-    ret->http_negotiate = 0;
-    ret->internet = ret->connect = ret->request = 0;
-    ret->full_header = 0;
-    ret->lock = 0;
-    ret->current_position = ret->content_length = ret->available_bytes = 0;
-    ret->priority = 0;
+
+    ret->https = https;
     ret->ref = 1;
 
     *ppobj = PROTOCOL(ret);
     
+    URLMON_LockModule();
     return S_OK;
 }
 
+HRESULT HttpProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj)
+{
+    TRACE("(%p %p)\n", pUnkOuter, ppobj);
+
+    return create_http_protocol(FALSE, ppobj);
+}
+
 HRESULT HttpSProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj)
 {
-    FIXME("(%p %p)\n", pUnkOuter, ppobj);
-    return E_NOINTERFACE;
+    TRACE("(%p %p)\n", pUnkOuter, ppobj);
+
+    return create_http_protocol(TRUE, ppobj);
 }




More information about the wine-cvs mailing list