Существует ряд функций, доступных родным разработчикам Windows:
Из них InternetCrackUrl работает.
URL_COMPONENTS components;
components.dwStructSize = sizeof(URL_COMPONENTS);
components.dwSchemeLength = DWORD(-1);
components.dwHostNameLength = DWORD(-1);
components.dwUserNameLength = DWORD(-1);
components.dwPasswordLength = DWORD(-1);
components.dwUrlPathLength = DWORD(-1);
components.dwExtraInfoLength = DWORD(-1);
if (!InternetCrackUrl(url, url.Length, 0, ref components)
RaiseLastOSError();
String scheme = StrLCopy(components.lpszScheme, components.dwSchemeLength);
String username = StrLCopy(components.lpszUserName, components.dwUserNameLength);
String password = StrLCopy(components.lpszPassword, components.dwPasswordLength);
String host = StrLCopy(components.lpszHostName, components.dwHostNameLength);
Int32 port = components.nPort;
String path = StrLCopy(components.lpszUrlPath, components.dwUrlPathLength);
String extra = StrLCopy(components.lpszExtraInfo, components.dwExtraInfoLength);
Это означает, что
stackoverflow: // iboyd: password01@mail.stackoverflow.com: 12386 / questions / SubmitQuestion.aspx? useLiveData = 1 & internal = 0 # nose
анализируется в:
- Схема :
stackoverflow
- Имя пользователя :
iboyd
- Пароль :
password01
- Host :
mail.stackoverflow.com
- Порт :
12386
- Path :
/questions/SubmitQuestion.aspx
- ExtraInfo :
?useLiveData=1&internal=0#nose
Разбор ExtraInfo в запрос и фрагмент
Это отстойв InternetCrackUrl не делает различий между:
?query#fragment
и просто объединяет их как ExtraInfo :
- ExtraInfo :
?useLiveData=1&internal=0#nose
- Запрос :
?useLiveData=1&internal=0
- Фрагмент :
#nose
Итак, мы должнысделайте некоторое разбиение, если мы хотим, чтобы ?query
или #fragment
:
/*
InternetCrackUrl returns ?query#fragment in a single combined extraInfo field.
Split that into separate
?query
#fragment
*/
String query = extraInfo;
String fragment = "";
Int32 n = StrPos("#", extraInfo);
if (n >= 1) //one-based string indexes
{
query = extraInfo.SubString(1, n-1);
fragment = extraInfo.SubString(n, MaxInt);
}
, давая нам желаемый финал:
- Схема :
stackoverflow
- Имя пользователя :
iboyd
- Пароль :
password01
- Хост :
mail.stackoverflow.com
- Порт :
12386
- Путь :
/questions/SubmitQuestion.aspx
- Запрос :
?useLiveData=1&internal=0
- Фрагмент :
#nose