changeset 4121:a71d4ffc6c97

Added proxy support.
author bertrand
date Sat, 12 Jan 2002 21:08:12 +0000
parents a66048f5ae2e
children 3ee2a23f91c7
files libmpdemux/asf_streaming.c libmpdemux/network.c
diffstat 2 files changed, 77 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/asf_streaming.c	Sat Jan 12 21:07:17 2002 +0000
+++ b/libmpdemux/asf_streaming.c	Sat Jan 12 21:08:12 2002 +0000
@@ -61,7 +61,10 @@
 		if( fd!=-1 ) return fd;
 		printf("  ===> ASF/TCP failed\n");
 	}
-	if( !strncasecmp( proto_s, "http", 4) || !strncasecmp( proto_s, "mms", 3) ) {
+	if( 	!strncasecmp( proto_s, "http", 4) || 
+		!strncasecmp( proto_s, "mms", 3)  ||
+		!strncasecmp( proto_s, "proxy", 5)
+		) {
 		printf("Trying ASF/HTTP...\n");
 		fd = asf_http_streaming_start( stream );
 		if( fd!=-1 ) return fd;
@@ -373,8 +376,9 @@
 HTTP_header_t *
 asf_http_request(streaming_ctrl_t *streaming_ctrl) {
 	HTTP_header_t *http_hdr;
-	URL_t *url = streaming_ctrl->url;
-	asf_http_streaming_ctrl_t *asf_http_ctrl = (asf_http_streaming_ctrl_t*)streaming_ctrl->data;
+	URL_t *url = NULL;
+	URL_t *server_url = NULL;
+	asf_http_streaming_ctrl_t *asf_http_ctrl;
 	char str[250];
 	char *ptr;
 	int i,as = -1,vs = -1;
@@ -382,12 +386,33 @@
 	int offset_hi=0, offset_lo=0, length=0;
 	int asf_nb_stream=0;
 
+	// Sanity check
+	if( streaming_ctrl==NULL ) return NULL;
+	url = streaming_ctrl->url;
+	asf_http_ctrl = (asf_http_streaming_ctrl_t*)streaming_ctrl->data;
+	if( url==NULL || asf_http_ctrl==NULL ) return NULL;
+
 	// Common header for all requests.
 	http_hdr = http_new_header();
-	http_set_uri( http_hdr, url->file );
 	http_set_field( http_hdr, "Accept: */*" );
 	http_set_field( http_hdr, "User-Agent: NSPlayer/4.1.0.3856" );
-        sprintf( str, "Host: %s:%d", url->hostname, url->port );
+
+	// Check if we are using a proxy
+	if( !strcasecmp( url->protocol, "proxy" ) ) {
+		server_url = url_new( (url->file)+1 );
+		if( server_url==NULL ) {
+			printf("Invalid proxy URL\n");
+			http_free( http_hdr );
+			return NULL;
+		}
+		http_set_uri( http_hdr, server_url->url );
+		sprintf( str, "Host: %s:%d", server_url->hostname, server_url->port );
+		url_free( server_url );
+	} else {
+		http_set_uri( http_hdr, url->file );
+		sprintf( str, "Host: %s:%d", url->hostname, url->port );
+	}
+	
 	http_set_field( http_hdr, str );
 	http_set_field( http_hdr, "Pragma: xClientGUID={c77e7400-738a-11d2-9add-0020af0a3278}" );
 	sprintf(str, 
@@ -509,16 +534,6 @@
 	return asf_http_streaming_type( content_type, features );
 }
 
-URL_t *
-asf_http_ASX_redirect( HTTP_header_t *http_hdr ) {
-	URL_t *url_redirect=NULL;
-	printf("=========>> ASX parser not yet implemented <<==========\n");
-
-	printf("ASX=[%s]\n", http_hdr->body );
-
-	return url_redirect;
-}
-
 int
 asf_http_streaming_start( stream_t *stream ) {
 	HTTP_header_t *http_hdr=NULL;
@@ -546,7 +561,11 @@
 		done = 1;
 		if( fd>0 ) close( fd );
 
-		if( url->port==0 ) url->port = 80;
+		if( !strcasecmp( url->protocol, "proxy" ) ) {
+			if( url->port==0 ) url->port = 8080;
+		} else {
+			if( url->port==0 ) url->port = 80;
+		}
 		fd = connect2Server( url->hostname, url->port );
 		if( fd<0 ) return -1;
 
@@ -566,7 +585,7 @@
 		http_hdr = http_new_header();
 		do {
 			i = read( fd, buffer, BUFFER_SIZE );
-printf("read: %d\n", i );
+//printf("read: %d\n", i );
 			if( i<0 ) {
 				perror("read");
 				http_free( http_hdr );
--- a/libmpdemux/network.c	Sat Jan 12 21:07:17 2002 +0000
+++ b/libmpdemux/network.c	Sat Jan 12 21:08:12 2002 +0000
@@ -25,6 +25,8 @@
 #include "asf.h"
 #include "rtp.h"
 
+extern int verbose;
+
 static struct {
 	char *mime_type;
 	int demuxer_type;
@@ -174,11 +176,23 @@
 int
 http_send_request( URL_t *url ) {
 	HTTP_header_t *http_hdr;
+	URL_t *server_url;
 	char str[80];
 	int fd;
+	int ret;
+	int proxy = 0;		// Boolean
+
 	http_hdr = http_new_header();
-	http_set_uri( http_hdr, url->file );
-	snprintf(str, 80, "Host: %s", url->hostname );
+
+	if( !strcasecmp(url->protocol, "proxy") ) {
+		proxy = 1;
+		server_url = url_new( (url->file)+1 );
+		http_set_uri( http_hdr, server_url->url );
+	} else {
+		server_url = url;
+		http_set_uri( http_hdr, server_url->file );
+	}
+	snprintf(str, 80, "Host: %s", server_url->hostname );
 	http_set_field( http_hdr, str);
 	http_set_field( http_hdr, "User-Agent: MPlayer");
 	http_set_field( http_hdr, "Connection: closed");
@@ -186,12 +200,27 @@
 		return -1;
 	}
 
-	if( url->port==0 ) url->port = 80;
-	fd = connect2Server( url->hostname, url->port );
+	if( proxy ) {
+		if( url->port==0 ) url->port = 8080;			// Default port for the proxy server
+		fd = connect2Server( url->hostname, url->port );
+		url_free( server_url );
+	} else {
+		if( server_url->port==0 ) server_url->port = 80;	// Default port for the web server
+		fd = connect2Server( server_url->hostname, server_url->port );
+	}
 	if( fd<0 ) {
 		return -1; 
 	}
-	write( fd, http_hdr->buffer, http_hdr->buffer_size );
+	if( verbose ) {
+		printf("Request: [%s]\n", http_hdr->buffer );
+	}
+	
+	ret = write( fd, http_hdr->buffer, http_hdr->buffer_size );
+	if( ret!=http_hdr->buffer_size ) {
+		printf("Error while sending HTTP request: didn't sent all the request\n");
+		return -1;
+	}
+	
 	http_free( http_hdr );
 
 	return fd;
@@ -296,8 +325,8 @@
 		}
 
 		// HTTP based protocol
-		if( !strcasecmp(url->protocol, "http") ) {
-			if( url->port==0 ) url->port = 80;
+		if( !strcasecmp(url->protocol, "http") || !strcasecmp(url->protocol, "proxy") ) {
+			//if( url->port==0 ) url->port = 80;
 
 			fd = http_send_request( url );
 			if( fd<0 ) {
@@ -312,8 +341,10 @@
 			}
 
 			*fd_out=fd;
-			http_debug_hdr( http_hdr );
-
+			if( verbose ) {
+				http_debug_hdr( http_hdr );
+			}
+			
 			streaming_ctrl->data = (void*)http_hdr;
 			
 			// Check if the response is an ICY status_code reason_phrase
@@ -582,7 +613,7 @@
 	if( stream==NULL ) return -1;
 	
 	// For RTP streams, we usually don't know the stream type until we open it.
-	if( !strcmp( stream->streaming_ctrl->url->protocol, "rtp")) {
+	if( !strcasecmp( stream->streaming_ctrl->url->protocol, "rtp")) {
 		if(stream->fd >= 0) {
 			if(close(stream->fd) < 0)
 				printf("streaming_start : Closing socket %d failed %s\n",stream->fd,strerror(errno));