📄 http.c
字号:
MultiByteToWideChar(CP_ACP, 0, lpszVerb, -1, szVerb, len);
}
if (lpszObjectName)
{
len = MultiByteToWideChar(CP_ACP, 0, lpszObjectName, -1, NULL, 0 );
szObjectName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR) );
if ( !szObjectName )
goto end;
MultiByteToWideChar(CP_ACP, 0, lpszObjectName, -1, szObjectName, len );
}
if (lpszVersion)
{
len = MultiByteToWideChar(CP_ACP, 0, lpszVersion, -1, NULL, 0 );
szVersion = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
if ( !szVersion )
goto end;
MultiByteToWideChar(CP_ACP, 0, lpszVersion, -1, szVersion, len );
}
if (lpszReferrer)
{
len = MultiByteToWideChar(CP_ACP, 0, lpszReferrer, -1, NULL, 0 );
szReferrer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
if ( !szReferrer )
goto end;
MultiByteToWideChar(CP_ACP, 0, lpszReferrer, -1, szReferrer, len );
}
acceptTypesCount = 0;
if (lpszAcceptTypes)
{
/* find out how many there are */
while (lpszAcceptTypes[acceptTypesCount])
acceptTypesCount++;
szAcceptTypes = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR *) * (acceptTypesCount+1));
acceptTypesCount = 0;
while (lpszAcceptTypes[acceptTypesCount])
{
len = MultiByteToWideChar(CP_ACP, 0, lpszAcceptTypes[acceptTypesCount],
-1, NULL, 0 );
szAcceptTypes[acceptTypesCount] = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
if (!szAcceptTypes[acceptTypesCount] )
goto end;
MultiByteToWideChar(CP_ACP, 0, lpszAcceptTypes[acceptTypesCount],
-1, szAcceptTypes[acceptTypesCount], len );
acceptTypesCount++;
}
szAcceptTypes[acceptTypesCount] = NULL;
}
else szAcceptTypes = 0;
rc = HttpOpenRequestW(hHttpSession, szVerb, szObjectName,
szVersion, szReferrer,
(LPCWSTR*)szAcceptTypes, dwFlags, dwContext);
end:
if (szAcceptTypes)
{
acceptTypesCount = 0;
while (szAcceptTypes[acceptTypesCount])
{
HeapFree(GetProcessHeap(), 0, szAcceptTypes[acceptTypesCount]);
acceptTypesCount++;
}
HeapFree(GetProcessHeap(), 0, szAcceptTypes);
}
HeapFree(GetProcessHeap(), 0, szReferrer);
HeapFree(GetProcessHeap(), 0, szVersion);
HeapFree(GetProcessHeap(), 0, szObjectName);
HeapFree(GetProcessHeap(), 0, szVerb);
return rc;
}
/***********************************************************************
* HTTP_Base64
*/
static UINT HTTP_Base64( LPCWSTR bin, LPWSTR base64 )
{
UINT n = 0, x;
static LPCSTR HTTP_Base64Enc =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
while( bin[0] )
{
/* first 6 bits, all from bin[0] */
base64[n++] = HTTP_Base64Enc[(bin[0] & 0xfc) >> 2];
x = (bin[0] & 3) << 4;
/* next 6 bits, 2 from bin[0] and 4 from bin[1] */
if( !bin[1] )
{
base64[n++] = HTTP_Base64Enc[x];
base64[n++] = '=';
base64[n++] = '=';
break;
}
base64[n++] = HTTP_Base64Enc[ x | ( (bin[1]&0xf0) >> 4 ) ];
x = ( bin[1] & 0x0f ) << 2;
/* next 6 bits 4 from bin[1] and 2 from bin[2] */
if( !bin[2] )
{
base64[n++] = HTTP_Base64Enc[x];
base64[n++] = '=';
break;
}
base64[n++] = HTTP_Base64Enc[ x | ( (bin[2]&0xc0 ) >> 6 ) ];
/* last 6 bits, all from bin [2] */
base64[n++] = HTTP_Base64Enc[ bin[2] & 0x3f ];
bin += 3;
}
base64[n] = 0;
return n;
}
/***********************************************************************
* HTTP_EncodeBasicAuth
*
* Encode the basic authentication string for HTTP 1.1
*/
static LPWSTR HTTP_EncodeBasicAuth( LPCWSTR username, LPCWSTR password)
{
UINT len;
LPWSTR in, out;
static const WCHAR szBasic[] = {'B','a','s','i','c',' ',0};
static const WCHAR szColon[] = {':',0};
len = lstrlenW( username ) + 1 + lstrlenW ( password ) + 1;
in = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
if( !in )
return NULL;
len = lstrlenW(szBasic) +
(lstrlenW( username ) + 1 + lstrlenW ( password ))*2 + 1 + 1;
out = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
if( out )
{
lstrcpyW( in, username );
lstrcatW( in, szColon );
lstrcatW( in, password );
lstrcpyW( out, szBasic );
HTTP_Base64( in, &out[strlenW(out)] );
}
HeapFree( GetProcessHeap(), 0, in );
return out;
}
/***********************************************************************
* HTTP_InsertProxyAuthorization
*
* Insert the basic authorization field in the request header
*/
static BOOL HTTP_InsertProxyAuthorization( LPWININETHTTPREQW lpwhr,
LPCWSTR username, LPCWSTR password )
{
WCHAR *authorization = HTTP_EncodeBasicAuth( username, password );
BOOL ret = TRUE;
if (!authorization)
return FALSE;
TRACE( "Inserting authorization: %s\n", debugstr_w( authorization ) );
HTTP_ProcessHeader(lpwhr, szProxy_Authorization, authorization,
HTTP_ADDHDR_FLAG_REPLACE);
HeapFree( GetProcessHeap(), 0, authorization );
return ret;
}
/***********************************************************************
* HTTP_DealWithProxy
*/
static BOOL HTTP_DealWithProxy( LPWININETAPPINFOW hIC,
LPWININETHTTPSESSIONW lpwhs, LPWININETHTTPREQW lpwhr)
{
WCHAR buf[MAXHOSTNAME];
WCHAR proxy[MAXHOSTNAME + 15]; /* 15 == "http://" + sizeof(port#) + ":/\0" */
WCHAR* url;
static const WCHAR szNul[] = { 0 };
URL_COMPONENTSW UrlComponents;
static const WCHAR szHttp[] = { 'h','t','t','p',':','/','/',0 }, szSlash[] = { '/',0 } ;
static const WCHAR szFormat1[] = { 'h','t','t','p',':','/','/','%','s',0 };
static const WCHAR szFormat2[] = { 'h','t','t','p',':','/','/','%','s',':','%','d',0 };
int len;
memset( &UrlComponents, 0, sizeof UrlComponents );
UrlComponents.dwStructSize = sizeof UrlComponents;
UrlComponents.lpszHostName = buf;
UrlComponents.dwHostNameLength = MAXHOSTNAME;
if( CSTR_EQUAL != CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE,
hIC->lpszProxy,strlenW(szHttp),szHttp,strlenW(szHttp)) )
sprintfW(proxy, szFormat1, hIC->lpszProxy);
else
strcpyW(proxy, hIC->lpszProxy);
if( !InternetCrackUrlW(proxy, 0, 0, &UrlComponents) )
return FALSE;
if( UrlComponents.dwHostNameLength == 0 )
return FALSE;
if( !lpwhr->lpszPath )
lpwhr->lpszPath = (LPWSTR)szNul;
TRACE("server='%s' path='%s'\n",
debugstr_w(lpwhs->lpszHostName), debugstr_w(lpwhr->lpszPath));
/* for constant 15 see above */
len = strlenW(lpwhs->lpszHostName) + strlenW(lpwhr->lpszPath) + 15;
url = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
if(UrlComponents.nPort == INTERNET_INVALID_PORT_NUMBER)
UrlComponents.nPort = INTERNET_DEFAULT_HTTP_PORT;
sprintfW(url, szFormat2, lpwhs->lpszHostName, lpwhs->nHostPort);
if( lpwhr->lpszPath[0] != '/' )
strcatW( url, szSlash );
strcatW(url, lpwhr->lpszPath);
if(lpwhr->lpszPath != szNul)
HeapFree(GetProcessHeap(), 0, lpwhr->lpszPath);
lpwhr->lpszPath = url;
HeapFree(GetProcessHeap(), 0, lpwhs->lpszServerName);
lpwhs->lpszServerName = WININET_strdupW(UrlComponents.lpszHostName);
lpwhs->nServerPort = UrlComponents.nPort;
return TRUE;
}
/***********************************************************************
* HTTP_HttpOpenRequestW (internal)
*
* Open a HTTP request handle
*
* RETURNS
* HINTERNET a HTTP request handle on success
* NULL on failure
*
*/
HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs,
LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion,
LPCWSTR lpszReferrer , LPCWSTR *lpszAcceptTypes,
DWORD dwFlags, DWORD dwContext)
{
LPWININETAPPINFOW hIC = NULL;
LPWININETHTTPREQW lpwhr;
LPWSTR lpszCookies;
LPWSTR lpszUrl = NULL;
DWORD nCookieSize;
HINTERNET handle = NULL;
static const WCHAR szUrlForm[] = {'h','t','t','p',':','/','/','%','s',0};
DWORD len;
LPHTTPHEADERW Host;
char szaddr[32];
TRACE("-->\n");
assert( lpwhs->hdr.htype == WH_HHTTPSESSION );
hIC = (LPWININETAPPINFOW) lpwhs->hdr.lpwhparent;
lpwhr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WININETHTTPREQW));
if (NULL == lpwhr)
{
INTERNET_SetLastError(ERROR_OUTOFMEMORY);
goto lend;
}
lpwhr->hdr.htype = WH_HHTTPREQ;
lpwhr->hdr.lpwhparent = WININET_AddRef( &lpwhs->hdr );
lpwhr->hdr.dwFlags = dwFlags;
lpwhr->hdr.dwContext = dwContext;
lpwhr->hdr.dwRefCount = 1;
lpwhr->hdr.destroy = HTTP_CloseHTTPRequestHandle;
lpwhr->hdr.lpfnStatusCB = lpwhs->hdr.lpfnStatusCB;
handle = WININET_AllocHandle( &lpwhr->hdr );
if (NULL == handle)
{
INTERNET_SetLastError(ERROR_OUTOFMEMORY);
goto lend;
}
if (!NETCON_init(&lpwhr->netConnection, dwFlags & INTERNET_FLAG_SECURE))
{
InternetCloseHandle( handle );
handle = NULL;
goto lend;
}
if (NULL != lpszObjectName && strlenW(lpszObjectName)) {
HRESULT rc;
len = 0;
rc = UrlEscapeW(lpszObjectName, NULL, &len, URL_ESCAPE_SPACES_ONLY);
if (rc != E_POINTER)
len = strlenW(lpszObjectName)+1;
lpwhr->lpszPath = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
rc = UrlEscapeW(lpszObjectName, lpwhr->lpszPath, &len,
URL_ESCAPE_SPACES_ONLY);
if (rc)
{
ERR("Unable to escape string!(%s) (%ld)\n",debugstr_w(lpszObjectName),rc);
strcpyW(lpwhr->lpszPath,lpszObjectName);
}
}
if (NULL != lpszReferrer && strlenW(lpszReferrer))
HTTP_ProcessHeader(lpwhr, HTTP_REFERER, lpszReferrer, HTTP_ADDHDR_FLAG_COALESCE);
if(lpszAcceptTypes!=NULL)
{
int i;
for(i=0;lpszAcceptTypes[i]!=NULL;i++)
HTTP_ProcessHeader(lpwhr, HTTP_ACCEPT, lpszAcceptTypes[i], HTTP_ADDHDR_FLAG_COALESCE_WITH_COMMA|HTTP_ADDHDR_FLAG_REQ|HTTP_ADDHDR_FLAG_ADD_IF_NEW);
}
if (NULL == lpszVerb)
{
static const WCHAR szGet[] = {'G','E','T',0};
lpwhr->lpszVerb = WININET_strdupW(szGet);
}
else if (strlenW(lpszVerb))
lpwhr->lpszVerb = WININET_strdupW(lpszVerb);
if (NULL != lpszReferrer && strlenW(lpszReferrer))
{
WCHAR buf[MAXHOSTNAME];
URL_COMPONENTSW UrlComponents;
memset( &UrlComponents, 0, sizeof UrlComponents );
UrlComponents.dwStructSize = sizeof UrlComponents;
UrlComponents.lpszHostName = buf;
UrlComponents.dwHostNameLength = MAXHOSTNAME;
InternetCrackUrlW(lpszReferrer, 0, 0, &UrlComponents);
if (strlenW(UrlComponents.lpszHostName))
HTTP_ProcessHeader(lpwhr, szHost, UrlComponents.lpszHostName, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDHDR_FLAG_REQ);
}
else
HTTP_ProcessHeader(lpwhr, szHost, lpwhs->lpszHostName, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDHDR_FLAG_REQ);
if (lpwhs->nServerPort == INTERNET_INVALID_PORT_NUMBER)
lpwhs->nServerPort = (dwFlags & INTERNET_FLAG_SECURE ?
INTERNET_DEFAULT_HTTPS_PORT :
INTERNET_DEFAULT_HTTP_PORT);
lpwhs->nHostPort = lpwhs->nServerPort;
if (NULL != hIC->lpszProxy && hIC->lpszProxy[0] != 0)
HTTP_DealWithProxy( hIC, lpwhs, lpwhr );
if (hIC->lpszAgent)
{
WCHAR *agent_header;
static const WCHAR user_agent[] = {'U','s','e','r','-','A','g','e','n','t',':',' ','%','s','\r','\n',0 };
len = strlenW(hIC->lpszAgent) + strlenW(user_agent);
agent_header = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
sprintfW(agent_header, user_agent, hIC->lpszAgent );
HTTP_HttpAddRequestHeadersW(lpwhr, agent_header, strlenW(agent_header),
HTTP_ADDREQ_FLAG_ADD);
HeapFree(GetProcessHeap(), 0, agent_header);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -