int network_pass_httpproxy (struct t_proxy *proxy, int sock, const char *address, int port) { char buffer[256], authbuf[128], authbuf_base64[512]; int length; if (CONFIG_STRING(proxy->options[PROXY_OPTION_USERNAME]) && CONFIG_STRING(proxy->options[PROXY_OPTION_USERNAME])[0]) { /* authentification */ snprintf (authbuf, sizeof (authbuf), "%s:%s", CONFIG_STRING(proxy->options[PROXY_OPTION_USERNAME]), (CONFIG_STRING(proxy->options[PROXY_OPTION_PASSWORD])) ? CONFIG_STRING(proxy->options[PROXY_OPTION_PASSWORD]) : ""); string_encode_base64 (authbuf, strlen (authbuf), authbuf_base64); length = snprintf (buffer, sizeof (buffer), "CONNECT %s:%d HTTP/1.0\r\nProxy-Authorization: " "Basic %s\r\n\r\n", address, port, authbuf_base64); } else { /* no authentification */ length = snprintf (buffer, sizeof (buffer), "CONNECT %s:%d HTTP/1.0\r\n\r\n", address, port); } if (network_send_with_retry (sock, buffer, length, 0) != length) return 0; /* success result must be like: "HTTP/1.0 200 OK" */ if (network_recv_with_retry (sock, buffer, sizeof (buffer), 0) < 12) return 0; if (memcmp (buffer, "HTTP/", 5) || memcmp (buffer + 9, "200", 3)) return 0; /* connection ok */ return 1; }
TEST(String, BaseN) { char str[1024]; const char *str_abc = "abc"; const char *str_abc_base64 = "YWJj"; const char *str_base64[][2] = { { "", "" }, { "A", "QQ==" }, { "B", "Qg==" }, { "C", "Qw==" }, { "D", "RA==" }, { "abc", "YWJj" }, { "This is a test.", "VGhpcyBpcyBhIHRlc3Qu" }, { "This is a test..", "VGhpcyBpcyBhIHRlc3QuLg==" }, { "This is a test...", "VGhpcyBpcyBhIHRlc3QuLi4=" }, { "This is a test....", "VGhpcyBpcyBhIHRlc3QuLi4u" }, { "This is a long long long sentence here...", "VGhpcyBpcyBhIGxvbmcgbG9uZyBsb25nIHNlbnRlbmNlIGhlcmUuLi4=" }, { "Another example for base64", "QW5vdGhlciBleGFtcGxlIGZvciBiYXNlNjQ=" }, { "Another example for base64.", "QW5vdGhlciBleGFtcGxlIGZvciBiYXNlNjQu" }, { "Another example for base64..", "QW5vdGhlciBleGFtcGxlIGZvciBiYXNlNjQuLg==" }, { "Another example for base64...", "QW5vdGhlciBleGFtcGxlIGZvciBiYXNlNjQuLi4=" }, { NULL, NULL } }; int i, length; /* string_encode_base16 */ string_encode_base16 (NULL, 0, NULL); string_encode_base16 (NULL, 0, str); string_encode_base16 ("", 0, NULL); str[0] = 0xAA; string_encode_base16 ("", -1, str); BYTES_EQUAL(0x0, str[0]); str[0] = 0xAA; string_encode_base16 ("", 0, str); BYTES_EQUAL(0x0, str[0]); string_encode_base16 ("abc", 3, str); STRCMP_EQUAL("616263", str); /* string_decode_base16 */ LONGS_EQUAL(0, string_decode_base16 (NULL, NULL)); LONGS_EQUAL(0, string_decode_base16 (NULL, str)); LONGS_EQUAL(0, string_decode_base16 ("", NULL)); LONGS_EQUAL(0, string_decode_base16 ("", str)); LONGS_EQUAL(3, string_decode_base16 ("616263", str)); STRCMP_EQUAL("abc", str); /* string_encode_base64 */ string_encode_base64 (NULL, 0, NULL); string_encode_base64 (NULL, 0, str); string_encode_base64 ("", 0, NULL); str[0] = 0xAA; string_encode_base64 ("", -1, str); BYTES_EQUAL(0x0, str[0]); str[0] = 0xAA; string_encode_base64 ("", 0, str); BYTES_EQUAL(0x0, str[0]); for (i = 0; str_base64[i][0]; i++) { string_encode_base64 (str_base64[i][0], strlen (str_base64[i][0]), str); STRCMP_EQUAL(str_base64[i][1], str); } /* string_decode_base64 */ LONGS_EQUAL(0, string_decode_base64 (NULL, NULL)); LONGS_EQUAL(0, string_decode_base64 (NULL, str)); LONGS_EQUAL(0, string_decode_base64 ("", NULL)); LONGS_EQUAL(0, string_decode_base64 ("", str)); for (i = 0; str_base64[i][0]; i++) { length = string_decode_base64 (str_base64[i][1], str); STRCMP_EQUAL(str_base64[i][0], str); LONGS_EQUAL(strlen (str_base64[i][0]), length); } }