annotate http.c @ 6455:3f50c7effad1 libavformat

rtsp: 10l, try to update the correct rtp stream This fixes a bug from rev 22917. Now RTSP streams where the individual RTCP sender reports aren't sent at the same time actually are synced properly.
author mstorsjo
date Fri, 03 Sep 2010 07:10:21 +0000
parents 27242bd0812c
children fed4be333771
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/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
23 #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
24 #include <unistd.h>
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
25 #include <strings.h>
5837
d605f589f0be move ff_url_split() and ff_url_join() declarations to internal.h
aurel
parents: 5776
diff changeset
26 #include "internal.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"
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
28 #include "http.h"
2774
477419a721a3 os_support.h is also needed for usleep and lseek on MinGW.
ramiro
parents: 2274
diff changeset
29 #include "os_support.h"
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
30 #include "httpauth.h"
6163
2e0ee73855cd Add an AVClass to the HTTPContext
mstorsjo
parents: 6162
diff changeset
31 #include "libavcodec/opt.h"
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
32
1986
cf1622476eb7 typos/grammar
diego
parents: 1934
diff changeset
33 /* XXX: POST protocol is not completely implemented because ffmpeg uses
cf1622476eb7 typos/grammar
diego
parents: 1934
diff changeset
34 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
35
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
36 /* 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
37 #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
38 #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
39
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
40 typedef struct {
6163
2e0ee73855cd Add an AVClass to the HTTPContext
mstorsjo
parents: 6162
diff changeset
41 const AVClass *class;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
42 URLContext *hd;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
43 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
44 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
45 int http_code;
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
46 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
47 int64_t off, filesize;
6390
27242bd0812c Move the definition of the maximum url size for static buffers to internal.h
mstorsjo
parents: 6352
diff changeset
48 char location[MAX_URL_SIZE];
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
49 HTTPAuthState auth_state;
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
50 unsigned char headers[BUFFER_SIZE];
6352
3472338a5e13 http: Return EOF at the end of the content even if the connection isn't closed
mstorsjo
parents: 6263
diff changeset
51 int willclose; /**< Set if the server correctly handles Connection: close and will close the connection after feeding us the content. */
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
52 } HTTPContext;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
53
6163
2e0ee73855cd Add an AVClass to the HTTPContext
mstorsjo
parents: 6162
diff changeset
54 #define OFFSET(x) offsetof(HTTPContext, x)
2e0ee73855cd Add an AVClass to the HTTPContext
mstorsjo
parents: 6162
diff changeset
55 static const AVOption options[] = {
2e0ee73855cd Add an AVClass to the HTTPContext
mstorsjo
parents: 6162
diff changeset
56 {"chunksize", "use chunked transfer-encoding for posts, -1 disables it, 0 enables it", OFFSET(chunksize), FF_OPT_TYPE_INT64, 0, -1, 0 }, /* Default to 0, for chunked POSTs */
2e0ee73855cd Add an AVClass to the HTTPContext
mstorsjo
parents: 6162
diff changeset
57 {NULL}
2e0ee73855cd Add an AVClass to the HTTPContext
mstorsjo
parents: 6162
diff changeset
58 };
2e0ee73855cd Add an AVClass to the HTTPContext
mstorsjo
parents: 6162
diff changeset
59 static const AVClass httpcontext_class = {
2e0ee73855cd Add an AVClass to the HTTPContext
mstorsjo
parents: 6162
diff changeset
60 "HTTP", av_default_item_name, options, LIBAVUTIL_VERSION_INT
2e0ee73855cd Add an AVClass to the HTTPContext
mstorsjo
parents: 6162
diff changeset
61 };
2e0ee73855cd Add an AVClass to the HTTPContext
mstorsjo
parents: 6162
diff changeset
62
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
63 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
64 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
65
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
66 void ff_http_set_headers(URLContext *h, const char *headers)
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
67 {
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
68 HTTPContext *s = h->priv_data;
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
69 int len = strlen(headers);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
70
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
71 if (len && strcmp("\r\n", headers + len - 2))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
72 av_log(NULL, AV_LOG_ERROR, "No trailing CRLF found in HTTP header.\n");
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
73
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
74 av_strlcpy(s->headers, headers, sizeof(s->headers));
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
75 }
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
76
6108
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
77 void ff_http_set_chunked_transfer_encoding(URLContext *h, int is_chunked)
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
78 {
6153
2e07dcbab954 HTTP: Get rid of the is_chunked variable, use the chunksize variable instead
mstorsjo
parents: 6152
diff changeset
79 ((HTTPContext*)h->priv_data)->chunksize = is_chunked ? 0 : -1;
6108
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
80 }
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
81
6156
85710c0ef275 HTTP: Add a method for initializing the authentication state from another connection
mstorsjo
parents: 6155
diff changeset
82 void ff_http_init_auth_state(URLContext *dest, const URLContext *src)
85710c0ef275 HTTP: Add a method for initializing the authentication state from another connection
mstorsjo
parents: 6155
diff changeset
83 {
85710c0ef275 HTTP: Add a method for initializing the authentication state from another connection
mstorsjo
parents: 6155
diff changeset
84 memcpy(&((HTTPContext*)dest->priv_data)->auth_state,
85710c0ef275 HTTP: Add a method for initializing the authentication state from another connection
mstorsjo
parents: 6155
diff changeset
85 &((HTTPContext*)src->priv_data)->auth_state, sizeof(HTTPAuthState));
85710c0ef275 HTTP: Add a method for initializing the authentication state from another connection
mstorsjo
parents: 6155
diff changeset
86 }
85710c0ef275 HTTP: Add a method for initializing the authentication state from another connection
mstorsjo
parents: 6155
diff changeset
87
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
88 /* 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
89 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
90 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
91 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
92 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
93 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
94 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
95 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
96 int port, use_proxy, err, location_changed = 0, redirects = 0;
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
97 HTTPAuthType cur_auth_type;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
98 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
99 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
100
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
101 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
102 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
103 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
104
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
105 /* 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
106 redo:
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
107 /* needed in any case to build the host string */
6182
4fc5e0e4e1cd Make ff_url_split() public
mru
parents: 6164
diff changeset
108 av_url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port,
5776
d34f985d6e8f Reindent
mstorsjo
parents: 5775
diff changeset
109 path1, sizeof(path1), s->location);
5756
7c7fe75728dd Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents: 5544
diff changeset
110 ff_url_join(hoststr, sizeof(hoststr), NULL, NULL, hostname, port, NULL);
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
111
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
112 if (use_proxy) {
6182
4fc5e0e4e1cd Make ff_url_split() public
mru
parents: 6164
diff changeset
113 av_url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port,
5776
d34f985d6e8f Reindent
mstorsjo
parents: 5775
diff changeset
114 NULL, 0, proxy_path);
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
115 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
116 } else {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
117 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
118 path = "/";
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
119 else
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
120 path = path1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
121 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
122 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
123 port = 80;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
124
5756
7c7fe75728dd Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents: 5544
diff changeset
125 ff_url_join(buf, sizeof(buf), "tcp", NULL, hostname, port, NULL);
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
126 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
127 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
128 goto fail;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
129
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
130 s->hd = hd;
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
131 cur_auth_type = s->auth_state.auth_type;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
132 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
133 goto fail;
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
134 if (s->http_code == 401) {
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
135 if (cur_auth_type == HTTP_AUTH_NONE && s->auth_state.auth_type != HTTP_AUTH_NONE) {
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
136 url_close(hd);
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
137 goto redo;
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
138 } else
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
139 goto fail;
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
140 }
1852
467a411b5d26 make HTTP MOVED messages also work in ffmpeg (302 is essentially the same as 303).
gpoirier
parents: 1822
diff changeset
141 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
142 /* 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
143 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
144 if (redirects++ >= MAX_REDIRECTS)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2193
diff changeset
145 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
146 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
147 goto redo;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
148 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
149 return 0;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
150 fail:
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
151 if (hd)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
152 url_close(hd);
6107
5ad38b8596b2 Fix handling of errors in the http protocol
mstorsjo
parents: 6106
diff changeset
153 s->hd = NULL;
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2193
diff changeset
154 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
155 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
156
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
157 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
158 {
6162
4c0017a87855 Allocate the HTTPContext through URLProtocol.priv_data_size
mstorsjo
parents: 6156
diff changeset
159 HTTPContext *s = h->priv_data;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
160
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
161 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
162
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
163 s->filesize = -1;
6390
27242bd0812c Move the definition of the maximum url size for static buffers to internal.h
mstorsjo
parents: 6352
diff changeset
164 av_strlcpy(s->location, uri, sizeof(s->location));
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
165
6164
72ea866c62fd Make the http protocol open the connection immediately in http_open again
mstorsjo
parents: 6163
diff changeset
166 return http_open_cnx(h);
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
167 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
168 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
169 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
170 int len;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
171 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
172 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
173 if (len < 0) {
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2193
diff changeset
174 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
175 } 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
176 return -1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
177 } else {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
178 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
179 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
180 }
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 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
183 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
184
5007
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
185 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
186 {
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
187 int ch;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
188 char *q;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
189
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
190 q = line;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
191 for(;;) {
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
192 ch = http_getc(s);
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
193 if (ch < 0)
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
194 return AVERROR(EIO);
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
195 if (ch == '\n') {
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
196 /* process line */
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
197 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
198 q--;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
199 *q = '\0';
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
200
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
201 return 0;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
202 } else {
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
203 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
204 *q++ = ch;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
205 }
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
206 }
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
207 }
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
208
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
209 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
210 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
211 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
212 HTTPContext *s = h->priv_data;
6263
89adb1f9ff50 http: Log a warning when receiving an error code
mstorsjo
parents: 6182
diff changeset
213 char *tag, *p, *end;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
214
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
215 /* 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
216 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
217 return 0;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
218
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
219 p = line;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
220 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
221 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
222 p++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
223 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
224 p++;
6263
89adb1f9ff50 http: Log a warning when receiving an error code
mstorsjo
parents: 6182
diff changeset
225 s->http_code = strtol(p, &end, 10);
5009
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
226
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
227 dprintf(NULL, "http_code=%d\n", s->http_code);
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
228
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
229 /* error codes are 4xx and 5xx, but regard 401 as a success, so we
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
230 * don't abort until all headers have been parsed. */
6263
89adb1f9ff50 http: Log a warning when receiving an error code
mstorsjo
parents: 6182
diff changeset
231 if (s->http_code >= 400 && s->http_code < 600 && s->http_code != 401) {
89adb1f9ff50 http: Log a warning when receiving an error code
mstorsjo
parents: 6182
diff changeset
232 end += strspn(end, SPACE_CHARS);
89adb1f9ff50 http: Log a warning when receiving an error code
mstorsjo
parents: 6182
diff changeset
233 av_log(NULL, AV_LOG_WARNING, "HTTP error %d %s\n",
89adb1f9ff50 http: Log a warning when receiving an error code
mstorsjo
parents: 6182
diff changeset
234 s->http_code, end);
1881
a7abdfdb5ed7 handle http error codes
alex
parents: 1853
diff changeset
235 return -1;
6263
89adb1f9ff50 http: Log a warning when receiving an error code
mstorsjo
parents: 6182
diff changeset
236 }
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
237 } else {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
238 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
239 p++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
240 if (*p != ':')
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
241 return 1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
242
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
243 *p = '\0';
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
244 tag = line;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
245 p++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
246 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
247 p++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
248 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
249 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
250 *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
251 } 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
252 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
253 } 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
254 /* "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
255 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
256 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
257 p += 6;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
258 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
259 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
260 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
261 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
262 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
263 } 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
264 s->filesize = -1;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
265 s->chunksize = 0;
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
266 } else if (!strcmp (tag, "WWW-Authenticate")) {
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
267 ff_http_auth_handle_header(&s->auth_state, tag, p);
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
268 } else if (!strcmp (tag, "Authentication-Info")) {
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
269 ff_http_auth_handle_header(&s->auth_state, tag, p);
6352
3472338a5e13 http: Return EOF at the end of the content even if the connection isn't closed
mstorsjo
parents: 6263
diff changeset
270 } else if (!strcmp (tag, "Connection")) {
3472338a5e13 http: Return EOF at the end of the content even if the connection isn't closed
mstorsjo
parents: 6263
diff changeset
271 if (!strcmp(p, "close"))
3472338a5e13 http: Return EOF at the end of the content even if the connection isn't closed
mstorsjo
parents: 6263
diff changeset
272 s->willclose = 1;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
273 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
274 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
275 return 1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
276 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
277
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
278 static inline int has_header(const char *str, const char *header)
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
279 {
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
280 /* header + 2 to skip over CRLF prefix. (make sure you have one!) */
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
281 return av_stristart(str, header + 2, NULL) || av_stristr(str, header);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
282 }
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
283
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
284 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
285 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
286 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
287 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
288 int post, err;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
289 char line[1024];
6106
44ee60d0c688 Fix bugs in the http custom header handling
mstorsjo
parents: 6104
diff changeset
290 char headers[1024] = "";
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
291 char *authstr = NULL;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3286
diff changeset
292 int64_t off = s->off;
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
293 int 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
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 /* 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
297 post = h->flags & URL_WRONLY;
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
298 authstr = ff_http_auth_create_response(&s->auth_state, auth, path,
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
299 post ? "POST" : "GET");
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
300
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
301 /* set default headers if needed */
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
302 if (!has_header(s->headers, "\r\nUser-Agent: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
303 len += av_strlcatf(headers + len, sizeof(headers) - len,
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
304 "User-Agent: %s\r\n", LIBAVFORMAT_IDENT);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
305 if (!has_header(s->headers, "\r\nAccept: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
306 len += av_strlcpy(headers + len, "Accept: */*\r\n",
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
307 sizeof(headers) - len);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
308 if (!has_header(s->headers, "\r\nRange: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
309 len += av_strlcatf(headers + len, sizeof(headers) - len,
6106
44ee60d0c688 Fix bugs in the http custom header handling
mstorsjo
parents: 6104
diff changeset
310 "Range: bytes=%"PRId64"-\r\n", s->off);
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
311 if (!has_header(s->headers, "\r\nConnection: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
312 len += av_strlcpy(headers + len, "Connection: close\r\n",
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
313 sizeof(headers)-len);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
314 if (!has_header(s->headers, "\r\nHost: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
315 len += av_strlcatf(headers + len, sizeof(headers) - len,
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
316 "Host: %s\r\n", hoststr);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
317
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
318 /* now add in custom headers */
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
319 av_strlcpy(headers+len, s->headers, sizeof(headers)-len);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
320
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
321 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
322 "%s %s HTTP/1.1\r\n"
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
323 "%s"
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
324 "%s"
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
325 "%s"
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
326 "\r\n",
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
327 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
328 path,
6153
2e07dcbab954 HTTP: Get rid of the is_chunked variable, use the chunksize variable instead
mstorsjo
parents: 6152
diff changeset
329 post && s->chunksize >= 0 ? "Transfer-Encoding: chunked\r\n" : "",
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
330 headers,
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
331 authstr ? authstr : "");
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
332
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
333 av_freep(&authstr);
6150
6b770ef6cbea Use url_write(), not http_write(), for sending the HTTP headers. This prevents
rbultje
parents: 6117
diff changeset
334 if (url_write(s->hd, s->buffer, strlen(s->buffer)) < 0)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2193
diff changeset
335 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
336
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
337 /* 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
338 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
339 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
340 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
341 s->off = 0;
1909
663139d56669 Properly initialize filesize during input buffer initialization.
diego
parents: 1881
diff changeset
342 s->filesize = -1;
6352
3472338a5e13 http: Return EOF at the end of the content even if the connection isn't closed
mstorsjo
parents: 6263
diff changeset
343 s->willclose = 0;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
344 if (post) {
6080
c7ddd67739a6 http: Set http_code to 200 when doing a POST
mstorsjo
parents: 6068
diff changeset
345 /* Pretend that it did work. We didn't read any header yet, since
c7ddd67739a6 http: Set http_code to 200 when doing a POST
mstorsjo
parents: 6068
diff changeset
346 * we've still to send the POST data, but the code calling this
c7ddd67739a6 http: Set http_code to 200 when doing a POST
mstorsjo
parents: 6068
diff changeset
347 * function will check http_code after we return. */
c7ddd67739a6 http: Set http_code to 200 when doing a POST
mstorsjo
parents: 6068
diff changeset
348 s->http_code = 200;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
349 return 0;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
350 }
6153
2e07dcbab954 HTTP: Get rid of the is_chunked variable, use the chunksize variable instead
mstorsjo
parents: 6152
diff changeset
351 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
352
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
353 /* 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
354 for(;;) {
5007
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
355 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
356 return AVERROR(EIO);
5009
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
357
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
358 dprintf(NULL, "header='%s'\n", line);
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
359
5008
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
360 err = process_line(h, line, s->line_count, new_location);
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
361 if (err < 0)
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
362 return err;
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
363 if (err == 0)
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
364 break;
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
365 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
366 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
367
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
368 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
369 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
370
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
371
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
372 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
373 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
374 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
375 int len;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
376
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
377 if (s->chunksize >= 0) {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
378 if (!s->chunksize) {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
379 char line[32];
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
380
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
381 for(;;) {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
382 do {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
383 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
384 return AVERROR(EIO);
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
385 } 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
386
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
387 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
388
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
389 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
390
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
391 if (!s->chunksize)
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
392 return 0;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
393 break;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
394 }
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
395 }
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
396 size = FFMIN(size, s->chunksize);
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
397 }
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
398 /* 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
399 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
400 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
401 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
402 len = size;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
403 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
404 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
405 } else {
6352
3472338a5e13 http: Return EOF at the end of the content even if the connection isn't closed
mstorsjo
parents: 6263
diff changeset
406 if (!s->willclose && s->filesize >= 0 && s->off >= s->filesize)
3472338a5e13 http: Return EOF at the end of the content even if the connection isn't closed
mstorsjo
parents: 6263
diff changeset
407 return AVERROR_EOF;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
408 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
409 }
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
410 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
411 s->off += len;
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
412 if (s->chunksize > 0)
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
413 s->chunksize -= len;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
414 }
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
415 return len;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
416 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
417
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
418 /* used only when posting data */
6068
7fdda2416684 Declare the url_write buffer parameter as const
mstorsjo
parents: 5879
diff changeset
419 static int http_write(URLContext *h, const uint8_t *buf, int size)
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
420 {
6108
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
421 char temp[11] = ""; /* 32-bit hex + CRLF + nul */
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
422 int ret;
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
423 char crlf[] = "\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
424 HTTPContext *s = h->priv_data;
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
425
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
426 if (s->chunksize == -1) {
6152
b9dee5077174 HTTP: Clarify a comment
mstorsjo
parents: 6151
diff changeset
427 /* non-chunked data is sent without any special encoding */
5527
2d0a0d3e5df1 Reindent after r21166.
rbultje
parents: 5526
diff changeset
428 return url_write(s->hd, buf, size);
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
429 }
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
430
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
431 /* silently ignore zero-size data since chunk encoding that would
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
432 * signal EOF */
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
433 if (size > 0) {
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
434 /* upload data using chunked encoding */
6155
a7094b61b3fb Reindent
mstorsjo
parents: 6154
diff changeset
435 snprintf(temp, sizeof(temp), "%x\r\n", size);
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
436
6154
78f96a0ef08c HTTP: Compact the code for writing chunked post data
mstorsjo
parents: 6153
diff changeset
437 if ((ret = url_write(s->hd, temp, strlen(temp))) < 0 ||
78f96a0ef08c HTTP: Compact the code for writing chunked post data
mstorsjo
parents: 6153
diff changeset
438 (ret = url_write(s->hd, buf, size)) < 0 ||
78f96a0ef08c HTTP: Compact the code for writing chunked post data
mstorsjo
parents: 6153
diff changeset
439 (ret = url_write(s->hd, crlf, sizeof(crlf) - 1)) < 0)
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
440 return ret;
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
441 }
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
442 return size;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
443 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
444
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
445 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
446 {
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
447 int ret = 0;
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
448 char footer[] = "0\r\n\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
449 HTTPContext *s = h->priv_data;
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
450
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
451 /* signal end of chunked encoding if used */
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
452 if ((h->flags & URL_WRONLY) && s->chunksize != -1) {
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
453 ret = url_write(s->hd, footer, sizeof(footer) - 1);
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
454 ret = ret > 0 ? 0 : ret;
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
455 }
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
456
6107
5ad38b8596b2 Fix handling of errors in the http protocol
mstorsjo
parents: 6106
diff changeset
457 if (s->hd)
5ad38b8596b2 Fix handling of errors in the http protocol
mstorsjo
parents: 6106
diff changeset
458 url_close(s->hd);
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
459 return ret;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
460 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
461
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3286
diff changeset
462 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
463 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
464 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
465 URLContext *old_hd = s->hd;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3286
diff changeset
466 int64_t old_off = s->off;
5544
fc48f8bfbf2e restore old buffer content when seek failed in http protocol, fix issue #1631
bcoudurier
parents: 5527
diff changeset
467 uint8_t old_buf[BUFFER_SIZE];
fc48f8bfbf2e restore old buffer content when seek failed in http protocol, fix issue #1631
bcoudurier
parents: 5527
diff changeset
468 int old_buf_size;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
469
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
470 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
471 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
472 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
473 return -1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
474
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
475 /* we save the old context in case the seek fails */
5544
fc48f8bfbf2e restore old buffer content when seek failed in http protocol, fix issue #1631
bcoudurier
parents: 5527
diff changeset
476 old_buf_size = s->buf_end - s->buf_ptr;
fc48f8bfbf2e restore old buffer content when seek failed in http protocol, fix issue #1631
bcoudurier
parents: 5527
diff changeset
477 memcpy(old_buf, s->buf_ptr, old_buf_size);
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
478 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
479 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
480 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
481 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
482 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
483 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
484
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
485 /* 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
486 if (http_open_cnx(h) < 0) {
5544
fc48f8bfbf2e restore old buffer content when seek failed in http protocol, fix issue #1631
bcoudurier
parents: 5527
diff changeset
487 memcpy(s->buffer, old_buf, old_buf_size);
fc48f8bfbf2e restore old buffer content when seek failed in http protocol, fix issue #1631
bcoudurier
parents: 5527
diff changeset
488 s->buf_ptr = s->buffer;
fc48f8bfbf2e restore old buffer content when seek failed in http protocol, fix issue #1631
bcoudurier
parents: 5527
diff changeset
489 s->buf_end = s->buffer + old_buf_size;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
490 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
491 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
492 return -1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
493 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
494 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
495 return off;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
496 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
497
4640
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
498 static int
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
499 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
500 {
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
501 HTTPContext *s = h->priv_data;
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
502 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
503 }
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
504
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
505 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
506 "http",
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
507 http_open,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
508 http_read,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
509 http_write,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
510 http_seek,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
511 http_close,
4640
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
512 .url_get_file_handle = http_get_file_handle,
6162
4c0017a87855 Allocate the HTTPContext through URLProtocol.priv_data_size
mstorsjo
parents: 6156
diff changeset
513 .priv_data_size = sizeof(HTTPContext),
6163
2e0ee73855cd Add an AVClass to the HTTPContext
mstorsjo
parents: 6162
diff changeset
514 .priv_data_class = &httpcontext_class,
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
515 };