C ++ urljoin эквивалент - PullRequest
       6

C ++ urljoin эквивалент

2 голосов
/ 18 февраля 2010

В Python есть функция urljoin, которая берет два URL-адреса и объединяет их разумно. Есть ли библиотека, которая обеспечивает аналогичную функцию в C ++?

документация по urljoin: http://docs.python.org/library/urlparse.html

И пример с питоном:

>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html')
'http://www.cwi.nl/%7Eguido/FAQ.html'

Ответы [ 3 ]

2 голосов
/ 18 февраля 2010

Я понял это. Я использовал библиотеку uriparser: http://uriparser.sourceforge.net/ и поспешно реализовал функцию следующим образом. Он редко проверяет ошибки и может привести к утечке памяти.

std::string urljoin(std::string &base, std::string &relative)
{
    UriParserStateA state;
    UriUriA uriOne;
    UriUriA uriTwo;

    state.uri = &uriOne;

    if (uriParseUriA(&state, base.c_str()) != URI_SUCCESS)
    {
        return "";
    }
    state.uri = &uriTwo;
    if (uriParseUriA(&state, relative.c_str()) != URI_SUCCESS)
    {
        uriFreeUriMembersA(&uriTwo);
        return "";
    }

    UriUriA result;
    if (uriAddBaseUriA(&result, &uriTwo, &uriOne) != URI_SUCCESS)
    {
        uriFreeUriMembersA(&result);
        return "";
    }
    uriFreeUriMembersA(&uriOne);
    uriFreeUriMembersA(&uriTwo);

    int charsRequired;
    uriToStringCharsRequiredA(&result, &charsRequired);
    charsRequired++;

    char *buf = (char*) malloc(charsRequired * sizeof(char)); if (uriToStringA(buf, &result, charsRequired, NULL) != URI_SUCCESS)
        return "";
    uriFreeUriMembersA(&result);

    std::string ret(buf);
    free(buf);

    return ret;
}
2 голосов
/ 18 февраля 2010

Класс Poco :: URI в библиотеках POCO C ++ может сделать это (см. Функцию-член resolve).

1 голос
/ 18 февраля 2010

Короткий ответ, не совсем.

Вы должны были бы разобрать строку и заменить хвост. Это было бы довольно легко, например, используя boost :: regex.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...