Module: wine Branch: master Commit: 71fdd64bc6b0f8390e3a62fd814183ff3485ec1c URL: https://gitlab.winehq.org/wine/wine/-/commit/71fdd64bc6b0f8390e3a62fd814183f...
Author: Paul Gofman pgofman@codeweavers.com Date: Wed Nov 23 17:32:47 2022 -0600
winhttp: Cache script in download_script().
---
dlls/winhttp/session.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-)
diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c index 3d99e9b0ac6..8aa99f0ece7 100644 --- a/dlls/winhttp/session.c +++ b/dlls/winhttp/session.c @@ -1901,6 +1901,50 @@ static BOOL parse_script_result( const char *result, WINHTTP_PROXY_INFO *info ) return TRUE; }
+static SRWLOCK cache_lock = SRWLOCK_INIT; +static DWORD cached_script_size; +static ULONGLONG cache_update_time; +static char *cached_script; +static WCHAR *cached_url; + +static BOOL get_cached_script( const WCHAR *url, char **buffer, DWORD *out_size ) +{ + BOOL ret = FALSE; + + *buffer = NULL; + *out_size = 0; + + AcquireSRWLockExclusive( &cache_lock ); + if (cached_url && !wcscmp( cached_url, url ) && GetTickCount64() - cache_update_time < 60000) + { + ret = TRUE; + if (cached_script && (*buffer = malloc( cached_script_size ))) + { + memcpy( *buffer, cached_script, cached_script_size ); + *out_size = cached_script_size; + } + } + ReleaseSRWLockExclusive( &cache_lock ); + return ret; +} + +static void cache_script( const WCHAR *url, char *buffer, DWORD size ) +{ + AcquireSRWLockExclusive( &cache_lock ); + free( cached_url ); + free( cached_script ); + cached_script_size = 0; + cached_script = NULL; + + if ((cached_url = wcsdup( url )) && buffer && (cached_script = malloc( size ))) + { + memcpy( cached_script, buffer, size ); + cached_script_size = size; + } + cache_update_time = GetTickCount64(); + ReleaseSRWLockExclusive( &cache_lock ); +} + static char *download_script( const WCHAR *url, DWORD *out_size ) { static const WCHAR *acceptW[] = {L"*/*", NULL}; @@ -1908,9 +1952,14 @@ static char *download_script( const WCHAR *url, DWORD *out_size ) WCHAR *hostname; URL_COMPONENTSW uc; DWORD status, size = sizeof(status), offset, to_read, bytes_read, flags = 0; - char *tmp, *buffer = NULL; + char *tmp, *buffer;
- *out_size = 0; + if (get_cached_script( url, &buffer, out_size )) + { + TRACE( "Returning cached result.\n" ); + if (!buffer) SetLastError( ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT ); + return buffer; + }
memset( &uc, 0, sizeof(uc) ); uc.dwStructSize = sizeof(uc); @@ -1957,6 +2006,7 @@ done: WinHttpCloseHandle( con ); WinHttpCloseHandle( ses ); free( hostname ); + cache_script( url, buffer, *out_size ); if (!buffer) SetLastError( ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT ); return buffer; }