#include #include #include #include "yuri.h" static int _eat(struct uri *u, int index) { int i; char **path; free(u->path[index]); for (i = index+1; i < u->npath; i++) u->path[i-1] = u->path[i]; u->npath--; if (u->npath == 0) { free(u->path); u->path = NULL; } else { path = realloc(u->path, sizeof(*u->path)*u->npath); if (path == NULL) return -1; u->path = path; } return 0; } int uri_normalize(struct uri *u) { int i; int therewaspath; if (u->scheme) { for (i = 0; i < strlen(u->scheme); i++) { if (isalpha(u->scheme[i])) u->scheme[i] = tolower(u->scheme[i]); } } if (u->authority.host) { for (i = 0; i < strlen(u->authority.host); i++) { if (isalpha(u->authority.host[i])) u->authority.host[i] = tolower(u->authority.host[i]); } } if (u->npath != 0) therewaspath = 1; else therewaspath = 0; for (i = 0; i < u->npath; i++) { if (i != u->npath-1 || u->npath == 1) { if (strcmp(u->path[i], "") == 0) { if (_eat(u, i) == -1) return -1; i = 0; /* count altered, reset back */ } } } for (i = 0; i < u->npath; i++) { if (strcmp(u->path[i], ".") == 0) { if (_eat(u, i) == -1) return -1; i = 0; /* count altered, reset back */ } } for (i = 0; i < u->npath; i++) { if (strcmp(u->path[i], "..") == 0) { if (_eat(u, i) == -1) return -1; if (i-1 >= 0) { if (_eat(u, i-1) == -1) return -1; } i = 0; /* count altered, reset back */ } } /* if there was a path and all redundant segments were remved * we'd be left with no path and path list would be set to NULL * indicating that path has never exists, we don't want that, * so we just add an empty path back */ if (therewaspath && u->npath == 0) { if (uri_append_path(u, "") == -1) return -1; } return 0; }