diff options
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/asf_streaming.c | 53 | ||||
-rw-r--r-- | libmpdemux/network.c | 51 |
2 files changed, 77 insertions, 27 deletions
diff --git a/libmpdemux/asf_streaming.c b/libmpdemux/asf_streaming.c index a7773bff18..b000bd1e4a 100644 --- a/libmpdemux/asf_streaming.c +++ b/libmpdemux/asf_streaming.c @@ -61,7 +61,10 @@ asf_streaming_start( stream_t *stream ) { 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 @@ asf_http_streaming_type(char *content_type, char *features) { 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 @@ asf_http_request(streaming_ctrl_t *streaming_ctrl) { 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 @@ asf_http_parse_response( HTTP_header_t *http_hdr ) { 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 @@ asf_http_streaming_start( stream_t *stream ) { 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 @@ asf_http_streaming_start( stream_t *stream ) { 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 ); diff --git a/libmpdemux/network.c b/libmpdemux/network.c index 5e24846b37..62dffee360 100644 --- a/libmpdemux/network.c +++ b/libmpdemux/network.c @@ -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 @@ connect2Server(char *host, int port) { 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 @@ http_send_request( URL_t *url ) { 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 @@ extension=NULL; } // 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 @@ extension=NULL; } *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 @@ streaming_start(stream_t *stream, int demuxer_type) { 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)); |