You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
295 lines
9.3 KiB
295 lines
9.3 KiB
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
cachelogic.hxx
|
|
|
|
Abstract:
|
|
|
|
This file contains internal flags, structs, and function
|
|
prototypes for the HTTP-URLCache interaction layer
|
|
|
|
Author:
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef __CACHEINFO_HXX__
|
|
#define __CACHEINFO_HXX__
|
|
|
|
enum CACHE_STATE { CHECK_IF_WANT_CACHE,
|
|
CHECK_IF_IN_CACHE,
|
|
ADD_PARTIAL_CONTENT_UMS_AND_RANGE_HEADER,
|
|
ADD_NORMAL_CONTENT_IMS_HEADER,
|
|
PREPARE_DOWNLOAD_FROM_INET,
|
|
CACHE_SEND_ERROR,
|
|
PREPARE_READ_FROM_CACHE,
|
|
PARTIAL_READ,
|
|
PREPARE_READ_FROM_INET_AFTER_200_RESPONSE,
|
|
BEGIN_DOWNLOAD_FROM_INET,
|
|
END_READ_DATA,
|
|
BEGIN_CACHE_READ,
|
|
END_CACHE_READ,
|
|
BEGIN_CACHE_WRITE,
|
|
END_CACHE_WRITE,
|
|
DOWNLOAD_FROM_INET_WITH_CACHE_WRITE,
|
|
DOWNLOAD_FROM_INET_WITHOUT_CACHE_WRITE,
|
|
WRITE_TO_CACHE_ENTRY,
|
|
PREP_FOR_CACHE_WRITE,
|
|
COMMIT_PARTIAL_CACHE_ENTRY,
|
|
SEND_REQUEST
|
|
};
|
|
#define HTTP_LAST_MODIFIED_SZ "Last-Modified:"
|
|
|
|
#define HTTP_EXPIRES_SZ "Expires:"
|
|
|
|
#define HTTP_IF_MODIFIED_SINCE_SZ "If-Modified-Since:"
|
|
#define HTTP_IF_MODIFIED_SINCE_LEN (sizeof(HTTP_IF_MODIFIED_SINCE_SZ) - 1)
|
|
|
|
#define HTTP_UMS_SZ "Unless-Modified-Since"
|
|
#define HTTP_UMS_LEN (sizeof(HTTP_UMS_SZ) - 1)
|
|
|
|
#define HTTP_IF_RANGE_SZ "If-Range"
|
|
#define HTTP_IF_RANGE_LEN (sizeof(HTTP_IF_RANGE_SZ) - 1)
|
|
|
|
#define HTTP_RANGE_SZ "Range"
|
|
#define HTTP_RANGE_LEN (sizeof(HTTP_RANGE_SZ) - 1)
|
|
|
|
#define HTTP_IF_NONE_MATCH_SZ "If-None-Match"
|
|
#define HTTP_IF_NONE_MATCH_LEN (sizeof(HTTP_IF_NONE_MATCH_SZ) - 1)
|
|
|
|
#define NO_STORE_SZ "no-store"
|
|
#define NO_STORE_LEN (sizeof(NO_STORE_SZ) -1)
|
|
|
|
#define MUST_REVALIDATE_SZ "must-revalidate"
|
|
#define MUST_REVALIDATE_LEN (sizeof(MUST_REVALIDATE_SZ) -1)
|
|
|
|
#define MAX_AGE_SZ "max-age"
|
|
#define MAX_AGE_LEN (sizeof(MAX_AGE_SZ) -1)
|
|
|
|
#define PRIVATE_SZ "private"
|
|
#define PRIVATE_LEN (sizeof(PRIVATE_SZ) - 1)
|
|
|
|
#define POSTCHECK_SZ "post-check"
|
|
#define POSTCHECK_LEN (sizeof(POSTCHECK_SZ) -1)
|
|
|
|
#define PRECHECK_SZ "pre-check"
|
|
#define PRECHECK_LEN (sizeof(PRECHECK_SZ) -1)
|
|
|
|
#define FILENAME_SZ "filename"
|
|
#define FILENAME_LEN (sizeof(FILENAME_SZ) - 1)
|
|
|
|
#define HTTP1_1_SZ "HTTP/1.1"
|
|
#define HTTP1_1_LEN (sizeof(HTTP1_1_SZ) - 1)
|
|
|
|
#define NO_CACHE_SZ "no-cache"
|
|
#define NO_CACHE_LEN (sizeof(NO_CACHE_SZ) -1)
|
|
|
|
#define USER_AGENT_SZ "user-agent"
|
|
#define USER_AGENT_LEN (sizeof(USER_AGENT_SZ) - 1)
|
|
|
|
#define BYTES_SZ "bytes"
|
|
// #define BYTES_LEN (sizeof(BYTES_SZ) - 1)
|
|
|
|
|
|
//
|
|
// An instance of the HTTPCACHE_REQUEST class only deals with the cache
|
|
// interaction of one HTTP GET request
|
|
//
|
|
class HTTPCACHE_REQUEST
|
|
{
|
|
private:
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Private members used in both cache read and cache write
|
|
//
|
|
|
|
CACHE_STATE _nextState; // initialized in the constructor
|
|
CACHE_ENTRY_INFOEX * _pCacheEntryInfo; // initialized in OpenCacheReadStream()
|
|
|
|
DWORD _RealCacheFileSize;
|
|
DWORD _VirtualCacheFileSize;
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Cache-read related private variables and member functions (cacheread.cxx)
|
|
//
|
|
|
|
// The handle to the cache object. Used with the URLCACHE API
|
|
HANDLE _hCacheReadStream; // initialized in OpenCacheReadStream()
|
|
|
|
// This handle is used when for reading partial cache entry
|
|
HANDLE _hSparseFileReadHandle;
|
|
|
|
// Position of the current data stream
|
|
DWORD _dwCurrentStreamPosition;
|
|
|
|
// This variable indicates that an partial entry already exists in the
|
|
// cache, and so after the user received the cached content in the
|
|
// first ReadData() call, subsequent ReadData() calls should start
|
|
// retrieving the data from the Internet.
|
|
BOOL _fIsPartialCache;
|
|
|
|
BOOL _fCacheReadInProgress;
|
|
BOOL _fLazyUpdate;
|
|
|
|
BOOL TransmitRequest(DWORD *);
|
|
BOOL IsExpired();
|
|
BOOL AddIfModifiedSinceHeaders();
|
|
VOID CheckResponseAfterIMS(DWORD);
|
|
VOID CalculateTimeStampsForCache();
|
|
BOOL ReadDataFromCache(LPVOID, DWORD, LPDWORD);
|
|
BOOL OpenCacheReadStream();
|
|
BOOL CloseCacheReadStream();
|
|
VOID ResetCacheReadVariables();
|
|
BOOL FakeCacheResponseHeaders();
|
|
BOOL AddTimeResponseHeader(
|
|
IN FILETIME fTime,
|
|
IN DWORD dwQueryIndex
|
|
);
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Cache-write related private variables and member functions (cachewrite.cxx)
|
|
//
|
|
|
|
HANDLE _hCacheWriteFile;
|
|
|
|
// If commiting the file fails, then we want to get rid of it by flushing
|
|
// it out in the destructor
|
|
BOOL _fDeleteWriteFile;
|
|
|
|
// What the filename and extension should be when it's committed to the
|
|
// cache. These variables DO NOT indicate the full-path at which the
|
|
// cache content resides in the Temporary Internet Files folder
|
|
LPSTR _lpszFileName;
|
|
LPSTR _lpszFileExtension;
|
|
|
|
// The full-path of the file that cache contents will be writing to
|
|
LPSTR _lpszCacheWriteLocalFilename;
|
|
|
|
BOOL _fCacheWriteInProgress;
|
|
|
|
BOOL AppendWriteBuffer(LPCSTR lpBuffer, DWORD dwBufferLen);
|
|
BOOL CommitCacheFileEntry(BOOL fNormal);
|
|
VOID SetFilenameAndExtForCacheWrite();
|
|
BOOL ExtractHeadersForCacheCommit(LPSTR, LPDWORD);
|
|
BOOL FCanWriteHTTP1_1ResponseToCache(BOOL *);
|
|
BOOL CreateCacheWriteFile();
|
|
BOOL WriteToCacheFile(LPBYTE, DWORD, LPDWORD);
|
|
BOOL IsStaticImage();
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Routines related to partial cache entries
|
|
//
|
|
BOOL IsPartialResponseCacheable(VOID);
|
|
VOID DeletePartialCacheFile(VOID);
|
|
BOOL FakePartialCacheResponseHeaders(VOID);
|
|
BOOL IsPartialCacheEntry(VOID);
|
|
VOID LockPartialCacheEntry(VOID);
|
|
BOOL AddRangeRequestHeaders();
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Time stamps parsed from response
|
|
//
|
|
|
|
// These variables represent file times calculated from HTTP headers from
|
|
// the HTTP response. They are calculated in the GetTimeStampsCall() call, and
|
|
// are used in the CommitCacheEntry() call.
|
|
|
|
FILETIME _ftLastModTime;
|
|
FILETIME _ftExpiryTime;
|
|
FILETIME _ftPostCheckTime;
|
|
|
|
BOOL _fHasExpiry;
|
|
BOOL _fHasLastModTime;
|
|
BOOL _fHasPostCheck;
|
|
BOOL _fMustRevalidate;
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Global flags.
|
|
//
|
|
|
|
// Global cache flags passed in from the constructor
|
|
DWORD _dwCacheFlags;
|
|
DWORD _dwRequestFlags;
|
|
|
|
// Request handle for WinHTTP Request object routines
|
|
HINTERNET _hRequest; // initialized in the contsructor
|
|
|
|
// The URL that this object is dealing with
|
|
TCHAR _szUrl[INTERNET_MAX_URL_LENGTH];
|
|
|
|
public:
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Get operations to query for the object's properties
|
|
//
|
|
LPSTR GetUrl()
|
|
{
|
|
return _szUrl;
|
|
}
|
|
|
|
INTERNET_SCHEME GetScheme()
|
|
{
|
|
return (_dwRequestFlags & WINHTTP_FLAG_SECURE ? INTERNET_SCHEME_HTTPS: INTERNET_SCHEME_HTTP);
|
|
}
|
|
|
|
HINTERNET GetRequestHandle()
|
|
{
|
|
return _hRequest;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Public interface of the HTTPCACHE_REQUEST class
|
|
//
|
|
HTTPCACHE_REQUEST(HINTERNET);
|
|
~HTTPCACHE_REQUEST();
|
|
BOOL SendRequest(
|
|
IN LPCWSTR lpszHeaders,
|
|
IN DWORD dwHeadersLength,
|
|
IN LPVOID lpOptional,
|
|
IN DWORD dwOptionalLength
|
|
);
|
|
|
|
BOOL ReceiveResponse(LPVOID);
|
|
BOOL QueryDataAvailable(LPDWORD);
|
|
BOOL ReadData(LPVOID, DWORD, LPDWORD);
|
|
BOOL CloseRequestHandle();
|
|
|
|
};
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Utility functions
|
|
//
|
|
/////////////////////////////////////////////////////////////////////
|
|
char * StrTokExA (char ** pstring, const char * control);
|
|
LPSTR
|
|
GetFileExtensionFromUrl(
|
|
IN LPSTR lpszUrl,
|
|
IN OUT LPDWORD lpdwLength);
|
|
BOOL
|
|
GetFileExtensionFromMimeType(
|
|
IN LPCSTR lpszMimeType,
|
|
IN DWORD dwMimeLen,
|
|
IN LPSTR lpszFileExtension,
|
|
IN OUT LPDWORD lpdwLen
|
|
);
|
|
PRIVATE BOOL FExcludedMimeType(
|
|
IN LPSTR lpszMimeType,
|
|
IN DWORD dwMimeTypeSize
|
|
);
|
|
|
|
|
|
|
|
#endif // __CACHEINFO_HXX__
|