gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libmicrohttpd] 03/03: digestauth: keep results of algo and QOP parsing,


From: gnunet
Subject: [libmicrohttpd] 03/03: digestauth: keep results of algo and QOP parsing, renamed public struct member
Date: Thu, 25 Aug 2022 19:07:02 +0200

This is an automated email from the git hooks/post-receive script.

karlson2k pushed a commit to branch master
in repository libmicrohttpd.

commit a2916400661cb7c468af5744ea284ec9157abac9
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Thu Aug 25 20:02:30 2022 +0300

    digestauth: keep results of algo and QOP parsing, renamed public struct 
member
---
 src/include/microhttpd.h                 |   4 +-
 src/microhttpd/Makefile.am               |   2 +-
 src/microhttpd/digestauth.c              | 163 +----------
 src/microhttpd/digestauth.h              |  58 ++--
 src/microhttpd/gen_auth.c                | 129 ++++++++-
 src/microhttpd/internal.h                |  46 ++++
 src/microhttpd/mhd_str.h                 |  42 +--
 src/microhttpd/mhd_str_types.h           |  68 +++++
 src/microhttpd/test_auth_parse.c         | 460 +++++++++++++++++++++++--------
 src/testcurl/test_digestauth2.c          |   4 +-
 src/testcurl/test_digestauth_emu_ext.c   |   4 +-
 w32/common/libmicrohttpd-files.vcxproj   |   1 +
 w32/common/libmicrohttpd-filters.vcxproj |   3 +
 13 files changed, 631 insertions(+), 353 deletions(-)

diff --git a/src/include/microhttpd.h b/src/include/microhttpd.h
index d50672ec..a824b72f 100644
--- a/src/include/microhttpd.h
+++ b/src/include/microhttpd.h
@@ -4789,7 +4789,7 @@ enum MHD_DigestAuthMultiQOP
  *
  * Application may modify buffers as needed until #MHD_free() is called for
  * pointer to this structure
- * @note Available since #MHD_VERSION 0x00097525
+ * @note Available since #MHD_VERSION 0x00097533
  */
 struct MHD_DigestAuthInfo
 {
@@ -4799,7 +4799,7 @@ struct MHD_DigestAuthInfo
    * @warning Do not be confused with #MHD_DigestAuthAlgorithm,
    *          which uses other values!
    */
-  enum MHD_DigestAuthAlgo3 algo;
+  enum MHD_DigestAuthAlgo3 algo3;
 
   /**
    * The type of username used by client.
diff --git a/src/microhttpd/Makefile.am b/src/microhttpd/Makefile.am
index 58ab10a8..b4339f08 100644
--- a/src/microhttpd/Makefile.am
+++ b/src/microhttpd/Makefile.am
@@ -82,7 +82,7 @@ libmicrohttpd_la_SOURCES = \
   mhd_mono_clock.c mhd_mono_clock.h \
   mhd_limits.h \
   sysfdsetsize.c sysfdsetsize.h \
-  mhd_str.c mhd_str.h \
+  mhd_str.c mhd_str.h mhd_str_types.h\
   mhd_send.h mhd_send.c \
   mhd_assert.h \
   mhd_sockets.c mhd_sockets.h \
diff --git a/src/microhttpd/digestauth.c b/src/microhttpd/digestauth.c
index 569e8991..cc6cd0ac 100644
--- a/src/microhttpd/digestauth.c
+++ b/src/microhttpd/digestauth.c
@@ -133,37 +133,6 @@
  */
 #define MAX_AUTH_RESPONSE_LENGTH (MAX_DIGEST * 2)
 
-/**
- * The token for MD5 algorithm.
- */
-#define _MHD_MD5_TOKEN "MD5"
-
-/**
- * The token for SHA-256 algorithm.
- */
-#define _MHD_SHA256_TOKEN "SHA-256"
-
-/**
- * The token for SHA-512/256 algorithm.
- * Unsupported currently by MHD for authentication.
- */
-#define _MHD_SHA512_256_TOKEN "SHA-512-256"
-
-/**
- * The suffix token for "session" algorithms.
- */
-#define _MHD_SESS_TOKEN "-sess"
-
-/**
- * The "auth" token for QOP
- */
-#define MHD_TOKEN_AUTH_ "auth"
-
-/**
- * The "auth-int" token for QOP
- */
-#define MHD_TOKEN_AUTH_INT_ "auth-int"
-
 /**
  * The required prefix of parameter with the extended notation
  */
@@ -728,89 +697,6 @@ get_rq_unames_size (const struct MHD_RqDAuth *params,
 }
 
 
-/**
- * Get client's Digest Authorization algorithm type.
- * If no algorithm is specified by client, MD5 is assumed.
- * @param params the Digest Authorization parameters
- * @return the algorithm type
- */
-static enum MHD_DigestAuthAlgo3
-get_rq_algo (const struct MHD_RqDAuth *params)
-{
-  const struct MHD_RqDAuthParam *const algo_param =
-    &params->algorithm;
-  if (NULL == algo_param->value.str)
-    return MHD_DIGEST_AUTH_ALGO3_MD5; /* Assume MD5 by default */
-
-  if (algo_param->quoted)
-  {
-    if (MHD_str_equal_caseless_quoted_s_bin_n (algo_param->value.str, \
-                                               algo_param->value.len, \
-                                               _MHD_MD5_TOKEN))
-      return MHD_DIGEST_AUTH_ALGO3_MD5;
-    if (MHD_str_equal_caseless_quoted_s_bin_n (algo_param->value.str, \
-                                               algo_param->value.len, \
-                                               _MHD_SHA256_TOKEN))
-      return MHD_DIGEST_AUTH_ALGO3_SHA256;
-    if (MHD_str_equal_caseless_quoted_s_bin_n (algo_param->value.str, \
-                                               algo_param->value.len, \
-                                               _MHD_MD5_TOKEN _MHD_SESS_TOKEN))
-      return MHD_DIGEST_AUTH_ALGO3_MD5_SESSION;
-    if (MHD_str_equal_caseless_quoted_s_bin_n (algo_param->value.str, \
-                                               algo_param->value.len, \
-                                               _MHD_SHA256_TOKEN \
-                                               _MHD_SESS_TOKEN))
-      return MHD_DIGEST_AUTH_ALGO3_SHA256_SESSION;
-
-    /* Algorithms below are not supported by MHD for authentication */
-
-    if (MHD_str_equal_caseless_quoted_s_bin_n (algo_param->value.str, \
-                                               algo_param->value.len, \
-                                               _MHD_SHA512_256_TOKEN))
-      return MHD_DIGEST_AUTH_ALGO3_SHA512_256;
-    if (MHD_str_equal_caseless_quoted_s_bin_n (algo_param->value.str, \
-                                               algo_param->value.len, \
-                                               _MHD_SHA512_256_TOKEN \
-                                               _MHD_SESS_TOKEN))
-      return MHD_DIGEST_AUTH_ALGO3_SHA512_256_SESSION;
-
-    /* No known algorithm has been detected */
-    return MHD_DIGEST_AUTH_ALGO3_INVALID;
-  }
-  /* The algorithm value is not quoted */
-  if (MHD_str_equal_caseless_s_bin_n_ (_MHD_MD5_TOKEN, \
-                                       algo_param->value.str, \
-                                       algo_param->value.len))
-    return MHD_DIGEST_AUTH_ALGO3_MD5;
-  if (MHD_str_equal_caseless_s_bin_n_ (_MHD_SHA256_TOKEN, \
-                                       algo_param->value.str, \
-                                       algo_param->value.len))
-    return MHD_DIGEST_AUTH_ALGO3_SHA256;
-  if (MHD_str_equal_caseless_s_bin_n_ (_MHD_MD5_TOKEN _MHD_SESS_TOKEN, \
-                                       algo_param->value.str, \
-                                       algo_param->value.len))
-    return MHD_DIGEST_AUTH_ALGO3_MD5_SESSION;
-  if (MHD_str_equal_caseless_s_bin_n_ (_MHD_SHA256_TOKEN _MHD_SESS_TOKEN, \
-                                       algo_param->value.str, \
-                                       algo_param->value.len))
-    return MHD_DIGEST_AUTH_ALGO3_SHA256_SESSION;
-
-  /* Algorithms below are not supported by MHD for authentication */
-
-  if (MHD_str_equal_caseless_s_bin_n_ (_MHD_SHA512_256_TOKEN, \
-                                       algo_param->value.str, \
-                                       algo_param->value.len))
-    return MHD_DIGEST_AUTH_ALGO3_SHA512_256;
-  if (MHD_str_equal_caseless_s_bin_n_ (_MHD_SHA512_256_TOKEN _MHD_SESS_TOKEN, \
-                                       algo_param->value.str, \
-                                       algo_param->value.len))
-    return MHD_DIGEST_AUTH_ALGO3_SHA512_256_SESSION;
-
-  /* No known algorithm has been detected */
-  return MHD_DIGEST_AUTH_ALGO3_INVALID;
-}
-
-
 /**
  * Get unquoted version of Digest Authorization parameter.
  * This function automatically zero-teminate the result.
@@ -972,45 +858,6 @@ get_rq_uname (const struct MHD_RqDAuth *params,
 }
 
 
-/**
- * Get QOP ('quality of protection') type.
- * @param params the Digest Authorization parameters
- * @return detected QOP ('quality of protection') type.
- */
-static enum MHD_DigestAuthQOP
-get_rq_qop (const struct MHD_RqDAuth *params)
-{
-  const struct MHD_RqDAuthParam *const qop_param =
-    &params->qop;
-  if (NULL == qop_param->value.str)
-    return MHD_DIGEST_AUTH_QOP_NONE;
-  if (qop_param->quoted)
-  {
-    if (MHD_str_equal_caseless_quoted_s_bin_n (qop_param->value.str, \
-                                               qop_param->value.len, \
-                                               "auth"))
-      return MHD_DIGEST_AUTH_QOP_AUTH;
-    if (MHD_str_equal_caseless_quoted_s_bin_n (qop_param->value.str, \
-                                               qop_param->value.len, \
-                                               "auth-int"))
-      return MHD_DIGEST_AUTH_QOP_AUTH_INT;
-  }
-  else
-  {
-    if (MHD_str_equal_caseless_s_bin_n_ ("auth", \
-                                         qop_param->value.str, \
-                                         qop_param->value.len))
-      return MHD_DIGEST_AUTH_QOP_AUTH;
-    if (MHD_str_equal_caseless_s_bin_n_ ("auth-int", \
-                                         qop_param->value.str, \
-                                         qop_param->value.len))
-      return MHD_DIGEST_AUTH_QOP_AUTH_INT;
-  }
-  /* No know QOP has been detected */
-  return MHD_DIGEST_AUTH_QOP_INVALID;
-}
-
-
 /**
  * Result of request's Digest Authorization 'nc' value extraction
  */
@@ -1124,7 +971,7 @@ MHD_digest_auth_get_request_info3 (struct MHD_Connection 
*connection)
   unif_buf_ptr = (uint8_t *) (info + 1);
   unif_buf_used = 0;
 
-  info->algo = get_rq_algo (params);
+  info->algo3 = params->algo3;
 
   if ( (MHD_DIGEST_AUTH_UNAME_TYPE_MISSING != uname_type) &&
        (MHD_DIGEST_AUTH_UNAME_TYPE_INVALID != uname_type) )
@@ -1159,7 +1006,7 @@ MHD_digest_auth_get_request_info3 (struct MHD_Connection 
*connection)
 
   mhd_assert (unif_buf_size >= unif_buf_used);
 
-  info->qop = get_rq_qop (params);
+  info->qop = params->qop;
 
   if (NULL != params->cnonce.value.str)
     info->cnonce_len = params->cnonce.value.len;
@@ -2110,7 +1957,7 @@ digest_auth_check_all_inner (struct MHD_Connection 
*connection,
 
   /* ** Initial parameters checks and setup ** */
   /* Get client's algorithm */
-  c_algo = get_rq_algo (params);
+  c_algo = params->algo3;
   /* Check whether client's algorithm is allowed by function parameter */
   if (((unsigned int) c_algo) !=
       (((unsigned int) c_algo) & ((unsigned int) malgo3)))
@@ -2135,7 +1982,7 @@ digest_auth_check_all_inner (struct MHD_Connection 
*connection,
   if (! digest_setup (&da, get_base_digest_algo (c_algo)))
     MHD_PANIC (_ ("Wrong 'malgo3' value, API violation"));
   /* Check 'mqop' value */
-  c_qop = get_rq_qop (params);
+  c_qop = params->qop;
   /* Check whether client's algorithm is allowed by function parameter */
   if (((unsigned int) c_qop) !=
       (((unsigned int) c_qop) & ((unsigned int) mqop)))
@@ -2479,7 +2326,7 @@ digest_auth_check_all_inner (struct MHD_Connection 
*connection,
     /* Update digest with ':' */
     digest_update_with_colon (&da);
     /* Update digest with 'qop' value */
-    unq_res = get_unquoted_param (&params->qop, tmp1, ptmp2, &tmp2_size,
+    unq_res = get_unquoted_param (&params->qop_raw, tmp1, ptmp2, &tmp2_size,
                                   &unquoted);
     if (_MHD_UNQ_OK != unq_res)
       return MHD_DAUTH_ERROR;
diff --git a/src/microhttpd/digestauth.h b/src/microhttpd/digestauth.h
index af54bc63..e8844f27 100644
--- a/src/microhttpd/digestauth.h
+++ b/src/microhttpd/digestauth.h
@@ -50,43 +50,35 @@
 #define _MHD_AUTH_DIGEST_BASE   "Digest"
 
 /**
- * Parameter of request's Digest Authorization header
+ * The token for MD5 algorithm.
  */
-struct MHD_RqDAuthParam
-{
-  /**
-   * The string with length, NOT zero-terminated
-   */
-  struct _MHD_str_w_len value;
-  /**
-   * True if string must be "unquoted" before processing.
-   * This member is false if the string is used in DQUOTE marks, but no
-   * backslash-escape is used in the string.
-   */
-  bool quoted;
-};
+#define _MHD_MD5_TOKEN "MD5"
 
 /**
- * Request client's Digest Authorization header parameters
+ * The token for SHA-256 algorithm.
  */
-struct MHD_RqDAuth
-{
-  struct MHD_RqDAuthParam nonce;
-  struct MHD_RqDAuthParam opaque;
-  struct MHD_RqDAuthParam algorithm;
-  struct MHD_RqDAuthParam response;
-  struct MHD_RqDAuthParam username;
-  struct MHD_RqDAuthParam username_ext;
-  struct MHD_RqDAuthParam realm;
-  struct MHD_RqDAuthParam uri;
-  struct MHD_RqDAuthParam qop;
-  struct MHD_RqDAuthParam cnonce;
-  struct MHD_RqDAuthParam nc;
-  /**
-   * True if 'userhash' parameter is used with value 'true'.
-   */
-  bool userhash;
-};
+#define _MHD_SHA256_TOKEN "SHA-256"
+
+/**
+ * The token for SHA-512/256 algorithm.
+ * Unsupported currently by MHD for authentication.
+ */
+#define _MHD_SHA512_256_TOKEN "SHA-512-256"
+
+/**
+ * The suffix token for "session" algorithms.
+ */
+#define _MHD_SESS_TOKEN "-sess"
+
+/**
+ * The "auth" token for QOP
+ */
+#define MHD_TOKEN_AUTH_ "auth"
+
+/**
+ * The "auth-int" token for QOP
+ */
+#define MHD_TOKEN_AUTH_INT_ "auth-int"
 
 #endif /* ! MHD_DIGESTAUTH_H */
 
diff --git a/src/microhttpd/gen_auth.c b/src/microhttpd/gen_auth.c
index 5c383f1a..c86d35ba 100644
--- a/src/microhttpd/gen_auth.c
+++ b/src/microhttpd/gen_auth.c
@@ -274,6 +274,125 @@ struct dauth_token_param
   struct MHD_RqDAuthParam *const param;
 };
 
+
+/**
+ * Get client's Digest Authorization algorithm type.
+ * If no algorithm is specified by client, MD5 is assumed.
+ * @param params the Digest Authorization 'algorithm' parameter
+ * @return the algorithm type
+ */
+static enum MHD_DigestAuthAlgo3
+get_rq_dauth_algo (const struct MHD_RqDAuthParam *const algo_param)
+{
+  if (NULL == algo_param->value.str)
+    return MHD_DIGEST_AUTH_ALGO3_MD5; /* Assume MD5 by default */
+
+  if (algo_param->quoted)
+  {
+    if (MHD_str_equal_caseless_quoted_s_bin_n (algo_param->value.str, \
+                                               algo_param->value.len, \
+                                               _MHD_MD5_TOKEN))
+      return MHD_DIGEST_AUTH_ALGO3_MD5;
+    if (MHD_str_equal_caseless_quoted_s_bin_n (algo_param->value.str, \
+                                               algo_param->value.len, \
+                                               _MHD_SHA256_TOKEN))
+      return MHD_DIGEST_AUTH_ALGO3_SHA256;
+    if (MHD_str_equal_caseless_quoted_s_bin_n (algo_param->value.str, \
+                                               algo_param->value.len, \
+                                               _MHD_MD5_TOKEN _MHD_SESS_TOKEN))
+      return MHD_DIGEST_AUTH_ALGO3_MD5_SESSION;
+    if (MHD_str_equal_caseless_quoted_s_bin_n (algo_param->value.str, \
+                                               algo_param->value.len, \
+                                               _MHD_SHA256_TOKEN \
+                                               _MHD_SESS_TOKEN))
+      return MHD_DIGEST_AUTH_ALGO3_SHA256_SESSION;
+
+    /* Algorithms below are not supported by MHD for authentication */
+
+    if (MHD_str_equal_caseless_quoted_s_bin_n (algo_param->value.str, \
+                                               algo_param->value.len, \
+                                               _MHD_SHA512_256_TOKEN))
+      return MHD_DIGEST_AUTH_ALGO3_SHA512_256;
+    if (MHD_str_equal_caseless_quoted_s_bin_n (algo_param->value.str, \
+                                               algo_param->value.len, \
+                                               _MHD_SHA512_256_TOKEN \
+                                               _MHD_SESS_TOKEN))
+      return MHD_DIGEST_AUTH_ALGO3_SHA512_256_SESSION;
+
+    /* No known algorithm has been detected */
+    return MHD_DIGEST_AUTH_ALGO3_INVALID;
+  }
+  /* The algorithm value is not quoted */
+  if (MHD_str_equal_caseless_s_bin_n_ (_MHD_MD5_TOKEN, \
+                                       algo_param->value.str, \
+                                       algo_param->value.len))
+    return MHD_DIGEST_AUTH_ALGO3_MD5;
+  if (MHD_str_equal_caseless_s_bin_n_ (_MHD_SHA256_TOKEN, \
+                                       algo_param->value.str, \
+                                       algo_param->value.len))
+    return MHD_DIGEST_AUTH_ALGO3_SHA256;
+  if (MHD_str_equal_caseless_s_bin_n_ (_MHD_MD5_TOKEN _MHD_SESS_TOKEN, \
+                                       algo_param->value.str, \
+                                       algo_param->value.len))
+    return MHD_DIGEST_AUTH_ALGO3_MD5_SESSION;
+  if (MHD_str_equal_caseless_s_bin_n_ (_MHD_SHA256_TOKEN _MHD_SESS_TOKEN, \
+                                       algo_param->value.str, \
+                                       algo_param->value.len))
+    return MHD_DIGEST_AUTH_ALGO3_SHA256_SESSION;
+
+  /* Algorithms below are not supported by MHD for authentication */
+
+  if (MHD_str_equal_caseless_s_bin_n_ (_MHD_SHA512_256_TOKEN, \
+                                       algo_param->value.str, \
+                                       algo_param->value.len))
+    return MHD_DIGEST_AUTH_ALGO3_SHA512_256;
+  if (MHD_str_equal_caseless_s_bin_n_ (_MHD_SHA512_256_TOKEN _MHD_SESS_TOKEN, \
+                                       algo_param->value.str, \
+                                       algo_param->value.len))
+    return MHD_DIGEST_AUTH_ALGO3_SHA512_256_SESSION;
+
+  /* No known algorithm has been detected */
+  return MHD_DIGEST_AUTH_ALGO3_INVALID;
+}
+
+
+/**
+ * Get QOP ('quality of protection') type.
+ * @param qop_param the Digest Authorization 'QOP' parameter
+ * @return detected QOP ('quality of protection') type.
+ */
+static enum MHD_DigestAuthQOP
+get_rq_dauth_qop (const struct MHD_RqDAuthParam *const qop_param)
+{
+  if (NULL == qop_param->value.str)
+    return MHD_DIGEST_AUTH_QOP_NONE;
+  if (qop_param->quoted)
+  {
+    if (MHD_str_equal_caseless_quoted_s_bin_n (qop_param->value.str, \
+                                               qop_param->value.len, \
+                                               MHD_TOKEN_AUTH_))
+      return MHD_DIGEST_AUTH_QOP_AUTH;
+    if (MHD_str_equal_caseless_quoted_s_bin_n (qop_param->value.str, \
+                                               qop_param->value.len, \
+                                               MHD_TOKEN_AUTH_INT_))
+      return MHD_DIGEST_AUTH_QOP_AUTH_INT;
+  }
+  else
+  {
+    if (MHD_str_equal_caseless_s_bin_n_ (MHD_TOKEN_AUTH_, \
+                                         qop_param->value.str, \
+                                         qop_param->value.len))
+      return MHD_DIGEST_AUTH_QOP_AUTH;
+    if (MHD_str_equal_caseless_s_bin_n_ (MHD_TOKEN_AUTH_INT_, \
+                                         qop_param->value.str, \
+                                         qop_param->value.len))
+      return MHD_DIGEST_AUTH_QOP_AUTH_INT;
+  }
+  /* No know QOP has been detected */
+  return MHD_DIGEST_AUTH_QOP_INVALID;
+}
+
+
 /**
  * Parse request Authorization header parameters for Digest Authentication
  * @param str the header string, everything after "Digest " substring
@@ -306,16 +425,17 @@ parse_dauth_params (const char *str,
   static const struct _MHD_cstr_w_len userhash_tk =
     _MHD_S_STR_W_LEN ("userhash");
   struct MHD_RqDAuthParam userhash;
+  struct MHD_RqDAuthParam algorithm;
   struct dauth_token_param map[] = {
     {&nonce_tk, &(pdauth->nonce)},
     {&opaque_tk, &(pdauth->opaque)},
-    {&algorithm_tk, &(pdauth->algorithm)},
+    {&algorithm_tk, &algorithm},
     {&response_tk, &(pdauth->response)},
     {&username_tk, &(pdauth->username)},
     {&username_ext_tk, &(pdauth->username_ext)},
     {&realm_tk, &(pdauth->realm)},
     {&uri_tk, &(pdauth->uri)},
-    {&qop_tk, &(pdauth->qop)},
+    {&qop_tk, &(pdauth->qop_raw)},
     {&cnonce_tk, &(pdauth->cnonce)},
     {&nc_tk, &(pdauth->nc)},
     {&userhash_tk, &userhash}
@@ -324,6 +444,7 @@ parse_dauth_params (const char *str,
   size_t p;
 
   memset (&userhash, 0, sizeof(userhash));
+  memset (&algorithm, 0, sizeof(algorithm));
   i = 0;
 
   /* Skip all whitespaces at start */
@@ -454,6 +575,7 @@ parse_dauth_params (const char *str,
   }
 
   /* Postprocess values */
+
   if (NULL != userhash.value.str)
   {
     if (userhash.quoted)
@@ -470,6 +592,9 @@ parse_dauth_params (const char *str,
   else
     pdauth->userhash = false;
 
+  pdauth->algo3 = get_rq_dauth_algo (&algorithm);
+  pdauth->qop = get_rq_dauth_qop (&pdauth->qop_raw);
+
   return true;
 }
 
diff --git a/src/microhttpd/internal.h b/src/microhttpd/internal.h
index 3a81b2a2..3fa773a7 100644
--- a/src/microhttpd/internal.h
+++ b/src/microhttpd/internal.h
@@ -62,6 +62,7 @@
 #include "mhd_locks.h"
 #include "mhd_sockets.h"
 #include "mhd_itc_types.h"
+#include "mhd_str_types.h"
 #if defined(BAUTH_SUPPORT) || defined(DAUTH_SUPPORT)
 #include "gen_auth.h"
 #endif /* BAUTH_SUPPORT || DAUTH_SUPPORT*/
@@ -2282,6 +2283,51 @@ struct MHD_Daemon
 };
 
 
+#ifdef DAUTH_SUPPORT
+
+/**
+ * Parameter of request's Digest Authorization header
+ */
+struct MHD_RqDAuthParam
+{
+  /**
+   * The string with length, NOT zero-terminated
+   */
+  struct _MHD_str_w_len value;
+  /**
+   * True if string must be "unquoted" before processing.
+   * This member is false if the string is used in DQUOTE marks, but no
+   * backslash-escape is used in the string.
+   */
+  bool quoted;
+};
+
+/**
+ * Request client's Digest Authorization header parameters
+ */
+struct MHD_RqDAuth
+{
+  struct MHD_RqDAuthParam nonce;
+  struct MHD_RqDAuthParam opaque;
+  struct MHD_RqDAuthParam response;
+  struct MHD_RqDAuthParam username;
+  struct MHD_RqDAuthParam username_ext;
+  struct MHD_RqDAuthParam realm;
+  struct MHD_RqDAuthParam uri;
+  /* The raw QOP value, used in the 'response' calculation */
+  struct MHD_RqDAuthParam qop_raw;
+  struct MHD_RqDAuthParam cnonce;
+  struct MHD_RqDAuthParam nc;
+
+  /* Decoded values are below */
+  bool userhash; /* True if 'userhash' parameter has value 'true'. */
+  enum MHD_DigestAuthAlgo3 algo3;
+  enum MHD_DigestAuthQOP qop;
+};
+
+
+#endif /* DAUTH_SUPPORT */
+
 /**
  * Insert an element at the head of a DLL. Assumes that head, tail and
  * element are structs with prev and next fields.
diff --git a/src/microhttpd/mhd_str.h b/src/microhttpd/mhd_str.h
index 284ad853..cd0af55f 100644
--- a/src/microhttpd/mhd_str.h
+++ b/src/microhttpd/mhd_str.h
@@ -38,6 +38,8 @@
 #include <stdbool.h>
 #endif /* HAVE_STDBOOL_H */
 
+#include "mhd_str_types.h"
+
 #if defined(_MSC_FULL_VER) && ! defined(_SSIZE_T_DEFINED)
 #define _SSIZE_T_DEFINED
 typedef intptr_t ssize_t;
@@ -47,46 +49,6 @@ typedef intptr_t ssize_t;
 #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_ */
-
-/**
- * Constant string with length
- */
-struct _MHD_cstr_w_len
-{
-  const char *const str;
-  const size_t len;
-};
-
-/**
- * String with length
- */
-struct _MHD_str_w_len
-{
-  const char *str;
-  size_t len;
-};
-
-/**
- * Modifiable string with length
- */
-struct _MHD_mstr_w_len
-{
-  char *str;
-  size_t len;
-};
-
-/**
- * Static string initialiser for struct _MHD_str_w_len
- */
-#define _MHD_S_STR_W_LEN(str) { str, MHD_STATICSTR_LEN_(str) }
-
-
 /*
  * Block of functions/macros that use US-ASCII charset as required by HTTP
  * standards. Not affected by current locale settings.
diff --git a/src/microhttpd/mhd_str_types.h b/src/microhttpd/mhd_str_types.h
new file mode 100644
index 00000000..c846ebef
--- /dev/null
+++ b/src/microhttpd/mhd_str_types.h
@@ -0,0 +1,68 @@
+/*
+  This file is part of libmicrohttpd
+  Copyright (C) 2015-2022 Karlson2k (Evgeny Grin)
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  
USA
+*/
+
+/**
+ * @file microhttpd/mhd_str_types.h
+ * @brief  Header for string manipulating helpers types
+ * @author Karlson2k (Evgeny Grin)
+ */
+
+#ifndef MHD_STR_TYPES_H
+#define MHD_STR_TYPES_H 1
+
+#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_ */
+
+/**
+ * Constant string with length
+ */
+struct _MHD_cstr_w_len
+{
+  const char *const str;
+  const size_t len;
+};
+
+/**
+ * String with length
+ */
+struct _MHD_str_w_len
+{
+  const char *str;
+  size_t len;
+};
+
+/**
+ * Modifiable string with length
+ */
+struct _MHD_mstr_w_len
+{
+  char *str;
+  size_t len;
+};
+
+/**
+ * Static string initialiser for struct _MHD_str_w_len
+ */
+#define _MHD_S_STR_W_LEN(str) { str, MHD_STATICSTR_LEN_(str) }
+
+#endif /* MHD_STR_TYPES_H */
diff --git a/src/microhttpd/test_auth_parse.c b/src/microhttpd/test_auth_parse.c
index b9507f97..8c11499b 100644
--- a/src/microhttpd/test_auth_parse.c
+++ b/src/microhttpd/test_auth_parse.c
@@ -956,13 +956,15 @@ cmp_dauth_param (const char *pname, const struct 
MHD_RqDAuthParam *param,
   if (0 != ret)
   {
     fprintf (stderr, "Parameter '%s' parsed incorrectly:\n", pname);
-    fprintf (stderr, "\tRESULT  :\tvalue.str: %s",
+    fprintf (stderr, "\tRESULT  :\tvalue.str: %.*s",
+             (int) (param->value.str ? param->value.len : 6),
              param->value.str ? param->value.str : "(NULL)");
     fprintf (stderr, "\tvalue.len: %u",
              (unsigned) param->value.len);
     fprintf (stderr, "\tquoted: %s\n",
              (unsigned) param->quoted ? "true" : "false");
-    fprintf (stderr, "\tEXPECTED:\tvalue.str: %s",
+    fprintf (stderr, "\tEXPECTED:\tvalue.str: %.*s",
+             (int) (expected_value ? expected_len : 6),
              expected_value ? expected_value : "(NULL)");
     fprintf (stderr, "\tvalue.len: %u",
              (unsigned) expected_len);
@@ -977,13 +979,14 @@ cmp_dauth_param (const char *pname, const struct 
MHD_RqDAuthParam *param,
 static unsigned int
 expect_digest_n (const char *hdr, size_t hdr_len,
                  const char *nonce,
-                 const char *algorithm,
+                 enum MHD_DigestAuthAlgo3 algo3,
                  const char *response,
                  const char *username,
                  const char *username_ext,
                  const char *realm,
                  const char *uri,
-                 const char *qop,
+                 const char *qop_raw,
+                 enum MHD_DigestAuthQOP qop,
                  const char *cnonce,
                  const char *nc,
                  int userhash,
@@ -1003,14 +1006,31 @@ expect_digest_n (const char *hdr, size_t hdr_len,
   ret = 0;
 
   ret += cmp_dauth_param ("nonce", &h->nonce, nonce);
-  ret += cmp_dauth_param ("algorithm", &h->algorithm, algorithm);
+  if (h->algo3 != algo3)
+  {
+    ret += 1;
+    fprintf (stderr, "Parameter 'algorithm' detected incorrectly:\n");
+    fprintf (stderr, "\tRESULT  :\t%u\n",
+             (unsigned) h->algo3);
+    fprintf (stderr, "\tEXPECTED:\t%u\n",
+             (unsigned) algo3);
+  }
   ret += cmp_dauth_param ("response", &h->response, response);
   ret += cmp_dauth_param ("username", &h->username, username);
   ret += cmp_dauth_param ("username_ext", &h->username_ext,
                           username_ext);
   ret += cmp_dauth_param ("realm", &h->realm, realm);
   ret += cmp_dauth_param ("uri", &h->uri, uri);
-  ret += cmp_dauth_param ("qop", &h->qop, qop);
+  ret += cmp_dauth_param ("qop", &h->qop_raw, qop_raw);
+  if (h->qop != qop)
+  {
+    ret += 1;
+    fprintf (stderr, "Parameter 'qop' detected incorrectly:\n");
+    fprintf (stderr, "\tRESULT  :\t%u\n",
+             (unsigned) h->qop);
+    fprintf (stderr, "\tEXPECTED:\t%u\n",
+             (unsigned) qop);
+  }
   ret += cmp_dauth_param ("cnonce", &h->cnonce, cnonce);
   ret += cmp_dauth_param ("nc", &h->nc, nc);
   if (h->userhash != ! (! userhash))
@@ -1035,102 +1055,286 @@ expect_digest_n (const char *hdr, size_t hdr_len,
 }
 
 
-#define expect_digest(h,no,a,rs,un,ux,rm,ur,q,c,nc,uh) \
+#define expect_digest(h,no,a,rs,un,ux,rm,ur,qr,qe,c,nc,uh) \
     expect_digest_n(h,MHD_STATICSTR_LEN_(h),\
-                    no,a,rs,un,ux,rm,ur,q,c,nc,uh,__LINE__)
+                    no,a,rs,un,ux,rm,ur,qr,qe,c,nc,uh,__LINE__)
 
 static unsigned int
 check_digest (void)
 {
   unsigned int r = 0; /**< The number of errors */
 
-  r += expect_digest ("Digest", NULL, NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, 0);
-  r += expect_digest ("Digest nc=1", NULL, NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, "1", 0);
-  r += expect_digest ("Digest nc=\"1\"", NULL, NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, "1", 0);
-  r += expect_digest ("Digest nc=\"1\"   ", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, "1", 0);
-  r += expect_digest ("Digest ,nc=\"1\"   ", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, "1", 0);
-  r += expect_digest ("Digest nc=\"1\",   ", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, "1", 0);
-  r += expect_digest ("Digest nc=\"1\" ,   ", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, "1", 0);
-  r += expect_digest ("Digest nc=1,   ", NULL, NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, "1", 0);
-  r += expect_digest ("Digest nc=1 ,   ", NULL, NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, "1", 0);
-  r += expect_digest ("Digest ,,,nc=1,   ", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, "1", 0);
-  r += expect_digest ("Digest ,,,nc=1 ,   ", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, "1", 0);
-  r += expect_digest ("Digest ,,,nc=\"1 \",   ", NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, NULL, "1 ", 0);
-  r += expect_digest ("Digest nc=\"1 \"", NULL, NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, "1 ", 0);
-  r += expect_digest ("Digest nc=\"1 \" ,", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, "1 ", 0);
-  r += expect_digest ("Digest nc=\"1 \", ", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, "1 ", 0);
-  r += expect_digest ("Digest nc=\"1;\", ", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, "1;", 0);
-  r += expect_digest ("Digest nc=\"1\\;\", ", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, "1\\;", 0);
-
-  r += expect_digest ("Digest userhash=false", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, NULL, 0);
-  r += expect_digest ("Digest userhash=\"false\"", NULL, NULL, NULL, NULL, 
NULL, \
-                      NULL, NULL, NULL, NULL, NULL, 0);
-  r += expect_digest ("Digest userhash=foo", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, NULL, 0);
-  r += expect_digest ("Digest userhash=true", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, NULL, 1);
-  r += expect_digest ("Digest userhash=\"true\"", NULL, NULL, NULL, NULL, 
NULL, \
-                      NULL, NULL, NULL, NULL, NULL, 1);
-  r += expect_digest ("Digest userhash=\"\\t\\r\\u\\e\"", NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1);
-  r += expect_digest ("Digest userhash=TRUE", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, NULL, 1);
-  r += expect_digest ("Digest userhash=True", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, NULL, 1);
-  r += expect_digest ("Digest userhash = true", NULL, NULL, NULL, NULL, \
-                      NULL,  NULL, NULL, NULL, NULL, NULL, 1);
-  r += expect_digest ("Digest userhash=True2", NULL, NULL, NULL, NULL, NULL, \
-                      NULL, NULL, NULL, NULL, NULL, 0);
-  r += expect_digest ("Digest userhash=\" true\"", NULL, NULL, NULL, NULL, \
-                      NULL,  NULL, NULL, NULL, NULL, NULL, 0);
+  r += expect_digest ("Digest", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest nc=1", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, NULL, \
+                      MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0);
+  r += expect_digest ("Digest nc=\"1\"", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0);
+  r += expect_digest ("Digest nc=\"1\"   ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0);
+  r += expect_digest ("Digest ,nc=\"1\"   ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0);
+  r += expect_digest ("Digest nc=\"1\",   ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0);
+  r += expect_digest ("Digest nc=\"1\" ,   ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, 
\
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0);
+  r += expect_digest ("Digest nc=1,   ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0);
+  r += expect_digest ("Digest nc=1 ,   ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0);
+  r += expect_digest ("Digest ,,,nc=1,   ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0);
+  r += expect_digest ("Digest ,,,nc=1 ,   ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0);
+  r += expect_digest ("Digest ,,,nc=\"1 \",   ", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1 ", 0);
+  r += expect_digest ("Digest nc=\"1 \"", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1 ", 0);
+  r += expect_digest ("Digest nc=\"1 \" ,", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1 ", 0);
+  r += expect_digest ("Digest nc=\"1 \", ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1 ", 0);
+  r += expect_digest ("Digest nc=\"1;\", ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1;", 0);
+  r += expect_digest ("Digest nc=\"1\\;\", ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, 
\
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1\\;", 0);
+
+  r += expect_digest ("Digest userhash=false", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest userhash=\"false\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest userhash=foo", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest userhash=true", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 1);
+  r += expect_digest ("Digest userhash=\"true\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 1);
+  r += expect_digest ("Digest userhash=\"\\t\\r\\u\\e\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 1);
+  r += expect_digest ("Digest userhash=TRUE", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 1);
+  r += expect_digest ("Digest userhash=True", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 1);
+  r += expect_digest ("Digest userhash = true", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL,  NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 1);
+  r += expect_digest ("Digest userhash=True2", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest userhash=\" true\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL,  NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+
+  r += expect_digest ("Digest algorithm=MD5", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=md5", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=Md5", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=mD5", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=\"MD5\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=\"\\M\\D\\5\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=\"\\m\\d\\5\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=SHA-256", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=sha-256", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=Sha-256", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=\"SHA-256\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=\"SHA\\-25\\6\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=\"shA-256\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=MD5-sess", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5_SESSION, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=MD5-SESS", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5_SESSION, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=md5-Sess", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5_SESSION, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=SHA-256-seSS", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256_SESSION, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=SHA-512-256", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_SHA512_256, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=SHA-512-256-sess", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_SHA512_256_SESSION, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=MD5-2", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_INVALID, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=MD5-sess2", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_INVALID, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=SHA-256-512", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_INVALID, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+  r += expect_digest ("Digest algorithm=", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_INVALID, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0);
+
+  r += expect_digest ("Digest qop=auth", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, NULL, NULL, 0);
+  r += expect_digest ("Digest qop=\"auth\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, NULL, NULL, 0);
+  r += expect_digest ("Digest qop=Auth", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      "Auth", MHD_DIGEST_AUTH_QOP_AUTH, NULL, NULL, 0);
+  r += expect_digest ("Digest qop=AUTH", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      "AUTH", MHD_DIGEST_AUTH_QOP_AUTH, NULL, NULL, 0);
+  r += expect_digest ("Digest qop=\"\\A\\ut\\H\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      "\\A\\ut\\H", MHD_DIGEST_AUTH_QOP_AUTH, NULL, NULL, 0);
+  r += expect_digest ("Digest qop=\"auth \"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      "auth ", MHD_DIGEST_AUTH_QOP_INVALID, NULL, NULL, 0);
+  r += expect_digest ("Digest qop=auth-int", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      "auth-int", MHD_DIGEST_AUTH_QOP_AUTH_INT, NULL, NULL, 0);
+  r += expect_digest ("Digest qop=\"auth-int\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      "auth-int", MHD_DIGEST_AUTH_QOP_AUTH_INT, NULL, NULL, 0);
+  r += expect_digest ("Digest qop=\"auTh-iNt\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      "auTh-iNt", MHD_DIGEST_AUTH_QOP_AUTH_INT, NULL, NULL, 0);
+  r += expect_digest ("Digest qop=\"auTh-iNt2\"", NULL, \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
+                      NULL, NULL, NULL, NULL, NULL, \
+                      "auTh-iNt2", MHD_DIGEST_AUTH_QOP_INVALID, NULL, NULL, 0);
 
   r += expect_digest ("Digest username=\"test@example.com\", " \
-                      "realm=\"users@example.com\", 
nonce=\"32141232413abcde\", " \
-                      "uri=\"/example\", qop=auth, nc=00000001, 
cnonce=\"0a4f113b\", " \
+                      "realm=\"users@example.com\", " \
+                      "nonce=\"32141232413abcde\", " \
+                      "uri=\"/example\", qop=auth, nc=00000001, " \
+                      "cnonce=\"0a4f113b\", " \
                       "response=\"6629fae49393a05397450978507c4ef1\", " \
-                      "opaque=\"sadfljk32sdaf\"", "32141232413abcde", NULL, \
+                      "opaque=\"sadfljk32sdaf\"", "32141232413abcde", \
+                      MHD_DIGEST_AUTH_ALGO3_MD5, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
-                      NULL, "users@example.com", "/example", "auth", \
+                      NULL, "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, \
                       "0a4f113b", "00000001", 0);
   r += expect_digest ("Digest username=\"test@example.com\", " \
                       "realm=\"users@example.com\", algorithm=SHA-256, " \
                       "nonce=\"32141232413abcde\", " \
                       "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \
-                      "uri=\"/example\", qop=auth, nc=00000001, 
cnonce=\"0a4f113b\", " \
+                      "uri=\"/example\", qop=auth, nc=00000001, " \
+                      "cnonce=\"0a4f113b\", " \
                       "response=\"6629fae49393a05397450978507c4ef1\", " \
-                      "opaque=\"sadfljk32sdaf\"", "32141232413abcde", 
"SHA-256", \
+                      "opaque=\"sadfljk32sdaf\"", "32141232413abcde", \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
   r += expect_digest ("Digest username=test@example.com, " \
-                      "realm=users@example.com, algorithm=\"SHA-256\", " \
+                      "realm=users@example.com, algorithm=\"SHA-256-sess\", " \
                       "nonce=32141232413abcde, " \
                       "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \
-                      "uri=/example, qop=\"auth\", nc=\"00000001\", 
cnonce=0a4f113b, " \
+                      "uri=/example, qop=\"auth\", nc=\"00000001\", " \
+                      "cnonce=0a4f113b, " \
                       "response=6629fae49393a05397450978507c4ef1, " \
-                      "opaque=sadfljk32sdaf", "32141232413abcde", "SHA-256", \
+                      "opaque=sadfljk32sdaf", "32141232413abcde", \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256_SESSION, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
   r += expect_digest ("Digest username = \"test@example.com\", " \
                       "realm\t=\t\"users@example.com\", algorithm\t= SHA-256, 
" \
@@ -1140,21 +1344,25 @@ check_digest (void)
                       "cnonce\t\t\t=   \"0a4f113b\", " \
                       "response  =\"6629fae49393a05397450978507c4ef1\", " \
                       "opaque=\t\t\"sadfljk32sdaf\"", "32141232413abcde", \
-                      "SHA-256", \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
   r += expect_digest ("Digest username=\"test@example.com\"," \
-                      "realm=\"users@example.com\",algorithm=SHA-256," \
+                      "realm=\"users@example.com\",algorithm=SHA-512-256," \
                       "nonce=\"32141232413abcde\"," \
                       "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates," \
-                      
"uri=\"/example\",qop=auth,nc=00000001,cnonce=\"0a4f113b\"," \
+                      "uri=\"/example\",qop=auth,nc=00000001," \
+                      "cnonce=\"0a4f113b\"," \
                       "response=\"6629fae49393a05397450978507c4ef1\"," \
-                      "opaque=\"sadfljk32sdaf\"", "32141232413abcde", 
"SHA-256", \
+                      "opaque=\"sadfljk32sdaf\"", "32141232413abcde", \
+                      MHD_DIGEST_AUTH_ALGO3_SHA512_256, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
   r += expect_digest ("Digest username=\"test@example.com\"," \
                       "realm=\"users@example.com\",algorithm=SHA-256," \
@@ -1162,107 +1370,128 @@ check_digest (void)
                       "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates," \
                       
"uri=\"/example\",qop=auth,nc=00000001,cnonce=\"0a4f113b\"," \
                       "response=\"6629fae49393a05397450978507c4ef1\"," \
-                      "opaque=\"sadfljk32sdaf\"", "32141232413abcde", 
"SHA-256", \
+                      "opaque=\"sadfljk32sdaf\"", "32141232413abcde", \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
   r += expect_digest ("Digest abc=zyx, username=\"test@example.com\", " \
                       "realm=\"users@example.com\", algorithm=SHA-256, " \
                       "nonce=\"32141232413abcde\", " \
                       "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \
-                      "uri=\"/example\", qop=auth, nc=00000001, 
cnonce=\"0a4f113b\", " \
+                      "uri=\"/example\", qop=auth, nc=00000001, " \
+                      "cnonce=\"0a4f113b\", " \
                       "response=\"6629fae49393a05397450978507c4ef1\", " \
-                      "opaque=\"sadfljk32sdaf\"", "32141232413abcde", 
"SHA-256", \
+                      "opaque=\"sadfljk32sdaf\"", "32141232413abcde", \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
   r += expect_digest ("Digest abc=zyx,,,,,,,username=\"test@example.com\", " \
                       "realm=\"users@example.com\", algorithm=SHA-256, " \
                       "nonce=\"32141232413abcde\", " \
                       "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \
-                      "uri=\"/example\", qop=auth, nc=00000001, 
cnonce=\"0a4f113b\", " \
+                      "uri=\"/example\", qop=auth, nc=00000001, " \
+                      "cnonce=\"0a4f113b\", " \
                       "response=\"6629fae49393a05397450978507c4ef1\", " \
-                      "opaque=\"sadfljk32sdaf\"", "32141232413abcde", 
"SHA-256", \
+                      "opaque=\"sadfljk32sdaf\"", "32141232413abcde",
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
   r += expect_digest ("Digest abc=zyx,,,,,,,username=\"test@example.com\", " \
                       "realm=\"users@example.com\", algorithm=SHA-256, " \
                       "nonce=\"32141232413abcde\", " \
                       "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \
-                      "uri=\"/example\", qop=auth, nc=00000001, 
cnonce=\"0a4f113b\", " \
+                      "uri=\"/example\", qop=auth, nc=00000001, "
+                      "cnonce=\"0a4f113b\", " \
                       "response=\"6629fae49393a05397450978507c4ef1\", " \
                       "opaque=\"sadfljk32sdaf\",,,,,", "32141232413abcde", \
-                      "SHA-256", \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
   r += expect_digest ("Digest abc=zyx,,,,,,,username=\"test@example.com\", " \
                       "realm=\"users@example.com\", algorithm=SHA-256, " \
                       "nonce=\"32141232413abcde\", " \
                       "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \
-                      "uri=\"/example\", qop=auth, nc=00000001, 
cnonce=\"0a4f113b\", " \
+                      "uri=\"/example\", qop=auth, nc=00000001, " \
+                      "cnonce=\"0a4f113b\", " \
                       "response=\"6629fae49393a05397450978507c4ef1\", " \
                       "opaque=\"sadfljk32sdaf\",foo=bar", "32141232413abcde", \
-                      "SHA-256", \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
   r += expect_digest ("Digest abc=\"zyx\", username=\"test@example.com\", " \
                       "realm=\"users@example.com\", algorithm=SHA-256, " \
                       "nonce=\"32141232413abcde\", " \
                       "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \
-                      "uri=\"/example\", qop=auth, nc=00000001, 
cnonce=\"0a4f113b\", " \
+                      "uri=\"/example\", qop=auth, nc=00000001, "
+                      "cnonce=\"0a4f113b\", " \
                       "response=\"6629fae49393a05397450978507c4ef1\", " \
                       "opaque=\"sadfljk32sdaf\",foo=bar", "32141232413abcde", \
-                      "SHA-256", \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
   r += expect_digest ("Digest abc=\"zyx, abc\", " \
                       "username=\"test@example.com\", " \
                       "realm=\"users@example.com\", algorithm=SHA-256, " \
                       "nonce=\"32141232413abcde\", " \
                       "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \
-                      "uri=\"/example\", qop=auth, nc=00000001, 
cnonce=\"0a4f113b\", " \
+                      "uri=\"/example\", qop=auth, nc=00000001, "
+                      "cnonce=\"0a4f113b\", " \
                       "response=\"6629fae49393a05397450978507c4ef1\", " \
                       "opaque=\"sadfljk32sdaf\",foo=bar", "32141232413abcde", \
-                      "SHA-256", \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
   r += expect_digest ("Digest abc=\"zyx, abc=cde\", " \
                       "username=\"test@example.com\", " \
                       "realm=\"users@example.com\", algorithm=SHA-256, " \
                       "nonce=\"32141232413abcde\", " \
                       "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \
-                      "uri=\"/example\", qop=auth, nc=00000001, 
cnonce=\"0a4f113b\", " \
+                      "uri=\"/example\", qop=auth, nc=00000001, " \
+                      "cnonce=\"0a4f113b\", " \
                       "response=\"6629fae49393a05397450978507c4ef1\", " \
                       "opaque=\"sadfljk32sdaf\",foo=bar", "32141232413abcde", \
-                      "SHA-256", \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
   r += expect_digest ("Digest abc=\"zyx, abc=cde\", " \
                       "username=\"test@example.com\", " \
                       "realm=\"users@example.com\", algorithm=SHA-256, " \
                       "nonce=\"32141232413abcde\", " \
                       "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \
-                      "uri=\"/example\", qop=auth, nc=00000001, 
cnonce=\"0a4f113b\", " \
+                      "uri=\"/example\", qop=auth, nc=00000001, " \
+                      "cnonce=\"0a4f113b\", " \
                       "response=\"6629fae49393a05397450978507c4ef1\", " \
                       "opaque=\"sadfljk32sdaf\", foo=\"bar1, bar2\"", \
-                      "32141232413abcde", "SHA-256", \
+                      "32141232413abcde", \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
   r += expect_digest ("Digest abc=\"zyx, \\\\\"abc=cde\\\\\"\", " \
                       "username=\"test@example.com\", " \
@@ -1272,23 +1501,28 @@ check_digest (void)
                       "uri=\"/example\", qop=auth, nc=00000001, 
cnonce=\"0a4f113b\", " \
                       "response=\"6629fae49393a05397450978507c4ef1\", " \
                       "opaque=\"sadfljk32sdaf\", foo=\"bar1, bar2\"", \
-                      "32141232413abcde", "SHA-256", \
+                      "32141232413abcde",
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
   r += expect_digest ("Digest abc=\"zyx, \\\\\"abc=cde\\\\\"\", " \
                       "username=\"test@example.com\", " \
                       "realm=\"users@example.com\", algorithm=SHA-256, " \
                       "nonce=\"32141232413abcde\", " \
                       "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \
-                      "uri=\"/example\", qop=auth, nc=00000001, 
cnonce=\"0a4f113b\", " \
+                      "uri=\"/example\", qop=auth, nc=00000001, "
+                      "cnonce=\"0a4f113b\", " \
                       "response=\"6629fae49393a05397450978507c4ef1\", " \
                       "opaque=\"sadfljk32sdaf\", foo=\",nc=02\"",
-                      "32141232413abcde", "SHA-256", \
+                      "32141232413abcde", \
+                      MHD_DIGEST_AUTH_ALGO3_SHA256, \
                       "6629fae49393a05397450978507c4ef1", "test@example.com", \
                       "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \
-                      "users@example.com", "/example", "auth", "0a4f113b", \
+                      "users@example.com", "/example", \
+                      "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \
                       "00000001", 0);
 
   return r;
diff --git a/src/testcurl/test_digestauth2.c b/src/testcurl/test_digestauth2.c
index 800d57b2..e3c12d85 100644
--- a/src/testcurl/test_digestauth2.c
+++ b/src/testcurl/test_digestauth2.c
@@ -548,12 +548,12 @@ ahc_echo (void *cls,
         else if (NULL != dinfo->userhash_bin)
           mhdErrorExitDesc ("'userhash_bin' is NOT NULL");
       }
-      if (algo3 != dinfo->algo)
+      if (algo3 != dinfo->algo3)
       {
         fprintf (stderr, "Unexpected 'algo'.\n"
                  "Expected: %d\tRecieved: %d. ",
                  (int) algo3,
-                 (int) dinfo->algo);
+                 (int) dinfo->algo3);
         mhdErrorExitDesc ("Wrong 'algo'");
       }
       if (! test_rfc2069)
diff --git a/src/testcurl/test_digestauth_emu_ext.c 
b/src/testcurl/test_digestauth_emu_ext.c
index 468279ca..fc4f4aaa 100644
--- a/src/testcurl/test_digestauth_emu_ext.c
+++ b/src/testcurl/test_digestauth_emu_ext.c
@@ -417,12 +417,12 @@ ahc_echo (void *cls,
     }
     else if (NULL != dinfo->userhash_bin)
       mhdErrorExitDesc ("'userhash_bin' is NOT NULL");
-    else if (MHD_DIGEST_AUTH_ALGO3_MD5 != dinfo->algo)
+    else if (MHD_DIGEST_AUTH_ALGO3_MD5 != dinfo->algo3)
     {
       fprintf (stderr, "Unexpected 'algo'.\n"
                "Expected: %d\tRecieved: %d. ",
                (int) MHD_DIGEST_AUTH_ALGO3_MD5,
-               (int) dinfo->algo);
+               (int) dinfo->algo3);
       mhdErrorExitDesc ("Wrong 'algo'");
     }
     else if (MHD_STATICSTR_LEN_ (CNONCE_EMU) != dinfo->cnonce_len)
diff --git a/w32/common/libmicrohttpd-files.vcxproj 
b/w32/common/libmicrohttpd-files.vcxproj
index 982227c0..1818f0df 100644
--- a/w32/common/libmicrohttpd-files.vcxproj
+++ b/w32/common/libmicrohttpd-files.vcxproj
@@ -52,6 +52,7 @@
     <ClInclude Include="$(MhdSrc)microhttpd\tsearch.h" />
     <ClInclude Include="$(MhdSrc)microhttpd\sysfdsetsize.h" />
     <ClInclude Include="$(MhdSrc)microhttpd\mhd_str.h" />
+    <ClInclude Include="$(MhdSrc)microhttpd\mhd_str_types.h" />
     <ClInclude Include="$(MhdSrc)microhttpd\mhd_threads.h" />
     <ClInclude Include="$(MhdSrc)microhttpd\mhd_locks.h" />
     <ClInclude Include="$(MhdSrc)microhttpd\mhd_send.h" />
diff --git a/w32/common/libmicrohttpd-filters.vcxproj 
b/w32/common/libmicrohttpd-filters.vcxproj
index 7bc1fe3c..76c0c56e 100644
--- a/w32/common/libmicrohttpd-filters.vcxproj
+++ b/w32/common/libmicrohttpd-filters.vcxproj
@@ -100,6 +100,9 @@
     <ClInclude Include="$(MhdSrc)microhttpd\mhd_str.h">
       <Filter>Internal Headers</Filter>
     </ClInclude>
+    <ClInclude Include="$(MhdSrc)microhttpd\mhd_str_types.h">
+      <Filter>Internal Headers</Filter>
+    </ClInclude>
     <ClInclude Include="$(MhdSrc)microhttpd\mhd_threads.h">
       <Filter>Internal Headers</Filter>
     </ClInclude>

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]