annotate http.c @ 5241:da61aef912cb libavformat

Return an error when the parsed mpc chunk size is negative, otherwise we might end up in an endless loop where the same chunk is parsed over and over. Fixes a hang near the end for http://samples.mplayerhq.hu/A-codecs/musepack/sv8/sv8-tags.mpc
author reimar
date Wed, 30 Sep 2009 13:35:13 +0000
parents a5b8b8cce2dd
children f09594ca5f77
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
1 /*
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
2 * HTTP protocol for ffmpeg client
4251
77e0c7511d41 cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 3973
diff changeset
3 * Copyright (c) 2000, 2001 Fabrice Bellard
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
4 *
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
5 * This file is part of FFmpeg.
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
6 *
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
11 *
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
15 * Lesser General Public License for more details.
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
16 *
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
20 */
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3001
diff changeset
21
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3001
diff changeset
22 #include "libavutil/base64.h"
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3001
diff changeset
23 #include "libavutil/avstring.h"
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
24 #include "avformat.h"
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
25 #include <unistd.h>
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
26 #include <strings.h>
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
27 #include "network.h"
2774
477419a721a3 os_support.h is also needed for usleep and lseek on MinGW.
ramiro
parents: 2274
diff changeset
28 #include "os_support.h"
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
29
1986
cf1622476eb7 typos/grammar
diego
parents: 1934
diff changeset
30 /* XXX: POST protocol is not completely implemented because ffmpeg uses
cf1622476eb7 typos/grammar
diego
parents: 1934
diff changeset
31 only a subset of it. */
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
32
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
33 /* used for protocol handling */
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
34 #define BUFFER_SIZE 1024
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
35 #define URL_SIZE 4096
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
36 #define MAX_REDIRECTS 8
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
37
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
38 typedef struct {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
39 URLContext *hd;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
40 unsigned char buffer[BUFFER_SIZE], *buf_ptr, *buf_end;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
41 int line_count;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
42 int http_code;
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
43 int64_t chunksize; /**< Used if "Transfer-Encoding: chunked" otherwise -1. */
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3286
diff changeset
44 int64_t off, filesize;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
45 char location[URL_SIZE];
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
46 } HTTPContext;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
47
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
48 static int http_connect(URLContext *h, const char *path, const char *hoststr,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
49 const char *auth, int *new_location);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
50 static int http_write(URLContext *h, uint8_t *buf, int size);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
51
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
52
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
53 /* return non zero if error */
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
54 static int http_open_cnx(URLContext *h)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
55 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
56 const char *path, *proxy_path;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
57 char hostname[1024], hoststr[1024];
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
58 char auth[1024];
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
59 char path1[1024];
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
60 char buf[1024];
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
61 int port, use_proxy, err, location_changed = 0, redirects = 0;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
62 HTTPContext *s = h->priv_data;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
63 URLContext *hd = NULL;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
64
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
65 proxy_path = getenv("http_proxy");
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
66 use_proxy = (proxy_path != NULL) && !getenv("no_proxy") &&
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
67 av_strstart(proxy_path, "http://", NULL);
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
68
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
69 /* fill the dest addr */
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
70 redo:
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
71 /* needed in any case to build the host string */
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
72 url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
73 path1, sizeof(path1), s->location);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
74 if (port > 0) {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
75 snprintf(hoststr, sizeof(hoststr), "%s:%d", hostname, port);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
76 } else {
2189
da71207a7cf1 use new string functions
mru
parents: 2089
diff changeset
77 av_strlcpy(hoststr, hostname, sizeof(hoststr));
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
78 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
79
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
80 if (use_proxy) {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
81 url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
82 NULL, 0, proxy_path);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
83 path = s->location;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
84 } else {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
85 if (path1[0] == '\0')
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
86 path = "/";
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
87 else
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
88 path = path1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
89 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
90 if (port < 0)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
91 port = 80;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
92
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
93 snprintf(buf, sizeof(buf), "tcp://%s:%d", hostname, port);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
94 err = url_open(&hd, buf, URL_RDWR);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
95 if (err < 0)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
96 goto fail;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
97
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
98 s->hd = hd;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
99 if (http_connect(h, path, hoststr, auth, &location_changed) < 0)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
100 goto fail;
1852
467a411b5d26 make HTTP MOVED messages also work in ffmpeg (302 is essentially the same as 303).
gpoirier
parents: 1822
diff changeset
101 if ((s->http_code == 302 || s->http_code == 303) && location_changed == 1) {
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
102 /* url moved, get next */
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
103 url_close(hd);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
104 if (redirects++ >= MAX_REDIRECTS)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2193
diff changeset
105 return AVERROR(EIO);
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
106 location_changed = 0;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
107 goto redo;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
108 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
109 return 0;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
110 fail:
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
111 if (hd)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
112 url_close(hd);
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2193
diff changeset
113 return AVERROR(EIO);
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
114 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
115
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
116 static int http_open(URLContext *h, const char *uri, int flags)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
117 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
118 HTTPContext *s;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
119 int ret;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
120
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
121 h->is_streamed = 1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
122
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
123 s = av_malloc(sizeof(HTTPContext));
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
124 if (!s) {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
125 return AVERROR(ENOMEM);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
126 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
127 h->priv_data = s;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
128 s->filesize = -1;
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
129 s->chunksize = -1;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
130 s->off = 0;
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
131 av_strlcpy(s->location, uri, URL_SIZE);
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
132
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
133 ret = http_open_cnx(h);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
134 if (ret != 0)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
135 av_free (s);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
136 return ret;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
137 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
138 static int http_getc(HTTPContext *s)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
139 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
140 int len;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
141 if (s->buf_ptr >= s->buf_end) {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
142 len = url_read(s->hd, s->buffer, BUFFER_SIZE);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
143 if (len < 0) {
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2193
diff changeset
144 return AVERROR(EIO);
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
145 } else if (len == 0) {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
146 return -1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
147 } else {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
148 s->buf_ptr = s->buffer;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
149 s->buf_end = s->buffer + len;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
150 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
151 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
152 return *s->buf_ptr++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
153 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
154
5007
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
155 static int http_get_line(HTTPContext *s, char *line, int line_size)
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
156 {
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
157 int ch;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
158 char *q;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
159
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
160 q = line;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
161 for(;;) {
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
162 ch = http_getc(s);
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
163 if (ch < 0)
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
164 return AVERROR(EIO);
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
165 if (ch == '\n') {
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
166 /* process line */
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
167 if (q > line && q[-1] == '\r')
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
168 q--;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
169 *q = '\0';
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
170
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
171 return 0;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
172 } else {
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
173 if ((q - line) < line_size - 1)
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
174 *q++ = ch;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
175 }
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
176 }
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
177 }
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
178
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
179 static int process_line(URLContext *h, char *line, int line_count,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
180 int *new_location)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
181 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
182 HTTPContext *s = h->priv_data;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
183 char *tag, *p;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
184
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
185 /* end of header */
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
186 if (line[0] == '\0')
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
187 return 0;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
188
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
189 p = line;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
190 if (line_count == 0) {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
191 while (!isspace(*p) && *p != '\0')
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
192 p++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
193 while (isspace(*p))
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
194 p++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
195 s->http_code = strtol(p, NULL, 10);
5009
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
196
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
197 dprintf(NULL, "http_code=%d\n", s->http_code);
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
198
1881
a7abdfdb5ed7 handle http error codes
alex
parents: 1853
diff changeset
199 /* error codes are 4xx and 5xx */
a7abdfdb5ed7 handle http error codes
alex
parents: 1853
diff changeset
200 if (s->http_code >= 400 && s->http_code < 600)
a7abdfdb5ed7 handle http error codes
alex
parents: 1853
diff changeset
201 return -1;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
202 } else {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
203 while (*p != '\0' && *p != ':')
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
204 p++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
205 if (*p != ':')
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
206 return 1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
207
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
208 *p = '\0';
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
209 tag = line;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
210 p++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
211 while (isspace(*p))
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
212 p++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
213 if (!strcmp(tag, "Location")) {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
214 strcpy(s->location, p);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
215 *new_location = 1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
216 } else if (!strcmp (tag, "Content-Length") && s->filesize == -1) {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
217 s->filesize = atoll(p);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
218 } else if (!strcmp (tag, "Content-Range")) {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
219 /* "bytes $from-$to/$document_size" */
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
220 const char *slash;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
221 if (!strncmp (p, "bytes ", 6)) {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
222 p += 6;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
223 s->off = atoll(p);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
224 if ((slash = strchr(p, '/')) && strlen(slash) > 0)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
225 s->filesize = atoll(slash+1);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
226 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
227 h->is_streamed = 0; /* we _can_ in fact seek */
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
228 } else if (!strcmp (tag, "Transfer-Encoding") && !strncasecmp(p, "chunked", 7)) {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
229 s->filesize = -1;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
230 s->chunksize = 0;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
231 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
232 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
233 return 1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
234 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
235
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
236 static int http_connect(URLContext *h, const char *path, const char *hoststr,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
237 const char *auth, int *new_location)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
238 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
239 HTTPContext *s = h->priv_data;
5007
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
240 int post, err;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
241 char line[1024];
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
242 char *auth_b64;
4630
e04458242c54 Reduce allocated length of the HTTP authentication request field buffer, as
rbultje
parents: 4251
diff changeset
243 int auth_b64_len = (strlen(auth) + 2) / 3 * 4 + 1;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3286
diff changeset
244 int64_t off = s->off;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
245
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
246
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
247 /* send http header */
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
248 post = h->flags & URL_WRONLY;
1934
aab32293e595 expose av_base64_decode and av_base64_encode
lu_zero
parents: 1909
diff changeset
249 auth_b64 = av_malloc(auth_b64_len);
3001
78d61e1a8496 Remove a pointless cast.
reimar
parents: 2999
diff changeset
250 av_base64_encode(auth_b64, auth_b64_len, auth, strlen(auth));
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
251 snprintf(s->buffer, sizeof(s->buffer),
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
252 "%s %s HTTP/1.1\r\n"
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
253 "User-Agent: %s\r\n"
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
254 "Accept: */*\r\n"
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
255 "Range: bytes=%"PRId64"-\r\n"
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
256 "Host: %s\r\n"
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
257 "Authorization: Basic %s\r\n"
1853
c704f9d730bf Close connection on EOF
gpoirier
parents: 1852
diff changeset
258 "Connection: close\r\n"
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
259 "\r\n",
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
260 post ? "POST" : "GET",
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
261 path,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
262 LIBAVFORMAT_IDENT,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
263 s->off,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
264 hoststr,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
265 auth_b64);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
266
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
267 av_freep(&auth_b64);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
268 if (http_write(h, s->buffer, strlen(s->buffer)) < 0)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2193
diff changeset
269 return AVERROR(EIO);
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
270
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
271 /* init input buffer */
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
272 s->buf_ptr = s->buffer;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
273 s->buf_end = s->buffer;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
274 s->line_count = 0;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
275 s->off = 0;
1909
663139d56669 Properly initialize filesize during input buffer initialization.
diego
parents: 1881
diff changeset
276 s->filesize = -1;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
277 if (post) {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
278 return 0;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
279 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
280
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
281 /* wait for header */
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
282 for(;;) {
5007
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
283 if (http_get_line(s, line, sizeof(line)) < 0)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2193
diff changeset
284 return AVERROR(EIO);
5009
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
285
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
286 dprintf(NULL, "header='%s'\n", line);
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
287
5008
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
288 err = process_line(h, line, s->line_count, new_location);
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
289 if (err < 0)
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
290 return err;
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
291 if (err == 0)
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
292 break;
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
293 s->line_count++;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
294 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
295
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
296 return (off == s->off) ? 0 : -1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
297 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
298
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
299
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
300 static int http_read(URLContext *h, uint8_t *buf, int size)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
301 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
302 HTTPContext *s = h->priv_data;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
303 int len;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
304
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
305 if (s->chunksize >= 0) {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
306 if (!s->chunksize) {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
307 char line[32];
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
308
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
309 for(;;) {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
310 do {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
311 if (http_get_line(s, line, sizeof(line)) < 0)
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
312 return AVERROR(EIO);
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
313 } while (!*line); /* skip CR LF from last chunk */
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
314
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
315 s->chunksize = strtoll(line, NULL, 16);
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
316
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
317 dprintf(NULL, "Chunked encoding data size: %"PRId64"'\n", s->chunksize);
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
318
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
319 if (!s->chunksize)
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
320 return 0;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
321 break;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
322 }
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
323 }
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
324 size = FFMIN(size, s->chunksize);
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
325 }
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
326 /* read bytes from input buffer first */
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
327 len = s->buf_end - s->buf_ptr;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
328 if (len > 0) {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
329 if (len > size)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
330 len = size;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
331 memcpy(buf, s->buf_ptr, len);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
332 s->buf_ptr += len;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
333 } else {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
334 len = url_read(s->hd, buf, size);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
335 }
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
336 if (len > 0) {
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
337 s->off += len;
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
338 if (s->chunksize > 0)
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
339 s->chunksize -= len;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
340 }
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
341 return len;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
342 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
343
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
344 /* used only when posting data */
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
345 static int http_write(URLContext *h, uint8_t *buf, int size)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
346 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
347 HTTPContext *s = h->priv_data;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
348 return url_write(s->hd, buf, size);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
349 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
350
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
351 static int http_close(URLContext *h)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
352 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
353 HTTPContext *s = h->priv_data;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
354 url_close(s->hd);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
355 av_free(s);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
356 return 0;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
357 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
358
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3286
diff changeset
359 static int64_t http_seek(URLContext *h, int64_t off, int whence)
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
360 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
361 HTTPContext *s = h->priv_data;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
362 URLContext *old_hd = s->hd;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3286
diff changeset
363 int64_t old_off = s->off;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
364
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
365 if (whence == AVSEEK_SIZE)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
366 return s->filesize;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
367 else if ((s->filesize == -1 && whence == SEEK_END) || h->is_streamed)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
368 return -1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
369
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
370 /* we save the old context in case the seek fails */
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
371 s->hd = NULL;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
372 if (whence == SEEK_CUR)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
373 off += s->off;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
374 else if (whence == SEEK_END)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
375 off += s->filesize;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
376 s->off = off;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
377
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
378 /* if it fails, continue on old connection */
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
379 if (http_open_cnx(h) < 0) {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
380 s->hd = old_hd;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
381 s->off = old_off;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
382 return -1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
383 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
384 url_close(old_hd);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
385 return off;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
386 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
387
4640
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
388 static int
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
389 http_get_file_handle(URLContext *h)
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
390 {
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
391 HTTPContext *s = h->priv_data;
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
392 return url_get_file_handle(s->hd);
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
393 }
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
394
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
395 URLProtocol http_protocol = {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
396 "http",
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
397 http_open,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
398 http_read,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
399 http_write,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
400 http_seek,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
401 http_close,
4640
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
402 .url_get_file_handle = http_get_file_handle,
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
403 };