From 8ffe2c9afe82366c08d4bb21849dec17eccdf949 Mon Sep 17 00:00:00 2001 From: cboesch Date: Thu, 18 Nov 2010 20:20:39 +0000 Subject: stream/http: Add Proxy-Authorization header to authenticate on proxies git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@32634 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/http.c | 20 ++++++++++++++++---- stream/http.h | 1 + stream/network.c | 2 ++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/stream/http.c b/stream/http.c index e6b0909996..91b05c6d1c 100644 --- a/stream/http.c +++ b/stream/http.c @@ -604,10 +604,11 @@ http_set_uri( HTTP_header_t *http_hdr, const char *uri ) { strcpy( http_hdr->uri, uri ); } -int -http_add_basic_authentication( HTTP_header_t *http_hdr, const char *username, const char *password ) { +static int +http_add_authentication( HTTP_header_t *http_hdr, const char *username, const char *password, const char *auth_str ) { char *auth = NULL, *usr_pass = NULL, *b64_usr_pass = NULL; int encoded_len, pass_len=0, out_len; + size_t auth_len; int res = -1; if( http_hdr==NULL || username==NULL ) return -1; @@ -639,13 +640,14 @@ http_add_basic_authentication( HTTP_header_t *http_hdr, const char *username, co b64_usr_pass[out_len]='\0'; - auth = malloc(encoded_len+22); + auth_len = encoded_len + 100; + auth = malloc(auth_len); if( auth==NULL ) { mp_msg(MSGT_NETWORK,MSGL_FATAL,"Memory allocation failed\n"); goto out; } - sprintf( auth, "Authorization: Basic %s", b64_usr_pass); + snprintf(auth, auth_len, "%s: Basic %s", auth_str, b64_usr_pass); http_set_field( http_hdr, auth ); res = 0; @@ -657,6 +659,16 @@ out: return res; } +int +http_add_basic_authentication( HTTP_header_t *http_hdr, const char *username, const char *password ) { + return http_add_authentication(http_hdr, username, password, "Authorization"); +} + +int +http_add_basic_proxy_authentication( HTTP_header_t *http_hdr, const char *username, const char *password ) { + return http_add_authentication(http_hdr, username, password, "Proxy-Authorization"); +} + void http_debug_hdr( HTTP_header_t *http_hdr ) { HTTP_field_t *field; diff --git a/stream/http.h b/stream/http.h index c52b9c8c79..d24ec45681 100644 --- a/stream/http.h +++ b/stream/http.h @@ -63,6 +63,7 @@ void http_set_field( HTTP_header_t *http_hdr, const char *field_name ); void http_set_method( HTTP_header_t *http_hdr, const char *method ); void http_set_uri( HTTP_header_t *http_hdr, const char *uri ); int http_add_basic_authentication( HTTP_header_t *http_hdr, const char *username, const char *password ); +int http_add_basic_proxy_authentication( HTTP_header_t *http_hdr, const char *username, const char *password ); void http_debug_hdr( HTTP_header_t *http_hdr ); diff --git a/stream/network.c b/stream/network.c index de03f7d839..184be96682 100644 --- a/stream/network.c +++ b/stream/network.c @@ -255,6 +255,8 @@ http_send_request( URL_t *url, off_t pos ) { if (network_cookies_enabled) cookies_set( http_hdr, server_url->hostname, server_url->url ); http_set_field( http_hdr, "Connection: close"); + if (proxy) + http_add_basic_proxy_authentication(http_hdr, url->username, url->password); http_add_basic_authentication(http_hdr, server_url->username, server_url->password); if( http_build_request( http_hdr )==NULL ) { goto err_out; -- cgit v1.2.3