📄 http.c
字号:
Host = HTTP_GetHeader(lpwhr,szHost);
len = lstrlenW(Host->lpszValue) + strlenW(szUrlForm);
lpszUrl = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
sprintfW( lpszUrl, szUrlForm, Host->lpszValue );
if (!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_COOKIES) &&
InternetGetCookieW(lpszUrl, NULL, NULL, &nCookieSize))
{
int cnt = 0;
static const WCHAR szCookie[] = {'C','o','o','k','i','e',':',' ',0};
static const WCHAR szcrlf[] = {'\r','\n',0};
lpszCookies = HeapAlloc(GetProcessHeap(), 0, (nCookieSize + 1 + 8)*sizeof(WCHAR));
cnt += sprintfW(lpszCookies, szCookie);
InternetGetCookieW(lpszUrl, NULL, lpszCookies + cnt, &nCookieSize);
strcatW(lpszCookies, szcrlf);
HTTP_HttpAddRequestHeadersW(lpwhr, lpszCookies, strlenW(lpszCookies),
HTTP_ADDREQ_FLAG_ADD);
HeapFree(GetProcessHeap(), 0, lpszCookies);
}
HeapFree(GetProcessHeap(), 0, lpszUrl);
INTERNET_SendCallback(&lpwhs->hdr, dwContext,
INTERNET_STATUS_HANDLE_CREATED, &handle,
sizeof(handle));
/*
* A STATUS_REQUEST_COMPLETE is NOT sent here as per my tests on windows
*/
/*
* According to my tests. The name is not resolved until a request is Opened
*/
INTERNET_SendCallback(&lpwhr->hdr, dwContext,
INTERNET_STATUS_RESOLVING_NAME,
lpwhs->lpszServerName,
strlenW(lpwhs->lpszServerName)+1);
if (!GetAddress(lpwhs->lpszServerName, lpwhs->nServerPort,
&lpwhs->socketAddress))
{
INTERNET_SetLastError(ERROR_INTERNET_NAME_NOT_RESOLVED);
InternetCloseHandle( handle );
handle = NULL;
goto lend;
}
inet_ntop(lpwhs->socketAddress.sin_family, &lpwhs->socketAddress.sin_addr,
szaddr, sizeof(szaddr));
INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
INTERNET_STATUS_NAME_RESOLVED,
szaddr, strlen(szaddr)+1);
lend:
if( lpwhr )
WININET_Release( &lpwhr->hdr );
TRACE("<-- %p (%p)\n", handle, lpwhr);
return handle;
}
typedef struct std_hdr_data
{
const WCHAR* hdrStr;
INT hdrIndex;
} std_hdr_data;
static const WCHAR szAccept[] = { 'A','c','c','e','p','t',0 };
static const WCHAR szAccept_Charset[] = { 'A','c','c','e','p','t','-','C','h','a','r','s','e','t', 0 };
static const WCHAR szAccept_Encoding[] = { 'A','c','c','e','p','t','-','E','n','c','o','d','i','n','g',0 };
static const WCHAR szAccept_Language[] = { 'A','c','c','e','p','t','-','L','a','n','g','u','a','g','e',0 };
static const WCHAR szAccept_Ranges[] = { 'A','c','c','e','p','t','-','R','a','n','g','e','s',0 };
static const WCHAR szAge[] = { 'A','g','e',0 };
static const WCHAR szAllow[] = { 'A','l','l','o','w',0 };
static const WCHAR szAuthorization[] = { 'A','u','t','h','o','r','i','z','a','t','i','o','n',0 };
static const WCHAR szCache_Control[] = { 'C','a','c','h','e','-','C','o','n','t','r','o','l',0 };
static const WCHAR szConnection[] = { 'C','o','n','n','e','c','t','i','o','n',0 };
static const WCHAR szContent_Base[] = { 'C','o','n','t','e','n','t','-','B','a','s','e',0 };
static const WCHAR szContent_Encoding[] = { 'C','o','n','t','e','n','t','-','E','n','c','o','d','i','n','g',0 };
static const WCHAR szContent_ID[] = { 'C','o','n','t','e','n','t','-','I','D',0 };
static const WCHAR szContent_Language[] = { 'C','o','n','t','e','n','t','-','L','a','n','g','u','a','g','e',0 };
static const WCHAR szContent_Length[] = { 'C','o','n','t','e','n','t','-','L','e','n','g','t','h',0 };
static const WCHAR szContent_Location[] = { 'C','o','n','t','e','n','t','-','L','o','c','a','t','i','o','n',0 };
static const WCHAR szContent_MD5[] = { 'C','o','n','t','e','n','t','-','M','D','5',0 };
static const WCHAR szContent_Range[] = { 'C','o','n','t','e','n','t','-','R','a','n','g','e',0 };
static const WCHAR szContent_Transfer_Encoding[] = { 'C','o','n','t','e','n','t','-','T','r','a','n','s','f','e','r','-','E','n','c','o','d','i','n','g',0 };
static const WCHAR szContent_Type[] = { 'C','o','n','t','e','n','t','-','T','y','p','e',0 };
static const WCHAR szCookie[] = { 'C','o','o','k','i','e',0 };
static const WCHAR szDate[] = { 'D','a','t','e',0 };
static const WCHAR szFrom[] = { 'F','r','o','m',0 };
static const WCHAR szETag[] = { 'E','T','a','g',0 };
static const WCHAR szExpect[] = { 'E','x','p','e','c','t',0 };
static const WCHAR szExpires[] = { 'E','x','p','i','r','e','s',0 };
static const WCHAR szIf_Match[] = { 'I','f','-','M','a','t','c','h',0 };
static const WCHAR szIf_Modified_Since[] = { 'I','f','-','M','o','d','i','f','i','e','d','-','S','i','n','c','e',0 };
static const WCHAR szIf_None_Match[] = { 'I','f','-','N','o','n','e','-','M','a','t','c','h',0 };
static const WCHAR szIf_Range[] = { 'I','f','-','R','a','n','g','e',0 };
static const WCHAR szIf_Unmodified_Since[] = { 'I','f','-','U','n','m','o','d','i','f','i','e','d','-','S','i','n','c','e',0 };
static const WCHAR szLast_Modified[] = { 'L','a','s','t','-','M','o','d','i','f','i','e','d',0 };
static const WCHAR szLocation[] = { 'L','o','c','a','t','i','o','n',0 };
static const WCHAR szMax_Forwards[] = { 'M','a','x','-','F','o','r','w','a','r','d','s',0 };
static const WCHAR szMime_Version[] = { 'M','i','m','e','-','V','e','r','s','i','o','n',0 };
static const WCHAR szPragma[] = { 'P','r','a','g','m','a',0 };
static const WCHAR szProxy_Authenticate[] = { 'P','r','o','x','y','-','A','u','t','h','e','n','t','i','c','a','t','e',0 };
static const WCHAR szProxy_Connection[] = { 'P','r','o','x','y','-','C','o','n','n','e','c','t','i','o','n',0 };
static const WCHAR szPublic[] = { 'P','u','b','l','i','c',0 };
static const WCHAR szRange[] = { 'R','a','n','g','e',0 };
static const WCHAR szReferer[] = { 'R','e','f','e','r','e','r',0 };
static const WCHAR szRetry_After[] = { 'R','e','t','r','y','-','A','f','t','e','r',0 };
static const WCHAR szServer[] = { 'S','e','r','v','e','r',0 };
static const WCHAR szSet_Cookie[] = { 'S','e','t','-','C','o','o','k','i','e',0 };
static const WCHAR szTransfer_Encoding[] = { 'T','r','a','n','s','f','e','r','-','E','n','c','o','d','i','n','g',0 };
static const WCHAR szUnless_Modified_Since[] = { 'U','n','l','e','s','s','-','M','o','d','i','f','i','e','d','-','S','i','n','c','e',0 };
static const WCHAR szUpgrade[] = { 'U','p','g','r','a','d','e',0 };
static const WCHAR szURI[] = { 'U','R','I',0 };
static const WCHAR szUser_Agent[] = { 'U','s','e','r','-','A','g','e','n','t',0 };
static const WCHAR szVary[] = { 'V','a','r','y',0 };
static const WCHAR szVia[] = { 'V','i','a',0 };
static const WCHAR szWarning[] = { 'W','a','r','n','i','n','g',0 };
static const WCHAR szWWW_Authenticate[] = { 'W','W','W','-','A','u','t','h','e','n','t','i','c','a','t','e',0 };
static const std_hdr_data SORTED_STANDARD_HEADERS[] = {
{szAccept, HTTP_QUERY_ACCEPT,},
{szAccept_Charset, HTTP_QUERY_ACCEPT_CHARSET,},
{szAccept_Encoding, HTTP_QUERY_ACCEPT_ENCODING,},
{szAccept_Language, HTTP_QUERY_ACCEPT_LANGUAGE,},
{szAccept_Ranges, HTTP_QUERY_ACCEPT_RANGES,},
{szAge, HTTP_QUERY_AGE,},
{szAllow, HTTP_QUERY_ALLOW,},
{szAuthorization, HTTP_QUERY_AUTHORIZATION,},
{szCache_Control, HTTP_QUERY_CACHE_CONTROL,},
{szConnection, HTTP_QUERY_CONNECTION,},
{szContent_Base, HTTP_QUERY_CONTENT_BASE,},
{szContent_Encoding, HTTP_QUERY_CONTENT_ENCODING,},
{szContent_ID, HTTP_QUERY_CONTENT_ID,},
{szContent_Language, HTTP_QUERY_CONTENT_LANGUAGE,},
{szContent_Length, HTTP_QUERY_CONTENT_LENGTH,},
{szContent_Location, HTTP_QUERY_CONTENT_LOCATION,},
{szContent_MD5, HTTP_QUERY_CONTENT_MD5,},
{szContent_Range, HTTP_QUERY_CONTENT_RANGE,},
{szContent_Transfer_Encoding,HTTP_QUERY_CONTENT_TRANSFER_ENCODING,},
{szContent_Type, HTTP_QUERY_CONTENT_TYPE,},
{szCookie, HTTP_QUERY_COOKIE,},
{szDate, HTTP_QUERY_DATE,},
{szETag, HTTP_QUERY_ETAG,},
{szExpect, HTTP_QUERY_EXPECT,},
{szExpires, HTTP_QUERY_EXPIRES,},
{szFrom, HTTP_QUERY_DERIVED_FROM,},
{szHost, HTTP_QUERY_HOST,},
{szIf_Match, HTTP_QUERY_IF_MATCH,},
{szIf_Modified_Since, HTTP_QUERY_IF_MODIFIED_SINCE,},
{szIf_None_Match, HTTP_QUERY_IF_NONE_MATCH,},
{szIf_Range, HTTP_QUERY_IF_RANGE,},
{szIf_Unmodified_Since, HTTP_QUERY_IF_UNMODIFIED_SINCE,},
{szLast_Modified, HTTP_QUERY_LAST_MODIFIED,},
{szLocation, HTTP_QUERY_LOCATION,},
{szMax_Forwards, HTTP_QUERY_MAX_FORWARDS,},
{szMime_Version, HTTP_QUERY_MIME_VERSION,},
{szPragma, HTTP_QUERY_PRAGMA,},
{szProxy_Authenticate, HTTP_QUERY_PROXY_AUTHENTICATE,},
{szProxy_Authorization, HTTP_QUERY_PROXY_AUTHORIZATION,},
{szProxy_Connection, HTTP_QUERY_PROXY_CONNECTION,},
{szPublic, HTTP_QUERY_PUBLIC,},
{szRange, HTTP_QUERY_RANGE,},
{szReferer, HTTP_QUERY_REFERER,},
{szRetry_After, HTTP_QUERY_RETRY_AFTER,},
{szServer, HTTP_QUERY_SERVER,},
{szSet_Cookie, HTTP_QUERY_SET_COOKIE,},
{szStatus, HTTP_QUERY_STATUS_CODE,},
{szTransfer_Encoding, HTTP_QUERY_TRANSFER_ENCODING,},
{szUnless_Modified_Since, HTTP_QUERY_UNLESS_MODIFIED_SINCE,},
{szUpgrade, HTTP_QUERY_UPGRADE,},
{szURI, HTTP_QUERY_URI,},
{szUser_Agent, HTTP_QUERY_USER_AGENT,},
{szVary, HTTP_QUERY_VARY,},
{szVia, HTTP_QUERY_VIA,},
{szWarning, HTTP_QUERY_WARNING,},
{szWWW_Authenticate, HTTP_QUERY_WWW_AUTHENTICATE,},
};
/***********************************************************************
* HTTP_HttpQueryInfoW (internal)
*/
static BOOL WINAPI HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel,
LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex)
{
LPHTTPHEADERW lphttpHdr = NULL;
BOOL bSuccess = FALSE;
BOOL request_only = dwInfoLevel & HTTP_QUERY_FLAG_REQUEST_HEADERS;
/* Find requested header structure */
if ((dwInfoLevel & ~HTTP_QUERY_MODIFIER_FLAGS_MASK) == HTTP_QUERY_CUSTOM)
{
INT requested_index = (lpdwIndex)?(*lpdwIndex):0;
INT index = HTTP_GetCustomHeaderIndex(lpwhr, (LPWSTR)lpBuffer,
requested_index,request_only);
if (index < 0)
return bSuccess;
else
lphttpHdr = &lpwhr->pCustHeaders[index];
if (lpdwIndex)
(*lpdwIndex)++;
}
else
{
INT index = dwInfoLevel & ~HTTP_QUERY_MODIFIER_FLAGS_MASK;
if (index == HTTP_QUERY_RAW_HEADERS_CRLF)
{
DWORD len = strlenW(lpwhr->lpszRawHeaders);
if (len + 1 > *lpdwBufferLength/sizeof(WCHAR))
{
*lpdwBufferLength = (len + 1) * sizeof(WCHAR);
INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
memcpy(lpBuffer, lpwhr->lpszRawHeaders, (len+1)*sizeof(WCHAR));
*lpdwBufferLength = len * sizeof(WCHAR);
TRACE("returning data: %s\n", debugstr_wn((WCHAR*)lpBuffer, len));
return TRUE;
}
else if (index == HTTP_QUERY_RAW_HEADERS)
{
static const WCHAR szCrLf[] = {'\r','\n',0};
LPWSTR * ppszRawHeaderLines = HTTP_Tokenize(lpwhr->lpszRawHeaders, szCrLf);
DWORD i, size = 0;
LPWSTR pszString = (WCHAR*)lpBuffer;
for (i = 0; ppszRawHeaderLines[i]; i++)
size += strlenW(ppszRawHeaderLines[i]) + 1;
if (size + 1 > *lpdwBufferLength/sizeof(WCHAR))
{
HTTP_FreeTokens(ppszRawHeaderLines);
*lpdwBufferLength = (size + 1) * sizeof(WCHAR);
INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
for (i = 0; ppszRawHeaderLines[i]; i++)
{
DWORD len = strlenW(ppszRawHeaderLines[i]);
memcpy(pszString, ppszRawHeaderLines[i], (len+1)*sizeof(WCHAR));
pszString += len+1;
}
*pszString = '\0';
TRACE("returning data: %s\n", debugstr_wn((WCHAR*)lpBuffer, size));
*lpdwBufferLength = size * sizeof(WCHAR);
HTTP_FreeTokens(ppszRawHeaderLines);
return TRUE;
}
else if (index == HTTP_QUERY_STATUS_TEXT)
{
DWORD len = strlenW(lpwhr->lpszStatusText);
if (len + 1 > *lpdwBufferLength/sizeof(WCHAR))
{
*lpdwBufferLength = (len + 1) * sizeof(WCHAR);
INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
memcpy(lpBuffer, lpwhr->lpszStatusText, (len+1)*sizeof(WCHAR));
*lpdwBufferLength = len * sizeof(WCHAR);
TRACE("returning data: %s\n", debugstr_wn((WCHAR*)lpBuffer, len));
return TRUE;
}
else if (index == HTTP_QUERY_VERSION)
{
DWORD len = strlenW(lpwhr->lpszVersion);
if (len + 1 > *lpdwBufferLength/sizeof(WCHAR))
{
*lpdwBufferLength = (len + 1) * sizeof(WCHAR);
INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
memcpy(lpBuffer, lpwhr->lpszVersion, (len+1)*sizeof(WCHAR));
*lpdwBufferLength = len * sizeof(WCHAR);
TRACE("returning data: %s\n", debugstr_wn((WCHAR*)lpBuffer, len));
return TRUE;
}
else if (index >= 0 && index <= HTTP_QUERY_MAX )
{
int i;
for (i = 0; i < sizeof(SORTED_STANDARD_HEADERS)/sizeof(std_hdr_data) ; i++)
{
if (SORTED_STANDARD_HEADERS[i].hdrIndex == index)
{
INT requested_index = (lpdwIndex)?(*lpdwIndex):0;
INT index = HTTP_GetCustomHeaderIndex(lpwhr,
(LPWSTR)SORTED_STANDARD_HEADERS[i].hdrStr,
requested_index,request_only);
if (index < 0)
return bSuccess;
else
lphttpHdr = &lpwhr->pCustHeaders[index];
if (lpdwIndex)
(*lpdwIndex)++;
break;
}
}
if (!lphttpHdr)
{
SetLastError(ERROR_HTTP_HEADER_NOT_FOUND);
return bSuccess;
}
}
else
{
SetLastError(ERROR_HTTP_HEADER_NOT_FOUND);
return bSuccess;
}
}
/* Ensure header satisifies requested attributes */
if ((dwInfoLevel & HTTP_QUERY_FLAG_REQUEST_HEADERS) &&
(~lphttpHdr->wFlags & HDR_ISREQUEST))
{
SetLastError(ERROR_HTTP_HEADER_NOT_FOUND);
return bSuccess;
}
/* coalesce value to reuqested type */
if (dwInfoLevel & HTTP_QUERY_FLAG_NUMBER)
{
*(int *)lpBuffer = atoiW(lphttpHdr->lpszValue);
bSuccess = TRUE;
TRACE(" returning number : %d\n", *(int *)lpBuffer);
}
else if (dwInfoLevel & HTTP_QUERY_FLAG_SYSTEMTIME)
{
time_t tmpTime;
struct tm tmpTM;
SYSTEMTIME *STHook;
tmpTime = ConvertTimeString(lphttpHdr->lpszValue);
tmpTM = *gmtime(&tmpTime);
STHook = (SYSTEMTIME *) lpBuffer;
if(STHook==NULL)
return bSuccess;
STHook->wDay = tmpTM.tm_mday;
STHook->wHour = tmpTM.tm_hour;
STHook->wMilliseconds = 0;
STHook->wMinute = tmpTM.tm_min;
STHook->wDayOfWeek = tmpTM.tm_wday;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -