static const char *mg_strcasestr(const char *big_str, const char *small_str) { int i, big_len = strlen(big_str), small_len = strlen(small_str); for (i = 0; i <= big_len - small_len; i++) { if (mg_strncasecmp(big_str + i, small_str, small_len) == 0) { return big_str + i; } } return NULL; }
END_TEST START_TEST(test_mg_strncasecmp) { ck_assert(mg_strncasecmp("abc", "abc", 3) == 0); ck_assert(mg_strncasecmp("abc", "abcd", 3) == 0); ck_assert(mg_strncasecmp("abc", "abcd", 4) != 0); ck_assert(mg_strncasecmp("a", "A", 1) == 0); ck_assert(mg_strncasecmp("A", "B", 1) < 0); ck_assert(mg_strncasecmp("A", "b", 1) < 0); ck_assert(mg_strncasecmp("a", "B", 1) < 0); ck_assert(mg_strncasecmp("a", "b", 1) < 0); ck_assert(mg_strncasecmp("b", "A", 1) > 0); ck_assert(mg_strncasecmp("B", "A", 1) > 0); ck_assert(mg_strncasecmp("b", "a", 1) > 0); ck_assert(mg_strncasecmp("B", "a", 1) > 0); ck_assert(mg_strncasecmp("xAx", "xBx", 3) < 0); ck_assert(mg_strncasecmp("xAx", "xbx", 3) < 0); ck_assert(mg_strncasecmp("xax", "xBx", 3) < 0); ck_assert(mg_strncasecmp("xax", "xbx", 3) < 0); ck_assert(mg_strncasecmp("xbx", "xAx", 3) > 0); ck_assert(mg_strncasecmp("xBx", "xAx", 3) > 0); ck_assert(mg_strncasecmp("xbx", "xax", 3) > 0); ck_assert(mg_strncasecmp("xBx", "xax", 3) > 0); }
// Return 1 on success. Always initializes the ah structure. static int parse_auth_header(struct mg_connection *conn, char *buf, size_t buf_size, struct ah *ah) { char *name, *value, *s; const char *auth_header; (void) memset(ah, 0, sizeof(*ah)); if ((auth_header = mg_get_header(conn, "Authorization")) == NULL || mg_strncasecmp(auth_header, "Digest ", 7) != 0) { return 0; } // Make modifiable copy of the auth header (void) mg_strlcpy(buf, auth_header + 7, buf_size); s = buf; // Parse authorization header for (;;) { // Gobble initial spaces while (isspace(* (unsigned char *) s)) { s++; } name = skip_quoted(&s, "=", " ", 0); // Value is either quote-delimited, or ends at first comma or space. if (s[0] == '\"') { s++; value = skip_quoted(&s, "\"", " ", '\\'); if (s[0] == ',') { s++; } } else { value = skip_quoted(&s, ", ", " ", 0); // IE uses commas, FF uses spaces } if (*name == '\0') { break; } if (!strcmp(name, "username")) { ah->user = value; } else if (!strcmp(name, "cnonce")) { ah->cnonce = value; } else if (!strcmp(name, "response")) { ah->response = value; } else if (!strcmp(name, "uri")) { ah->uri = value; } else if (!strcmp(name, "qop")) { ah->qop = value; } else if (!strcmp(name, "nc")) { ah->nc = value; } else if (!strcmp(name, "nonce")) { ah->nonce = value; } } // CGI needs it as REMOTE_USER if (ah->user != NULL) { conn->request_info.remote_user = mg_strdup(ah->user); } else { return 0; } return 1; }