* HTTP protocol for ffmpeg client
* Copyright (c) 2000, 2001 Fabrice Bellard.
*
- * This library is free software; you can redistribute it and/or
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
+ * version 2.1 of the License, or (at your option) any later version.
*
- * This library is distributed in the hope that it will be useful,
+ * FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "avformat.h"
#include <unistd.h>
#endif
#include <netdb.h>
+#include "base64.h"
/* XXX: POST protocol is not completly implemented because ffmpeg use
only a subset of it */
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(const unsigned char *src );
/* return non zero if error */
h->priv_data = s;
proxy_path = getenv("http_proxy");
- use_proxy = (proxy_path != NULL) && !getenv("no_proxy") &&
+ use_proxy = (proxy_path != NULL) && !getenv("no_proxy") &&
strstart(proxy_path, "http://", NULL);
/* fill the dest addr */
redo:
/* needed in any case to build the host string */
- url_split(NULL, 0, auth, sizeof(auth), 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);
}
if (use_proxy) {
- url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port,
+ url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port,
NULL, 0, proxy_path);
path = uri;
} else {
static int process_line(HTTPContext *s, char *line, int line_count)
{
char *tag, *p;
-
+
/* end of header */
if (line[0] == '\0')
return 0;
} else {
while (*p != '\0' && *p != ':')
p++;
- if (*p != ':')
+ if (*p != ':')
return 1;
-
+
*p = '\0';
tag = line;
p++;
HTTPContext *s = h->priv_data;
int post, err, ch;
char line[1024], *q;
+ char *auth_b64;
/* send http header */
post = h->flags & URL_WRONLY;
+ auth_b64 = av_base64_encode((uint8_t *)auth, strlen(auth));
snprintf(s->buffer, sizeof(s->buffer),
"%s %s HTTP/1.0\r\n"
"User-Agent: %s\r\n"
path,
LIBAVFORMAT_IDENT,
hoststr,
- b64_encode(auth));
-
+ auth_b64);
+
+ av_freep(&auth_b64);
if (http_write(h, s->buffer, strlen(s->buffer)) < 0)
return AVERROR_IO;
-
+
/* init input buffer */
s->buf_ptr = s->buffer;
s->buf_end = s->buffer;
sleep(1);
return 0;
}
-
+
/* wait for header */
q = line;
for(;;) {
NULL, /* seek */
http_close,
};
-
-/*****************************************************************************
- * b64_encode: stolen from VLC's http.c
- *****************************************************************************/
-
-static char *b64_encode( const unsigned char *src )
-{
- static const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- unsigned int len= strlen(src);
- char *ret, *dst;
- unsigned i_bits = 0;
- unsigned i_shift = 0;
-
- if(len < UINT_MAX/4){
- ret=dst= av_malloc( len * 4 / 3 + 12 );
- }else
- return NULL;
-
- 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;
-}
-