Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
varnish-cache
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
varnishcache
varnish-cache
Commits
e51dd464
Commit
e51dd464
authored
Aug 01, 2013
by
Joshua Bussdieker
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Put library code up top
parent
373a1859
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
174 additions
and
162 deletions
+174
-162
cache_key.c
bin/varnishd/cache/cache_key.c
+174
-162
No files found.
bin/varnishd/cache/cache_key.c
View file @
e51dd464
...
...
@@ -15,46 +15,172 @@
#define M_CASE 4
#define M_NOT 5
int
key_ParseMatcher
(
const
char
*
s
,
struct
vsb
**
sb
)
{
const
char
*
p
=
s
;
int
enum_matchers
(
const
char
*
matcher
,
int
*
type
,
const
char
**
param
,
int
*
s
)
{
const
char
*
p
=
matcher
;
const
char
*
e
;
while
(
*
p
==
';'
)
{
if
(
*
p
!=
';'
)
return
-
1
;
if
(
*
p
!=
';'
)
return
0
;
p
++
;
if
(
strncmp
(
p
,
"w=
\"
"
,
3
)
==
0
)
{
p
+=
3
;
for
(
e
=
p
;
*
e
!=
'\"'
||
e
[
-
1
]
==
'\\'
;
e
++
)
continue
;
*
param
=
p
;
*
s
=
(
int
)(
e
-
p
);
*
type
=
M_WORD
;
p
=
e
+
1
;
}
else
if
(
strncmp
(
p
,
"s=
\"
"
,
3
)
==
0
)
{
p
+=
3
;
for
(
e
=
p
;
*
e
!=
'\"'
||
e
[
-
1
]
==
'\\'
;
e
++
)
continue
;
*
param
=
p
;
*
s
=
(
int
)(
e
-
p
);
*
type
=
M_SUBSTRING
;
p
=
e
+
1
;
}
else
if
(
strncmp
(
p
,
"b=
\"
"
,
3
)
==
0
)
{
p
+=
3
;
for
(
e
=
p
;
*
e
!=
'\"'
||
e
[
-
1
]
==
'\\'
;
e
++
)
continue
;
*
param
=
p
;
*
s
=
(
int
)(
e
-
p
);
*
type
=
M_BEGINNING
;
p
=
e
+
1
;
}
else
if
(
*
p
==
'c'
)
{
*
s
=
0
;
*
type
=
M_CASE
;
p
++
;
}
else
if
(
*
p
==
'n'
)
{
*
s
=
0
;
*
type
=
M_NOT
;
p
++
;
}
else
{
// Invalid matcher
return
-
1
;
}
return
p
-
matcher
;
}
if
(
strncmp
(
p
,
"w=
\"
"
,
3
)
==
0
)
{
p
+=
3
;
for
(
e
=
p
;
*
e
!=
'\"'
;
e
++
)
continue
;
VSB_printf
(
*
sb
,
"%c%.*s%c"
,
M_WORD
,
(
int
)(
e
-
p
),
p
,
0
);
p
=
e
+
1
;
}
else
if
(
strncmp
(
p
,
"s=
\"
"
,
3
)
==
0
)
{
p
+=
3
;
for
(
e
=
p
;
*
e
!=
'\"'
;
e
++
)
continue
;
VSB_printf
(
*
sb
,
"%c%.*s%c"
,
M_SUBSTRING
,
(
int
)(
e
-
p
),
p
,
0
);
p
=
e
+
1
;
}
else
if
(
strncmp
(
p
,
"b=
\"
"
,
3
)
==
0
)
{
p
+=
3
;
for
(
e
=
p
;
*
e
!=
'\"'
;
e
++
)
continue
;
VSB_printf
(
*
sb
,
"%c%.*s%c"
,
M_BEGINNING
,
(
int
)(
e
-
p
),
p
,
0
);
p
=
e
+
1
;
}
else
if
(
*
p
==
'c'
)
{
VSB_printf
(
*
sb
,
"%c"
,
M_CASE
);
p
++
;
}
else
if
(
*
p
==
'n'
)
{
VSB_printf
(
*
sb
,
"%c"
,
M_NOT
);
p
++
;
int
enum_fields
(
const
char
*
fv
,
const
char
**
m
,
int
*
s
)
{
const
char
*
f
,
*
b
;
enum
state
{
start
,
skip_space
,
scan
,
scan_quote
,
scan_back
,
done
,
end
}
cur_state
=
start
;
do
{
switch
(
cur_state
)
{
case
start
:
f
=
fv
;
cur_state
=
skip_space
;
break
;
case
skip_space
:
if
(
*
f
==
'\0'
)
cur_state
=
end
;
else
if
(
*
f
==
' '
||
*
f
==
','
)
f
++
;
else
if
(
*
f
==
'"'
)
{
b
=
f
;
cur_state
=
scan_quote
;
}
else
{
// Invalid matcher
return
-
1
;
b
=
f
;
cur_state
=
scan
;
}
break
;
case
scan
:
b
++
;
if
(
*
b
==
'\0'
)
cur_state
=
scan_back
;
else
if
(
*
b
==
'"'
)
cur_state
=
scan_quote
;
else
if
(
*
b
==
','
)
cur_state
=
scan_back
;
break
;
case
scan_quote
:
b
++
;
if
(
*
b
==
'\0'
)
cur_state
=
scan_back
;
else
if
(
*
b
==
'\\'
&&
b
[
1
]
!=
'\0'
)
b
+=
2
;
else
if
(
*
b
==
'"'
)
cur_state
=
scan
;
break
;
case
scan_back
:
b
--
;
if
(
*
b
!=
' '
)
cur_state
=
done
;
break
;
case
done
:
*
m
=
f
;
*
s
=
(
int
)(
b
-
f
)
+
1
;
return
b
-
fv
+
1
;
break
;
}
}
while
(
cur_state
!=
end
);
return
0
;
}
int
cmp_func
(
const
char
*
str1
,
const
char
*
str2
,
int
size
,
int
case_sensitive
)
{
if
(
case_sensitive
==
1
)
return
strncmp
(
str1
,
str2
,
size
);
else
return
strncasecmp
(
str1
,
str2
,
size
);
}
int
word_matcher
(
const
char
*
p
,
const
char
*
fv
,
int
case_sensitive
)
{
int
read
,
size
,
offset
=
0
;
const
char
*
match
;
while
(
read
=
enum_fields
(
fv
+
offset
,
&
match
,
&
size
))
{
if
(
strlen
(
p
)
==
size
)
{
if
(
cmp_func
(
match
,
p
,
size
,
case_sensitive
)
==
0
)
{
return
1
;
}
}
offset
+=
read
;
}
return
0
;
}
int
substring_matcher
(
const
char
*
p
,
const
char
*
fv
,
int
case_sensitive
)
{
int
read
,
size
,
offset
=
0
;
const
char
*
match
;
while
(
read
=
enum_fields
(
fv
+
offset
,
&
match
,
&
size
))
{
if
(
strlen
(
p
)
<=
size
)
{
const
char
*
s
;
for
(
s
=
match
;
s
<=
match
+
size
-
strlen
(
p
);
s
++
)
{
if
(
cmp_func
(
s
,
p
,
strlen
(
p
),
case_sensitive
)
==
0
)
{
return
1
;
}
}
}
return
p
-
s
;
offset
+=
read
;
}
return
0
;
}
int
beginning_substring_matcher
(
const
char
*
p
,
const
char
*
fv
,
int
case_sensitive
)
{
int
read
,
size
,
offset
=
0
;
const
char
*
match
;
while
(
read
=
enum_fields
(
fv
+
offset
,
&
match
,
&
size
))
{
if
(
strlen
(
p
)
<=
size
)
{
if
(
cmp_func
(
match
,
p
,
strlen
(
p
),
case_sensitive
)
==
0
)
{
return
1
;
}
}
offset
+=
read
;
}
return
0
;
}
/*
...
...
@@ -119,14 +245,20 @@ KEY_Create(struct busyobj *bo, struct vsb **psb)
if
(
*
q
==
';'
)
{
VSB_clear
(
sbm
);
int
ksize
=
key_ParseMatcher
(
q
,
&
sbm
);
if
(
ksize
>
0
)
q
+=
ksize
;
else
{
// TODO: Cleanup allocations
error
=
1
;
return
0
;
int
read
;
int
type
;
const
char
*
match
;
int
size
;
while
(
read
=
enum_matchers
(
q
,
&
type
,
&
match
,
&
size
))
{
if
(
read
<
0
)
{
// TODO: Cleanup allocations
error
=
1
;
return
0
;
}
VSB_printf
(
sbm
,
"%c%.*s%c"
,
type
,
size
,
match
,
0
);
q
+=
read
;
}
AZ
(
VSB_finish
(
sbm
));
l
=
VSB_len
(
sbm
);
e
=
h
;
...
...
@@ -201,126 +333,6 @@ KEY_Validate(const uint8_t *key)
}
}
int
enum_fields
(
const
char
*
fv
,
const
char
**
m
,
int
*
s
)
{
const
char
*
f
=
0
,
*
b
=
0
;
enum
state
{
start
,
skip_space
,
scan
,
scan_quote
,
scan_back
,
done
,
end
}
cur_state
=
start
;
do
{
switch
(
cur_state
)
{
case
start
:
f
=
fv
;
cur_state
=
skip_space
;
break
;
case
skip_space
:
if
(
*
f
==
'\0'
)
cur_state
=
end
;
else
if
(
*
f
==
' '
||
*
f
==
','
)
f
++
;
else
if
(
*
f
==
'"'
)
{
b
=
f
;
cur_state
=
scan_quote
;
}
else
{
b
=
f
;
cur_state
=
scan
;
}
break
;
case
scan
:
b
++
;
if
(
*
b
==
'\0'
)
cur_state
=
scan_back
;
else
if
(
*
b
==
'"'
)
cur_state
=
scan_quote
;
else
if
(
*
b
==
','
)
cur_state
=
scan_back
;
break
;
case
scan_quote
:
b
++
;
if
(
*
b
==
'\0'
)
cur_state
=
scan_back
;
else
if
(
*
b
==
'\\'
&&
b
[
1
]
!=
'\0'
)
b
+=
2
;
else
if
(
*
b
==
'"'
)
cur_state
=
scan
;
break
;
case
scan_back
:
b
--
;
if
(
*
b
!=
' '
)
cur_state
=
done
;
break
;
case
done
:
*
m
=
f
;
*
s
=
(
int
)(
b
-
f
)
+
1
;
return
b
-
fv
+
1
;
break
;
}
}
while
(
cur_state
!=
end
);
return
0
;
}
int
cmp_func
(
const
char
*
str1
,
const
char
*
str2
,
int
size
,
int
case_sensitive
)
{
if
(
case_sensitive
==
1
)
return
strncmp
(
str1
,
str2
,
size
);
else
return
strncasecmp
(
str1
,
str2
,
size
);
}
int
word_matcher
(
const
char
*
p
,
const
char
*
fv
,
int
case_sensitive
)
{
int
read
,
size
,
offset
=
0
;
const
char
*
match
;
while
(
read
=
enum_fields
(
fv
+
offset
,
&
match
,
&
size
))
{
if
(
strlen
(
p
)
==
size
)
{
if
(
cmp_func
(
match
,
p
,
size
,
case_sensitive
)
==
0
)
{
return
1
;
}
}
offset
+=
read
;
}
return
0
;
}
int
substring_matcher
(
const
char
*
p
,
const
char
*
fv
,
int
case_sensitive
)
{
int
read
,
size
,
offset
=
0
;
const
char
*
match
;
while
(
read
=
enum_fields
(
fv
+
offset
,
&
match
,
&
size
))
{
if
(
strlen
(
p
)
<=
size
)
{
const
char
*
s
;
for
(
s
=
match
;
s
<=
match
+
size
-
strlen
(
p
);
s
++
)
{
if
(
cmp_func
(
s
,
p
,
strlen
(
p
),
case_sensitive
)
==
0
)
{
return
1
;
}
}
}
offset
+=
read
;
}
return
0
;
}
int
beginning_substring_matcher
(
const
char
*
p
,
const
char
*
fv
,
int
case_sensitive
)
{
int
read
,
size
,
offset
=
0
;
const
char
*
match
;
while
(
read
=
enum_fields
(
fv
+
offset
,
&
match
,
&
size
))
{
if
(
strlen
(
p
)
<=
size
)
{
if
(
cmp_func
(
match
,
p
,
strlen
(
p
),
case_sensitive
)
==
0
)
{
return
1
;
}
}
offset
+=
read
;
}
return
0
;
}
int
KEY_Match
(
struct
http
*
http
,
const
uint8_t
*
key
)
{
...
...
@@ -392,10 +404,10 @@ KEY_Match(struct http *http, const uint8_t *key)
matcher
+=
strlen
(
matcher
)
+
1
;
}
else
if
(
*
matcher
==
M_CASE
)
{
case_flag
=
1
;
matcher
++
;
matcher
+=
strlen
(
matcher
)
+
1
;
}
else
if
(
*
matcher
==
M_NOT
)
{
not_flag
=
0
;
matcher
++
;
matcher
+=
strlen
(
matcher
)
+
1
;
}
else
{
result
=
0
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment