diff options
author | Petr Doubek <doubek@vision.ee.ethz.ch> | 2004-08-12 00:09:32 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2004-08-12 00:09:32 +0000 |
commit | 6ba5cbc699e77cae66bb719354fa142114b64eab (patch) | |
tree | 4d0862ca409f9db2ad6f121e66fc40275557dfa4 /libavformat/http.c | |
parent | 1477ec35dd958bf2c1ec7b4221a3d571c5b61449 (diff) | |
download | ffmpeg-6ba5cbc699e77cae66bb719354fa142114b64eab.tar.gz |
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
tested and submitted by (Torsten Spindler <spindler at hbt dot arch dot ethz dot ch>)
Originally committed as revision 3381 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/http.c')
-rw-r--r-- | libavformat/http.c | 61 |
1 files changed, 55 insertions, 6 deletions
diff --git a/libavformat/http.c b/libavformat/http.c index 6800370549..d8ab4d3f44 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -46,8 +46,10 @@ typedef struct { char location[URL_SIZE]; } HTTPContext; -static int http_connect(URLContext *h, const char *path, const char *hoststr); +static int http_connect(URLContext *h, const char *path, const char *hoststr, + const char *auth); static int http_write(URLContext *h, uint8_t *buf, int size); +static char *b64_encode( unsigned char *src ); /* return non zero if error */ @@ -55,6 +57,7 @@ static int http_open(URLContext *h, const char *uri, int flags) { const char *path, *proxy_path; char hostname[1024], hoststr[1024]; + char auth[1024]; char path1[1024]; char buf[1024]; int port, use_proxy, err; @@ -76,7 +79,7 @@ static int http_open(URLContext *h, const char *uri, int flags) /* fill the dest addr */ redo: /* needed in any case to build the host string */ - url_split(NULL, 0, hostname, sizeof(hostname), &port, + url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port, path1, sizeof(path1), uri); if (port > 0) { snprintf(hoststr, sizeof(hoststr), "%s:%d", hostname, port); @@ -85,7 +88,7 @@ static int http_open(URLContext *h, const char *uri, int flags) } if (use_proxy) { - url_split(NULL, 0, hostname, sizeof(hostname), &port, + url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port, NULL, 0, proxy_path); path = uri; } else { @@ -103,7 +106,7 @@ static int http_open(URLContext *h, const char *uri, int flags) goto fail; s->hd = hd; - if (http_connect(h, path, hoststr) < 0) + if (http_connect(h, path, hoststr, auth) < 0) goto fail; if (s->http_code == 303 && s->location[0] != '\0') { /* url moved, get next */ @@ -172,7 +175,8 @@ static int process_line(HTTPContext *s, char *line, int line_count) return 1; } -static int http_connect(URLContext *h, const char *path, const char *hoststr) +static int http_connect(URLContext *h, const char *path, const char *hoststr, + const char *auth) { HTTPContext *s = h->priv_data; int post, err, ch; @@ -187,11 +191,13 @@ static int http_connect(URLContext *h, const char *path, const char *hoststr) "User-Agent: %s\r\n" "Accept: */*\r\n" "Host: %s\r\n" + "Authorization: Basic %s\r\n" "\r\n", post ? "POST" : "GET", path, LIBAVFORMAT_IDENT, - hoststr); + hoststr, + b64_encode(auth)); if (http_write(h, s->buffer, strlen(s->buffer)) < 0) return AVERROR_IO; @@ -277,3 +283,46 @@ URLProtocol http_protocol = { http_close, }; +/***************************************************************************** + * b64_encode: stolen from VLC's http.c + *****************************************************************************/ + +static char *b64_encode( unsigned char *src ) +{ + static const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + char *dst = av_malloc( strlen( src ) * 4 / 3 + 12 ); + char *ret = dst; + unsigned i_bits = 0; + unsigned i_shift = 0; + + for( ;; ) + { + if( *src ) + { + i_bits = ( i_bits << 8 )|( *src++ ); + i_shift += 8; + } + else if( i_shift > 0 ) + { + i_bits <<= 6 - i_shift; + i_shift = 6; + } + else + { + *dst++ = '='; + break; + } + + while( i_shift >= 6 ) + { + i_shift -= 6; + *dst++ = b64[(i_bits >> i_shift)&0x3f]; + } + } + + *dst++ = '\0'; + + return ret; +} + |