[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [libmicrohttpd] 02/06: Added function for detection of toke
From: |
gnunet |
Subject: |
[GNUnet-SVN] [libmicrohttpd] 02/06: Added function for detection of token inside comma-separated string, added tests |
Date: |
Tue, 09 May 2017 21:34:08 +0200 |
This is an automated email from the git hooks/post-receive script.
karlson2k pushed a commit to branch master
in repository libmicrohttpd.
commit e93439da71e027cafe5b2788a997cbfc85d193c8
Author: Evgeny Grin (Karlson2k) <address@hidden>
AuthorDate: Mon May 8 17:24:19 2017 +0300
Added function for detection of token inside comma-separated string, added
tests
---
src/microhttpd/Makefile.am | 4 ++++
src/microhttpd/internal.h | 3 +++
src/microhttpd/mhd_str.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++
src/microhttpd/mhd_str.h | 42 +++++++++++++++++++++++++++++++++
4 files changed, 107 insertions(+)
diff --git a/src/microhttpd/Makefile.am b/src/microhttpd/Makefile.am
index 3f1b828f..36121539 100644
--- a/src/microhttpd/Makefile.am
+++ b/src/microhttpd/Makefile.am
@@ -142,6 +142,7 @@ endif
check_PROGRAMS = \
test_str_compare \
test_str_to_value \
+ test_str_token \
test_http_reasons \
test_shutdown_select \
test_shutdown_poll \
@@ -251,6 +252,9 @@ test_str_compare_SOURCES = \
test_str_to_value_SOURCES = \
test_str.c test_helpers.h mhd_str.c
+test_str_token_SOURCES = \
+ test_str_token.c mhd_str.c
+
test_http_reasons_SOURCES = \
test_http_reasons.c \
reason_phrase.c mhd_str.c mhd_str.h
diff --git a/src/microhttpd/internal.h b/src/microhttpd/internal.h
index cb6753c9..a9c46c6d 100644
--- a/src/microhttpd/internal.h
+++ b/src/microhttpd/internal.h
@@ -117,10 +117,13 @@ extern void *mhd_panic_cls;
#define BUILTIN_NOT_REACHED
#endif
+#ifndef MHD_STATICSTR_LEN_
/**
* Determine length of static string / macro strings at compile time.
*/
#define MHD_STATICSTR_LEN_(macro) (sizeof(macro)/sizeof(char) - 1)
+#endif /* ! MHD_STATICSTR_LEN_ */
+
/**
* State of the socket with respect to epoll (bitmask).
diff --git a/src/microhttpd/mhd_str.c b/src/microhttpd/mhd_str.c
index c5e9813c..bb10d26f 100644
--- a/src/microhttpd/mhd_str.c
+++ b/src/microhttpd/mhd_str.c
@@ -365,6 +365,64 @@ MHD_str_equal_caseless_n_ (const char * const str1,
return !0;
}
+
+/**
+ * Check whether @a str has case-insensitive @a token.
+ * Token could be surrounded by spaces and tabs and delimited by comma.
+ * Match succeed if substring between start, end (of string) or comma
+ * contains only case-insensitive token and optional spaces and tabs.
+ * @warning token must not contain null-charters except optional
+ * terminating null-character.
+ * @param str the string to check
+ * @param token the token to find
+ * @param token_len length of token, not including optional terminating
+ * null-character.
+ * @return non-zero if two strings are equal, zero otherwise.
+ */
+bool
+MHD_str_has_token_caseless_ (const char * str,
+ const char * const token,
+ size_t token_len)
+{
+ if (0 == token_len)
+ return false;
+
+ while (0 != *str)
+ {
+ size_t i;
+ /* Skip all whitespaces and empty tokens. */
+ while (' ' == *str || '\t' == *str || ',' == *str) str++;
+
+ /* Check for token match. */
+ i = 0;
+ while (1)
+ {
+ const char sc = *(str++);
+ const char tc = token[i++];
+
+ if (0 == sc)
+ return false;
+ if ( (sc != tc) &&
+ (toasciilower (sc) != toasciilower (tc)) )
+ break;
+ if (i >= token_len)
+ {
+ /* Check whether substring match token fully or
+ * has additional unmatched chars at tail. */
+ while (' ' == *str || '\t' == *str) str++;
+ /* End of (sub)string? */
+ if (0 == *str || ',' == *str)
+ return true;
+ /* Unmatched chars at end of substring. */
+ break;
+ }
+ }
+ /* Find next substring. */
+ while (0 != *str && ',' != *str) str++;
+ }
+ return false;
+}
+
#ifndef MHD_FAVOR_SMALL_CODE
/* Use individual function for each case */
diff --git a/src/microhttpd/mhd_str.h b/src/microhttpd/mhd_str.h
index 0ee41717..410cc36e 100644
--- a/src/microhttpd/mhd_str.h
+++ b/src/microhttpd/mhd_str.h
@@ -30,11 +30,21 @@
#include <stdint.h>
#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+#include <stdbool.h>
+#endif /* HAVE_STDBOOL_H */
#ifdef MHD_FAVOR_SMALL_CODE
#include "mhd_limits.h"
#endif /* MHD_FAVOR_SMALL_CODE */
+#ifndef MHD_STATICSTR_LEN_
+/**
+ * Determine length of static string / macro strings at compile time.
+ */
+#define MHD_STATICSTR_LEN_(macro) (sizeof(macro)/sizeof(char) - 1)
+#endif /* ! MHD_STATICSTR_LEN_ */
+
/*
* Block of functions/macros that use US-ASCII charset as required by HTTP
* standards. Not affected by current locale settings.
@@ -71,6 +81,38 @@ MHD_str_equal_caseless_n_ (const char * const str1,
const char * const str2,
size_t maxlen);
+
+/**
+ * Check whether @a str has case-insensitive @a token.
+ * Token could be surrounded by spaces and tabs and delimited by comma.
+ * Match succeed if substring between start, end of string or comma
+ * contains only case-insensitive token and optional spaces and tabs.
+ * @warning token must not contain null-charters except optional
+ * terminating null-character.
+ * @param str the string to check
+ * @param token the token to find
+ * @param token_len length of token, not including optional terminating
+ * null-character.
+ * @return non-zero if two strings are equal, zero otherwise.
+ */
+bool
+MHD_str_has_token_caseless_ (const char * str,
+ const char * const token,
+ size_t token_len);
+
+/**
+ * Check whether @a str has case-insensitive static @a tkn.
+ * Token could be surrounded by spaces and tabs and delimited by comma.
+ * Match succeed if substring between start, end of string or comma
+ * contains only case-insensitive token and optional spaces and tabs.
+ * @warning tkn must be static string
+ * @param str the string to check
+ * @param tkn the static string of token to find
+ * @return non-zero if two strings are equal, zero otherwise.
+ */
+#define MHD_str_has_s_token_caseless_(str,tkn) \
+ MHD_str_has_token_caseless_((str),(tkn),MHD_STATICSTR_LEN_(tkn))
+
#ifndef MHD_FAVOR_SMALL_CODE
/* Use individual function for each case to improve speed */
--
To stop receiving notification emails like this one, please contact
address@hidden
- [GNUnet-SVN] [libmicrohttpd] branch master updated (4809ee65 -> e0825eab), gnunet, 2017/05/09
- [GNUnet-SVN] [libmicrohttpd] 01/06: Fixed missing include, gnunet, 2017/05/09
- [GNUnet-SVN] [libmicrohttpd] 03/06: Added internal function for finding token in response headers MHD_check_response_header_token_ci(), gnunet, 2017/05/09
- [GNUnet-SVN] [libmicrohttpd] 05/06: Added internal function for finding token in request headers, gnunet, 2017/05/09
- [GNUnet-SVN] [libmicrohttpd] 02/06: Added function for detection of token inside comma-separated string, added tests,
gnunet <=
- [GNUnet-SVN] [libmicrohttpd] 04/06: Detect several tokens in single header line of response., gnunet, 2017/05/09
- [GNUnet-SVN] [libmicrohttpd] 06/06: Fixed: check all request "Connection" headers for "Close" and "Upgrade" tokens instead of using only first "Connection" header with full string match., gnunet, 2017/05/09