Mercurial > libavformat.hg
diff http.c @ 511:056991ab9f10 libavformat
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>)
| author | michael |
|---|---|
| date | Thu, 12 Aug 2004 00:09:32 +0000 |
| parents | 0fdc96c2f2fe |
| children | 0b52743104ac |
line wrap: on
line diff
--- a/http.c Wed Aug 04 20:57:35 2004 +0000 +++ b/http.c Thu Aug 12 00:09:32 2004 +0000 @@ -46,8 +46,10 @@ 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 @@ { 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 @@ /* 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 @@ } 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 @@ 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 @@ 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 @@ "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 @@ 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; +} +
