Поделиться через


Универсальные указатели ресурсов (URL-адреса) в WinHTTP

URL-адрес — это компактное представление расположения и метода доступа для ресурса, расположенного в Интернете. Каждый URL-адрес состоит из схемы (HTTP, HTTPS, FTP или Gopher) и строки для конкретной схемы. Эта строка также может включать сочетание пути к каталогу, строки поиска или имени ресурса. Функции Служб HTTP Microsoft Windows (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-адресов

Функция WinHttpCrackUrl разделяет URL-адрес на части компонентов и возвращает компоненты, указанные структурой URL_COMPONENTS , передаваемой в функцию.

Компоненты, составляющие структуру URL_COMPONENTS , — это номер схемы, имя узла, номер порта, имя пользователя, пароль, URL-путь и дополнительные сведения, такие как параметры поиска. Каждый компонент, за исключением номера схемы и порта, имеет элемент строки, содержащий сведения, и элемент, содержащий длину элемента строки. В схеме и номерах портов есть только член, в котором хранится соответствующее значение; И схема, и номера портов возвращаются при всех успешных вызовах WinHttpCrackUrl.

Чтобы получить значение определенного компонента в структуре URL_COMPONENTS , член, в котором хранится длина строки этого компонента, должен иметь ненулевое значение. Элемент строки может быть либо указателем на буфер, либо иметь значение NULL.

Если элемент указателя содержит указатель на буфер, элемент длины строки должен содержать размер этого буфера. Функция WinHttpCrackUrl возвращает сведения о компоненте в виде строки в буфере и сохраняет длину строки в элементе длины строки.

Если для элемента указателя задано значение NULL, для элемента длины строки можно задать любое ненулевое значение. Функция WinHttpCrackUrl сохраняет указатель на первый символ строки URL-адреса, который содержит сведения о компоненте, и задает длину строки в размере количества символов в оставшейся части строки URL-адреса, относящейся к компоненту.

Для всех элементов указателя задано значение NULL , а член ненулевой длины указывает на соответствующую начальную точку в строке URL-адреса. Длина, хранящееся в элементе length, должна использоваться для определения конца сведений об отдельном компоненте.

Чтобы правильно завершить инициализацию структуры URL_COMPONENTS , члену dwStructSize необходимо задать размер структуры URL_COMPONENTS .

Создание URL-адресов

Функция WinHttpCreateUrl использует сведения из ранее описанной структуры URL_COMPONENTS для создания URL-адреса.

Для каждого необходимого компонента элемент указателя должен содержать указатель на буфер, содержащий сведения. Элемент длины должен быть равен нулю, если элемент указателя содержит указатель на строку с нулевым завершением; Элемент length должен иметь длину строки, если элемент указателя содержит указатель на строку, которая не завершается с нуля. Элемент указателя всех компонентов, которые не требуются, должен иметь значение 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;
  }