#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-адрес, но и перекомпонировать, поэтому, возможно, если вы используете эту библиотеку для синтаксического анализа и перекомпонирования, вы можете получить желаемый результат.