summaryrefslogtreecommitdiff
path: root/libavformat/http.c
diff options
context:
space:
mode:
authorPetr Doubek <doubek@vision.ee.ethz.ch>2004-08-12 00:09:32 +0000
committerMichael Niedermayer <michaelni@gmx.at>2004-08-12 00:09:32 +0000
commit6ba5cbc699e77cae66bb719354fa142114b64eab (patch)
tree4d0862ca409f9db2ad6f121e66fc40275557dfa4 /libavformat/http.c
parent1477ec35dd958bf2c1ec7b4221a3d571c5b61449 (diff)
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.c61
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;
+}
+