Commit 3178d443 authored by Geoff Simmons's avatar Geoff Simmons

Implement case-insensitive .match().

parent 92ef0fa9
This diff is collapsed.
......@@ -33,6 +33,7 @@
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "cache/cache.h"
#include "vcl.h"
......@@ -65,6 +66,7 @@ struct vmod_selector_set {
#define VMOD_SELECTOR_SET_MAGIC 0x838979ef
struct entry **table;
char **members;
char **lomembers;
struct pt_y *origo;
char *vcl_name;
unsigned nmembers;
......@@ -146,6 +148,7 @@ vmod_set_add(VRT_CTX, struct vmod_selector_set *set, VCL_STRING member,
vre_t *re = NULL;
const char *error;
int erroffset;
char **members;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(set, VMOD_SELECTOR_SET_MAGIC);
......@@ -169,9 +172,20 @@ vmod_set_add(VRT_CTX, struct vmod_selector_set *set, VCL_STRING member,
AN(set->members);
set->members[n - 1] = strdup(member);
AN(set->members[n - 1]);
members = set->members;
if (!set->case_sensitive) {
set->lomembers = realloc(set->members, n * sizeof(VCL_STRING));
AN(set->lomembers);
set->lomembers[n - 1] = strdup(member);
AN(set->lomembers[n - 1]);
for (char *m = set->lomembers[n-1]; *m; m++)
*m = tolower(*m);
members = set->lomembers;
}
errno = 0;
if (PT_Insert(&set->origo, n - 1, set->members) != 0) {
if (PT_Insert(&set->origo, n - 1, members) != 0) {
if (errno == EINVAL)
VFAIL(ctx, "%s.add(): \"%s\" added more than once",
set->vcl_name, member);
......@@ -240,6 +254,8 @@ vmod_set_match(VRT_CTX, struct vmod_selector_set *set, VCL_STRING subject)
{
unsigned idx;
struct match_data *match;
char **members;
const char *subj;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(set, VMOD_SELECTOR_SET_MAGIC);
......@@ -255,8 +271,24 @@ vmod_set_match(VRT_CTX, struct vmod_selector_set *set, VCL_STRING subject)
return (0);
}
members = set->members;
subj = subject;
if (!set->case_sensitive) {
char *copy;
if ((copy = WS_Copy(ctx->ws, subject, -1)) == NULL) {
VERRNOMEM(ctx, "%s.match(): copying subject for "
"case-insensitive match", set->vcl_name);
return (0);
}
for (char *c = copy; *c; c++)
*c = tolower(*c);
subj = copy;
members = set->lomembers;
}
match = get_match_data(ctx, set, "match");
if ((idx = PT_Lookup(set->origo, set->members, subject)) == UINT_MAX) {
if ((idx = PT_Lookup(set->origo, members, subj)) == UINT_MAX) {
match->n = 0;
return (0);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment