http proxy mostly working, need to implement http authentication
git-svn-id: https://svn.musicpd.org/mpd/trunk@1588 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
parent
6eb6c454be
commit
ba798c5e65
@ -49,6 +49,8 @@ struct _InputStream {
|
||||
char * metaTitle;
|
||||
};
|
||||
|
||||
void initInputStream();
|
||||
|
||||
int isUrlSaneForInputStream(char * url);
|
||||
|
||||
/* if an error occurs for these 3 functions, then -1 is returned and errno
|
||||
|
@ -60,6 +60,9 @@ typedef struct _InputStreemHTTPData {
|
||||
int icyMetaint;
|
||||
int prebuffer;
|
||||
int icyOffset;
|
||||
char * proxyHost;
|
||||
int proxyPort;
|
||||
char * proxyAuth;
|
||||
} InputStreamHTTPData;
|
||||
|
||||
void inputStream_initHttp() {
|
||||
@ -114,7 +117,21 @@ void inputStream_initHttp() {
|
||||
static InputStreamHTTPData * newInputStreamHTTPData() {
|
||||
InputStreamHTTPData * ret = malloc(sizeof(InputStreamHTTPData));
|
||||
|
||||
ret->host = NULL;
|
||||
if(getConf()[CONF_HTTP_PROXY_HOST]) {
|
||||
ret->proxyHost = getConf()[CONF_HTTP_PROXY_HOST];
|
||||
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;
|
||||
}
|
||||
else {
|
||||
ret->proxyHost = NULL;
|
||||
ret->proxyAuth = NULL;
|
||||
}
|
||||
|
||||
ret->host = NULL;
|
||||
ret->path = NULL;
|
||||
ret->port = 80;
|
||||
ret->connState = HTTP_CONN_STATE_CLOSED;
|
||||
@ -129,6 +146,7 @@ static InputStreamHTTPData * newInputStreamHTTPData() {
|
||||
static void freeInputStreamHTTPData(InputStreamHTTPData * data) {
|
||||
if(data->host) free(data->host);
|
||||
if(data->path) free(data->path);
|
||||
if(data->proxyAuth) free(data->proxyAuth);
|
||||
|
||||
free(data);
|
||||
}
|
||||
@ -170,7 +188,8 @@ static int parseUrl(InputStreamHTTPData * data, char * url) {
|
||||
}
|
||||
|
||||
/* fetch the path */
|
||||
data->path = strdup(slash ? slash : "/");
|
||||
if(data->proxyHost) data->path = strdup(url);
|
||||
else data->path = strdup(slash ? slash : "/");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -183,17 +202,29 @@ static int initHTTPConnection(InputStream * inStream) {
|
||||
InputStreamHTTPData * data = (InputStreamHTTPData *)inStream->data;
|
||||
int flags;
|
||||
int ret;
|
||||
char * connHost;
|
||||
int connPort;
|
||||
#ifdef HAVE_IPV6
|
||||
struct sockaddr_in6 sin6;
|
||||
#endif
|
||||
|
||||
if(!(he = gethostbyname(data->host))) {
|
||||
if(data->proxyHost) {
|
||||
connHost = data->proxyHost;
|
||||
connPort = data->proxyPort;
|
||||
}
|
||||
else {
|
||||
connHost = data->host;
|
||||
connPort = data->port;
|
||||
}
|
||||
|
||||
if(!(he = gethostbyname(connHost))) {
|
||||
DEBUG(__FILE__ ": failure to lookup host \"%s\"\n",connHost);
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(&sin,0,sizeof(struct sockaddr_in));
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_port = htons(data->port);
|
||||
sin.sin_port = htons(connPort);
|
||||
#ifdef HAVE_IPV6
|
||||
memset(&sin6,0,sizeof(struct sockaddr_in6));
|
||||
sin6.sin6_family = AF_INET6;
|
||||
@ -231,6 +262,7 @@ static int initHTTPConnection(InputStream * inStream) {
|
||||
|
||||
ret = connect(data->sock,dest,destlen);
|
||||
if(ret < 0 && errno!=EINPROGRESS) {
|
||||
DEBUG(__FILE__ ": unable to connect: %s\n", strerror(errno));
|
||||
close(data->sock);
|
||||
return -1;
|
||||
}
|
||||
@ -265,6 +297,7 @@ static int finishHTTPInit(InputStream * inStream) {
|
||||
if(ret == 0 || (ret < 0 && errno==EINTR)) return 0;
|
||||
|
||||
if(ret < 0) {
|
||||
DEBUG(__FILE__ ": problem select'ing: %s\n",strerror(errno));
|
||||
close(data->sock);
|
||||
data->connState = HTTP_CONN_STATE_CLOSED;
|
||||
return -1;
|
||||
@ -279,15 +312,15 @@ 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.1\r\n"
|
||||
snprintf(request, 2048, "GET %s HTTP/1.0\r\n"
|
||||
"Host: %s\r\n"
|
||||
"Connection: close\r\n"
|
||||
/*"Connection: close\r\n"*/
|
||||
"User-Agent: %s/%s\r\n"
|
||||
"Range: bytes=%ld-\r\n"
|
||||
/*"Range: bytes=%ld-\r\n"*/
|
||||
"Icy-Metadata:1\r\n"
|
||||
"\r\n",
|
||||
data->path, data->host, "httpTest", "0.0.0",
|
||||
inStream->offset);
|
||||
data->path, data->host, "httpTest", "0.0.0"/*,
|
||||
inStream->offset*/);
|
||||
|
||||
ret = write(data->sock, request, strlen(request));
|
||||
if(ret!=strlen(request)) {
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "permission.h"
|
||||
#include "replayGain.h"
|
||||
#include "inputPlugin.h"
|
||||
#include "inputStream.h"
|
||||
#include "../config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@ -420,9 +421,6 @@ int main(int argc, char * argv[]) {
|
||||
|
||||
establishListen(&options);
|
||||
|
||||
/*
|
||||
* lose privileges as early as possible
|
||||
*/
|
||||
changeToUser(&options);
|
||||
|
||||
openLogFiles(&options, &out, &err);
|
||||
@ -443,6 +441,7 @@ int main(int argc, char * argv[]) {
|
||||
initPlayerData();
|
||||
initVolume();
|
||||
initInterfaces();
|
||||
initInputStream();
|
||||
|
||||
daemonize(&options);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user