Универсальные указатели ресурсов (URL-адреса) в WinHTTP
URL-адрес — это компактное представление расположения и метода доступа для ресурса, расположенного в Интернете. Каждый URL-адрес состоит из схемы (HTTP, HTTPS, FTP или Gopher) и строки для конкретной схемы. Эта строка также может включать сочетание пути к каталогу, строки поиска или имени ресурса. Функции Microsoft Windows HTTP Services (WinHTTP) обеспечивают возможность создания, объединения, разделения и канонизации URL-адресов. Дополнительные сведения см. в RFC 1738, универсальных указателей ресурсов и RFC 2396, универсальных идентификаторов ресурсов (URI): универсальный синтаксис.
Что такое канонический URL-адрес?
Указанный синтаксис и семантика URL-адресов оставляет место для вариантов и ошибок. Канонизация — это процесс нормализации фактического URL-адреса в правильной, стандартной, канонической форме.
Это включает кодирование некоторых символов как "escape-последовательности". Буквенно-цифровые US-ASCII символы не должны быть закодированы (цифры 0-9, буквы A-Z и строчные буквы a-z). Большинство других символов должны быть экранированы, включая управляющие символы, пробелы, знак процента, "небезопасные символы" (<, >, ", ", " и " выше 127.
Использование функций WinHTTP для обработки URL-адресов
WinHTTP предоставляет две функции для обработки URL-адресов. WinHttpCrackUrl отделяет URL-адрес от компонентов, а WinHttpCreateUrl создает URL-адрес из компонентов.
Разделение URL-адресов
Функция WinHttpCrackUr l отделяет URL-адрес от частей компонента и возвращает компоненты, указанные структурой URL_COMPONENTS, передаваемой функции.
Компоненты, составляющие структуру URL_COMPONENTS, — это номер схемы, имя узла, номер порта, имя пользователя, пароль, URL-путь и дополнительные сведения, такие как параметры поиска. Каждый компонент, за исключением схемы и номеров портов, содержит строковый элемент, содержащий сведения и элемент, содержащий длину строкового элемента. У схемы и номеров портов есть только член, который сохраняет соответствующее значение; Схемы и номера портов возвращаются для всех успешных вызовов WinHttpCrackUrl.
Чтобы получить значение определенного компонента в структуре URL_COMPONENTS, элемент, в который хранится длина строки этого компонента, должен иметь значение, отличное от нуля. Элемент строки может быть указателем на буфер или NULL.
Если элемент указателя содержит указатель на буфер, элемент длины строки должен содержать размер этого буфера. Функция WinHttpCrackUr l возвращает сведения о компоненте в качестве строки в буфере и сохраняет длину строки в элементе длины строки.
Если элемент указателя имеет значение NULL, элемент длины строки можно задать для любого ненулевого значения. Функция WinHttpCrackUrl сохраняет указатель на первый символ строки URL-адреса, содержащей сведения о компоненте, и задает длину строки в оставшейся части строки URL-адреса, относящейся к компоненту.
Все элементы указателя, заданные для NULL, с ненулевой точкой длины в соответствующей начальной точке в строке URL-адреса. Длину, хранящуюся в элементе длины, необходимо использовать для определения конца сведений отдельного компонента.
Чтобы правильно инициализировать структуру URL_COMPONENTS, необходимо задать для элемента dwStructSize размер структуры URL_COMPONENTS.
Создание URL-адресов
Функция WinHttpCreateUrl использует сведения в ранее описанной структуре URL_COMPONENTS для создания URL-адреса.
Для каждого обязательного компонента элемент указателя должен содержать указатель на буфер, содержащий сведения. Элемент длины должен быть равен нулю, если элемент указателя содержит указатель на строку нулевого завершения; Элемент длины должен иметь длину строки, если элемент указателя содержит указатель на строку, которая не завершается с нуля. Элемент указателя всех компонентов, которые не требуются, должен иметь значение NULL.
Пример кода
В следующем примере кода показано, как использовать WinHttpCrackUrl и WinHttpCreateUrl для отключения существующего URL-адреса, изменения одного из его компонентов и повторного анализа в новый URL-адрес.
URL_COMPONENTS urlComp;
LPCWSTR pwszUrl1 =
L"https://search.msn.com/results.asp?RS=CHECKED&FORM=MSNH&v=1&q=wininet";
DWORD dwUrlLen = 0;
// Initialize the URL_COMPONENTS structure.
ZeroMemory(&urlComp, sizeof(urlComp));
urlComp.dwStructSize = sizeof(urlComp);
// Set required component lengths to non-zero so that they are cracked.
urlComp.dwSchemeLength = (DWORD)-1;
urlComp.dwHostNameLength = (DWORD)-1;
urlComp.dwUrlPathLength = (DWORD)-1;
urlComp.dwExtraInfoLength = (DWORD)-1;
// Crack the URL.
if( !WinHttpCrackUrl( pwszUrl1, (DWORD)wcslen(pwszUrl1), 0, &urlComp ) )
printf( "Error %u in WinHttpCrackUrl.\n", GetLastError( ) );
else
{
// Change the search information. New info is the same length.
urlComp.lpszExtraInfo = L"?RS=CHECKED&FORM=MSNH&v=1&q=winhttp";
// Obtain the size of the new URL and allocate memory.
WinHttpCreateUrl( &urlComp, 0, NULL, &dwUrlLen );
LPWSTR pwszUrl2 = new WCHAR[dwUrlLen];
// Create a new URL.
if( !WinHttpCreateUrl( &urlComp, 0, pwszUrl2, &dwUrlLen ) )
printf( "Error %u in WinHttpCreateUrl.\n", GetLastError( ) );
else
{
// Show both URLs.
printf( "Old URL: %S\nNew URL: %S\n", pwszUrl1, pwszUrl2 );
}
// Free allocated memory.
delete [] pwszUrl2;
}