mirror of
https://gitlab.xiph.org/xiph/icecast-server.git
synced 2024-09-22 04:15:54 -04:00
Sort paths and origins to optimize lookups
This commit is contained in:
parent
6110b71dfd
commit
704f0fe3bc
@ -2275,6 +2275,38 @@ static void _parse_events(event_registration_t **events, xmlNodePtr node)
|
||||
}
|
||||
}
|
||||
|
||||
static ice_config_cors_path_t* _cors_sort_paths_by_base_length_desc(ice_config_cors_path_t *cors_paths)
|
||||
{
|
||||
ice_config_cors_path_t *curr = cors_paths;
|
||||
ice_config_cors_path_t *prev = cors_paths;
|
||||
ice_config_cors_path_t *largest = cors_paths;
|
||||
ice_config_cors_path_t *largestPrev = cors_paths;
|
||||
ice_config_cors_path_t *tmp;
|
||||
|
||||
// Enf of sorting or only one path or no path
|
||||
if (!cors_paths || !cors_paths->next) {
|
||||
return cors_paths;
|
||||
}
|
||||
// Find the largest base and set it first.
|
||||
while(curr != NULL) {
|
||||
if(strlen(curr->base) > strlen(largest->base)) {
|
||||
largestPrev = prev;
|
||||
largest = curr;
|
||||
}
|
||||
prev = curr;
|
||||
curr = curr->next;
|
||||
}
|
||||
if(largest != cors_paths) {
|
||||
largestPrev->next = cors_paths;
|
||||
tmp = cors_paths->next;
|
||||
cors_paths->next = largest->next;
|
||||
largest->next = tmp;
|
||||
}
|
||||
// Recurse to the rest of the list
|
||||
largest->next = _cors_sort_paths_by_base_length_desc(largest->next);
|
||||
return largest;
|
||||
}
|
||||
|
||||
static void _parse_cors(xmlDocPtr doc,
|
||||
xmlNodePtr node,
|
||||
ice_config_cors_path_t **cors_paths)
|
||||
@ -2293,8 +2325,11 @@ static void _parse_cors(xmlDocPtr doc,
|
||||
if (xmlStrcmp(node->name, XMLSTR("path")) != 0) {
|
||||
continue;
|
||||
}
|
||||
if (!(base = (char *)xmlGetProp(node, XMLSTR("base")))) {
|
||||
ICECAST_LOG_WARN("Ignoring <cors><path> tag without base attribute");
|
||||
if (
|
||||
!(base = (char *)xmlGetProp(node, XMLSTR("base"))) ||
|
||||
!strlen(base)
|
||||
) {
|
||||
ICECAST_LOG_WARN("Ignoring <cors><path> tag without base attribute or empty");
|
||||
xmlFree(xmlGetProp(node, XMLSTR("base")));
|
||||
continue;
|
||||
}
|
||||
@ -2323,6 +2358,28 @@ static void _parse_cors(xmlDocPtr doc,
|
||||
/* in case we used break we may need to clean those up */
|
||||
if (base)
|
||||
xmlFree(base);
|
||||
*cors_paths = _cors_sort_paths_by_base_length_desc(*cors_paths);
|
||||
}
|
||||
|
||||
static void _cors_sort_origins_by_length_desc(char **origins)
|
||||
{
|
||||
int length;
|
||||
char *temp;
|
||||
|
||||
if (!origins || !origins[1]) {
|
||||
return;
|
||||
}
|
||||
for (length = 0; origins[length]; length++);
|
||||
for(int step = 0; step <length; step++)
|
||||
for(int i = 0; i < length - step - 1; i++)
|
||||
{
|
||||
if(strlen(origins[i]) < strlen(origins[i+1]))
|
||||
{
|
||||
temp = origins[i];
|
||||
origins[i] = origins[i + 1];
|
||||
origins[i + 1] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int _parse_cors_path(xmlDocPtr doc,
|
||||
@ -2339,6 +2396,12 @@ static int _parse_cors_path(xmlDocPtr doc,
|
||||
break;
|
||||
if (!tmpNode->name)
|
||||
continue;
|
||||
if (xmlStrcmp(tmpNode->name, XMLSTR("no-cors")) == 0) {
|
||||
cors_path->no_cors = 1;
|
||||
return 1;
|
||||
}
|
||||
if (xmlIsBlankNode(tmpNode))
|
||||
continue;
|
||||
if (xmlStrcmp(tmpNode->name, XMLSTR("allowed-origin")) == 0) {
|
||||
allowed_count++;
|
||||
continue;
|
||||
@ -2351,10 +2414,6 @@ static int _parse_cors_path(xmlDocPtr doc,
|
||||
exposed_headers_count++;
|
||||
continue;
|
||||
}
|
||||
if (xmlStrcmp(tmpNode->name, XMLSTR("no-cors")) == 0) {
|
||||
cors_path->no_cors = 1;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (!allowed_count && !forbidden_count && !exposed_headers_count) {
|
||||
return 0;
|
||||
@ -2380,6 +2439,8 @@ static int _parse_cors_path(xmlDocPtr doc,
|
||||
break;
|
||||
if (!tmpNode->name)
|
||||
continue;
|
||||
if (xmlIsBlankNode(tmpNode))
|
||||
continue;
|
||||
if (xmlStrcmp(tmpNode->name, XMLSTR("allowed-origin")) == 0) {
|
||||
cors_path->allowed[allowed_count++] = (char *)xmlNodeListGetString(doc, tmpNode->xmlChildrenNode, 1);
|
||||
continue;
|
||||
@ -2393,6 +2454,9 @@ static int _parse_cors_path(xmlDocPtr doc,
|
||||
continue;
|
||||
}
|
||||
}
|
||||
_cors_sort_origins_by_length_desc(cors_path->allowed);
|
||||
_cors_sort_origins_by_length_desc(cors_path->forbidden);
|
||||
_cors_sort_origins_by_length_desc(cors_path->exposed_headers);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user