Как нормализовать URL-адрес в C?

#c #url

#c #url

Вопрос:

Недавно разработчик написал для меня функцию для нормализации URL-адресов с учетом базового URL-адреса и URL-адреса для нормализации. Смотрите функцию ниже:

 int
starts_with(const char *str, const char *pre)
{
        size_t lenstr;
        size_t lenpre;

        if (str == NULL || pre == NULL)
                return (-1);

        lenstr = strlen(str);
        lenpre = strlen(pre);

        if (lenstr < lenpre)
                return (-1);

    return (memcmp(pre, str, lenpre));
}

char *
url_sanitize(char *base_url, char *url, int size)
{
        char *newurl;
        int base_url_len = strlen(base_url);

        if (starts_with(url, "http") == 0) {
                newurl = malloc(size 1);
                if (newurl == NULL) {
                        fprintf(stderr, "1 malloc() of %d bytes, failedn", size);
                        exit(1);
                }

                strncpy(newurl, url, size);
                newurl[size] = '';

        } else {
                if (starts_with(url, "//") == 0) {
                        newurl = malloc(size 7);
                        if (newurl == NULL) {
                                fprintf(stderr, "2 malloc() of %d bytes, failedn", size);
                                exit(1);
                        }

                        strncpy(newurl, "https:", 6);
                        strncpy(newurl 6, url, size);
                        newurl[size 6] = '';
                } else {
                        newurl = malloc(base_url_len   size   2);
                        if (newurl == NULL) {
                                fprintf(stderr, "3 malloc() of %d bytes, failedn", size);
                                exit(1);
                        }

                        strncpy(newurl, base_url, base_url_len);
                        strncpy(newurl   base_url_len, url, size);
                        newurl[size   base_url_len] = '';
                }
        }

        return (newurl);
}
 

Проблема в том, что эта функция не удаляет ./ or ../ . Кроме того, он не вводит в нижний регистр хост и схему. Он не нормализуется должным образом. Как можно изменить вышеуказанную функцию, чтобы правильно нормализовать URL-адрес?

Комментарии:

1. Не проще ли было бы поговорить с человеком, который разработал код?

2. Я думаю, вам нужно будет определить нормализацию в этом контексте, потому что я не думаю, что существует один канонический нормализованный вариант для каждого заданного URL, судя по en.wikipedia.org/wiki/URI_normalization . Вы просто заменяете часть пути URL-адреса, которая может состоять из одного или нескольких ./ и / или ../ , на POSIX-путь к существующему файлу или папке, который не содержит ./ и ../ ?

3. @amn Да. Я определенно хочу, чтобы ./ и ../ были удалены. В противном случае в моей базе данных два или более URL-адресов будут соответствовать одному и тому же ресурсу. Со страницы Википедии, на которую вы ссылались, я предполагаю, что нормализации, которые сохраняют семантику, соответствуют тому, что мне нужно.

Ответ №1:

Библиотека uriparser C в https://uriparser.github.io / позволяет не только анализировать URL-адрес, но и перекомпонировать, поэтому, возможно, если вы используете эту библиотеку для синтаксического анализа и перекомпонирования, вы можете получить желаемый результат.