http proxy authentication, can someone test?

git-svn-id: https://svn.musicpd.org/mpd/trunk@1590 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
Warren Dukes 2004-06-20 21:16:02 +00:00
parent ba798c5e65
commit b7dcbb1bb3

View File

@ -114,6 +114,71 @@ void inputStream_initHttp() {
}
}
/* base64 code taken from xmms */
#define BASE64_LENGTH(len) (4 * (((len) + 2) / 3))
static char * base64Dup(char * s) {
int i;
int len = strlen(s);
char * ret = malloc(BASE64_LENGTH(len)+1);
char * p = ret;
char tbl[64] = {
'A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X',
'Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3',
'4','5','6','7','8','9','+','/'
};
/* Transform the 3x8 bits to 4x6 bits, as required by base64. */
for(i = 0; i < len; i += 3) {
*p++ = tbl[s[0] >> 2];
*p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
*p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
*p++ = tbl[s[2] & 0x3f];
s += 3;
}
/* Pad the result if necessary... */
if (i == len + 1)
*(p - 1) = '=';
else if (i == len + 2)
*(p - 1) = *(p - 2) = '=';
/* ...and zero-terminate it. */
*p = '\0';
return ret;
}
#define PROXY_AUTH_HEADER "Proxy-Authorization: Basic "
static char * proxyAuthString(char * user, char * password) {
char * ret = NULL;
int templen;
char * temp;
char * temp64;
if(!user || !password) return NULL;
templen = strlen(user) + strlen(password) + 2;
temp = calloc(templen, 1);
snprintf(temp, templen-1, "%s:%s", user, password);
temp64 = base64Dup(temp);
free(temp);
ret = malloc(strlen(temp64)+strlen(PROXY_AUTH_HEADER)+3);
strcpy(ret, PROXY_AUTH_HEADER);
strcat(ret, temp64);
strcat(ret, "\r\n");
free(temp64);
return ret;
}
static InputStreamHTTPData * newInputStreamHTTPData() {
InputStreamHTTPData * ret = malloc(sizeof(InputStreamHTTPData));
@ -122,9 +187,9 @@ static InputStreamHTTPData * newInputStreamHTTPData() {
DEBUG(__FILE__ ": Proxy host %s\n", ret->proxyHost);
ret->proxyPort = atoi(getConf()[CONF_HTTP_PROXY_PORT]);
DEBUG(__FILE__ ": Proxy port %i\n", ret->proxyPort);
ret->proxyAuth = /*proxyAuthString(
getConf()[CONF_HTTP_PROXY_USER],
getConf()[CONF_HTTP_PROXY_PASSWORD])*/ NULL;
ret->proxyAuth = proxyAuthString(
getConf()[CONF_HTTP_PROXY_USER],
getConf()[CONF_HTTP_PROXY_PASSWORD]);
}
else {
ret->proxyHost = NULL;
@ -313,14 +378,17 @@ static int finishHTTPInit(InputStream * inStream) {
memset(request, 0, 2049);
/* deal with ICY metadata later, for now its fucking up stuff! */
snprintf(request, 2048, "GET %s HTTP/1.0\r\n"
"Host: %s\r\n"
/*"Connection: close\r\n"*/
"User-Agent: %s/%s\r\n"
/*"Range: bytes=%ld-\r\n"*/
"Icy-Metadata:1\r\n"
"\r\n",
data->path, data->host, "httpTest", "0.0.0"/*,
inStream->offset*/);
"Host: %s\r\n"
/*"Connection: close\r\n"*/
"User-Agent: %s/%s\r\n"
/*"Range: bytes=%ld-\r\n"*/
"%s" /* authorization */
"Icy-Metadata:1\r\n"
"\r\n",
data->path, data->host, "httpTest", "0.0.0",
/*inStream->offset,*/
data->proxyAuth ? data->proxyAuth : "" );
ret = write(data->sock, request, strlen(request));
if(ret!=strlen(request)) {