From 348238b3a9a48fd9e7be19cfccae56d1bb44cf46 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 18 Jan 2010 15:05:57 +0100 Subject: [PATCH] [MINOR] tools: add a "word_match()" function to match words and ignore spaces Some header values might be delimited with spaces, so it's not enough to compare "close" or "keep-alive" with strncasecmp(). Use word_match() for that. --- include/common/standard.h | 9 ++++++++- src/standard.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/include/common/standard.h b/include/common/standard.h index c1f3d1a73..b19f0ccd9 100644 --- a/include/common/standard.h +++ b/include/common/standard.h @@ -2,7 +2,7 @@ * include/common/standard.h * This files contains some general purpose functions and macros. * - * Copyright (C) 2000-2009 Willy Tarreau - w@1wt.eu + * Copyright (C) 2000-2010 Willy Tarreau - w@1wt.eu * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -363,4 +363,11 @@ char *my_strndup(const char *src, int n); */ unsigned int get_next_id(struct eb_root *root, unsigned int key); +/* This function compares a sample word possibly followed by blanks to another + * clean word. The compare is case-insensitive. 1 is returned if both are equal, + * otherwise zero. This intends to be used when checking HTTP headers for some + * values. + */ +int word_match(const char *sample, int slen, const char *word, int wlen); + #endif /* _COMMON_STANDARD_H */ diff --git a/src/standard.c b/src/standard.c index 81cdda407..f841c6dcd 100644 --- a/src/standard.c +++ b/src/standard.c @@ -1,7 +1,7 @@ /* * General purpose functions. * - * Copyright 2000-2009 Willy Tarreau + * Copyright 2000-2010 Willy Tarreau * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -813,6 +813,35 @@ unsigned int get_next_id(struct eb_root *root, unsigned int key) return key; } +/* This function compares a sample word possibly followed by blanks to another + * clean word. The compare is case-insensitive. 1 is returned if both are equal, + * otherwise zero. This intends to be used when checking HTTP headers for some + * values. Note that it validates a word followed only by blanks but does not + * validate a word followed by blanks then other chars. + */ +int word_match(const char *sample, int slen, const char *word, int wlen) +{ + if (slen < wlen) + return 0; + + while (wlen) { + char c = *sample ^ *word; + if (c && c != ('A' ^ 'a')) + return 0; + sample++; + word++; + slen--; + wlen--; + } + + while (slen) { + if (*sample != ' ' && *sample != '\t') + return 0; + sample++; + slen--; + } + return 1; +} /* * Local variables: