static void print_dav_dir_entry(struct de *de, void *data) { char href[PATH_MAX]; char href_encoded[PATH_MAX]; struct mg_connection *conn = (struct mg_connection *) data; mg_snprintf(href, sizeof(href), "%s%s", conn->request_info.uri, de->file_name); mg_url_encode(href, href_encoded, PATH_MAX-1); print_props(conn, href_encoded, &de->file); }
END_TEST START_TEST(test_mg_url_encode) { char buf[20]; int ret; memset(buf, 77, sizeof(buf)); ret = mg_url_encode("abc", buf, sizeof(buf)); ck_assert_int_eq(3, ret); ck_assert_str_eq("abc", buf); memset(buf, 77, sizeof(buf)); ret = mg_url_encode("a%b/c&d.e", buf, sizeof(buf)); ck_assert_int_eq(15, ret); ck_assert_str_eq("a%25b%2fc%26d.e", buf); memset(buf, 77, sizeof(buf)); ret = mg_url_encode("%%%", buf, 4); ck_assert_int_eq(-1, ret); ck_assert_str_eq("%25", buf); }
// encoded snprintf() int esnprintf(char *str, size_t slen, const char *fmt, ...) { va_list ap; va_start(ap, fmt); int rv = vsnprintf(str, slen, fmt, ap); va_end(ap); size_t slen2 = strlen(str) * ENCODE_EXPANSION_FACTOR; // c -> %xx char *str2 = (char *) kiwi_malloc("eprintf", slen2); mg_url_encode(str, str2, slen2-1); slen2 = strlen(str2); check(slen2 <= slen); strcpy(str, str2); kiwi_free("eprintf", str2); return slen2; }
END_TEST START_TEST(test_encode_decode) { char buf[128]; const char *alpha = "abcdefghijklmnopqrstuvwxyz"; const char *nonalpha = " !\"#$%&'()*+,-./0123456789:;<=>?@"; const char *nonalpha_url_enc1 = "%20%21%22%23$%25%26%27()%2a%2b,-.%2f0123456789%3a;%3c%3d%3e%3f%40"; const char *nonalpha_url_enc2 = "%20!%22%23%24%25%26'()*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40"; int ret; size_t len; #if defined(USE_WEBSOCKET) || defined(USE_LUA) const char *alpha_b64_enc = "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo="; const char *nonalpha_b64_enc = "ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9A"; memset(buf, 77, sizeof(buf)); base64_encode((unsigned char *)"a", 1, buf); ck_assert_str_eq(buf, "YQ=="); memset(buf, 77, sizeof(buf)); base64_encode((unsigned char *)"ab", 1, buf); ck_assert_str_eq(buf, "YQ=="); memset(buf, 77, sizeof(buf)); base64_encode((unsigned char *)"ab", 2, buf); ck_assert_str_eq(buf, "YWI="); memset(buf, 77, sizeof(buf)); base64_encode((unsigned char *)alpha, 3, buf); ck_assert_str_eq(buf, "YWJj"); memset(buf, 77, sizeof(buf)); base64_encode((unsigned char *)alpha, 4, buf); ck_assert_str_eq(buf, "YWJjZA=="); memset(buf, 77, sizeof(buf)); base64_encode((unsigned char *)alpha, 5, buf); ck_assert_str_eq(buf, "YWJjZGU="); memset(buf, 77, sizeof(buf)); base64_encode((unsigned char *)alpha, 6, buf); ck_assert_str_eq(buf, "YWJjZGVm"); memset(buf, 77, sizeof(buf)); base64_encode((unsigned char *)alpha, (int)strlen(alpha), buf); ck_assert_str_eq(buf, alpha_b64_enc); memset(buf, 77, sizeof(buf)); base64_encode((unsigned char *)nonalpha, (int)strlen(nonalpha), buf); ck_assert_str_eq(buf, nonalpha_b64_enc); #endif #if defined(USE_LUA) memset(buf, 77, sizeof(buf)); len = 9999; ret = base64_decode((unsigned char *)alpha_b64_enc, (int)strlen(alpha_b64_enc), buf, &len); ck_assert_int_eq(ret, -1); ck_assert_uint_eq((unsigned int)len, (unsigned int)strlen(alpha)); ck_assert_str_eq(buf, alpha); memset(buf, 77, sizeof(buf)); len = 9999; ret = base64_decode((unsigned char *)"AAA*AAA", 7, buf, &len); ck_assert_int_eq(ret, 3); #endif memset(buf, 77, sizeof(buf)); ret = mg_url_encode(alpha, buf, sizeof(buf)); ck_assert_int_eq(ret, (int)strlen(buf)); ck_assert_int_eq(ret, (int)strlen(alpha)); ck_assert_str_eq(buf, alpha); memset(buf, 77, sizeof(buf)); ret = mg_url_encode(nonalpha, buf, sizeof(buf)); ck_assert_int_eq(ret, (int)strlen(buf)); ck_assert_int_eq(ret, (int)strlen(nonalpha_url_enc1)); ck_assert_str_eq(buf, nonalpha_url_enc1); memset(buf, 77, sizeof(buf)); ret = mg_url_decode(alpha, (int)strlen(alpha), buf, sizeof(buf), 0); ck_assert_int_eq(ret, (int)strlen(buf)); ck_assert_int_eq(ret, (int)strlen(alpha)); ck_assert_str_eq(buf, alpha); memset(buf, 77, sizeof(buf)); ret = mg_url_decode( nonalpha_url_enc1, (int)strlen(nonalpha_url_enc1), buf, sizeof(buf), 0); ck_assert_int_eq(ret, (int)strlen(buf)); ck_assert_int_eq(ret, (int)strlen(nonalpha)); ck_assert_str_eq(buf, nonalpha); memset(buf, 77, sizeof(buf)); ret = mg_url_decode( nonalpha_url_enc2, (int)strlen(nonalpha_url_enc2), buf, sizeof(buf), 0); ck_assert_int_eq(ret, (int)strlen(buf)); ck_assert_int_eq(ret, (int)strlen(nonalpha)); ck_assert_str_eq(buf, nonalpha); /* len could be unused, if base64_decode is not tested because USE_LUA is * not defined */ (void)len; }