annotate http.c @ 6260:5c17c20dd67a libavformat

In ogg muxer, use dyn buffer to compute crc of the page, fix muxing with pipe when page buffer is bigger than default buffer size. Max page is 65k.
author bcoudurier
date Wed, 14 Jul 2010 23:21:18 +0000
parents 4fc5e0e4e1cd
children 89adb1f9ff50
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 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
39 #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
40
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
41 typedef struct {
6163
2e0ee73855cd Add an AVClass to the HTTPContext
mstorsjo
parents: 6162
diff changeset
42 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
43 URLContext *hd;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
44 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
45 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
46 int http_code;
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
47 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
48 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
49 char location[URL_SIZE];
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
50 HTTPAuthState auth_state;
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
51 unsigned char headers[BUFFER_SIZE];
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;
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
164 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
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;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
213 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
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++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
225 s->http_code = strtol(p, NULL, 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. */
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
231 if (s->http_code >= 400 && s->http_code < 600 && s->http_code != 401)
1881
a7abdfdb5ed7 handle http error codes
alex
parents: 1853
diff changeset
232 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
233 } else {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
234 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
235 p++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
236 if (*p != ':')
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
237 return 1;
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 *p = '\0';
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
240 tag = line;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
241 p++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
242 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
243 p++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
244 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
245 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
246 *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
247 } 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
248 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
249 } 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
250 /* "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
251 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
252 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
253 p += 6;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
254 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
255 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
256 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
257 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
258 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
259 } 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
260 s->filesize = -1;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
261 s->chunksize = 0;
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
262 } else if (!strcmp (tag, "WWW-Authenticate")) {
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
263 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
264 } else if (!strcmp (tag, "Authentication-Info")) {
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
265 ff_http_auth_handle_header(&s->auth_state, tag, p);
1822
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 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
268 return 1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
269 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
270
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
271 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
272 {
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
273 /* 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
274 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
275 }
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
276
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
277 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
278 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
279 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
280 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
281 int post, err;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
282 char line[1024];
6106
44ee60d0c688 Fix bugs in the http custom header handling
mstorsjo
parents: 6104
diff changeset
283 char headers[1024] = "";
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
284 char *authstr = NULL;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3286
diff changeset
285 int64_t off = s->off;
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
286 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
287
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
288
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
289 /* 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
290 post = h->flags & URL_WRONLY;
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
291 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
292 post ? "POST" : "GET");
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
293
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
294 /* set default headers if needed */
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
295 if (!has_header(s->headers, "\r\nUser-Agent: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
296 len += av_strlcatf(headers + len, sizeof(headers) - len,
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
297 "User-Agent: %s\r\n", LIBAVFORMAT_IDENT);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
298 if (!has_header(s->headers, "\r\nAccept: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
299 len += av_strlcpy(headers + len, "Accept: */*\r\n",
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
300 sizeof(headers) - len);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
301 if (!has_header(s->headers, "\r\nRange: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
302 len += av_strlcatf(headers + len, sizeof(headers) - len,
6106
44ee60d0c688 Fix bugs in the http custom header handling
mstorsjo
parents: 6104
diff changeset
303 "Range: bytes=%"PRId64"-\r\n", s->off);
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
304 if (!has_header(s->headers, "\r\nConnection: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
305 len += av_strlcpy(headers + len, "Connection: close\r\n",
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
306 sizeof(headers)-len);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
307 if (!has_header(s->headers, "\r\nHost: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
308 len += av_strlcatf(headers + len, sizeof(headers) - len,
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
309 "Host: %s\r\n", hoststr);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
310
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
311 /* now add in custom headers */
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
312 av_strlcpy(headers+len, s->headers, sizeof(headers)-len);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
313
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
314 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
315 "%s %s HTTP/1.1\r\n"
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
316 "%s"
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
317 "%s"
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
318 "%s"
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
319 "\r\n",
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
320 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
321 path,
6153
2e07dcbab954 HTTP: Get rid of the is_chunked variable, use the chunksize variable instead
mstorsjo
parents: 6152
diff changeset
322 post && s->chunksize >= 0 ? "Transfer-Encoding: chunked\r\n" : "",
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
323 headers,
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
324 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
325
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
326 av_freep(&authstr);
6150
6b770ef6cbea Use url_write(), not http_write(), for sending the HTTP headers. This prevents
rbultje
parents: 6117
diff changeset
327 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
328 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
329
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
330 /* 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
331 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
332 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
333 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
334 s->off = 0;
1909
663139d56669 Properly initialize filesize during input buffer initialization.
diego
parents: 1881
diff changeset
335 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
336 if (post) {
6080
c7ddd67739a6 http: Set http_code to 200 when doing a POST
mstorsjo
parents: 6068
diff changeset
337 /* 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
338 * 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
339 * function will check http_code after we return. */
c7ddd67739a6 http: Set http_code to 200 when doing a POST
mstorsjo
parents: 6068
diff changeset
340 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
341 return 0;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
342 }
6153
2e07dcbab954 HTTP: Get rid of the is_chunked variable, use the chunksize variable instead
mstorsjo
parents: 6152
diff changeset
343 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
344
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
345 /* 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
346 for(;;) {
5007
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
347 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
348 return AVERROR(EIO);
5009
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
349
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
350 dprintf(NULL, "header='%s'\n", line);
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
351
5008
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
352 err = process_line(h, line, s->line_count, new_location);
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
353 if (err < 0)
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
354 return err;
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
355 if (err == 0)
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
356 break;
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
357 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
358 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
359
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
360 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
361 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
362
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
363
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
364 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
365 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
366 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
367 int len;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
368
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
369 if (s->chunksize >= 0) {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
370 if (!s->chunksize) {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
371 char line[32];
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
372
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
373 for(;;) {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
374 do {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
375 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
376 return AVERROR(EIO);
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
377 } 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
378
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
379 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
380
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
381 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
382
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
383 if (!s->chunksize)
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
384 return 0;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
385 break;
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 }
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
388 size = FFMIN(size, s->chunksize);
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
389 }
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
390 /* 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
391 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
392 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
393 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
394 len = size;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
395 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
396 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
397 } else {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
398 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
399 }
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
400 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
401 s->off += len;
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
402 if (s->chunksize > 0)
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
403 s->chunksize -= len;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
404 }
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
405 return len;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
406 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
407
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
408 /* used only when posting data */
6068
7fdda2416684 Declare the url_write buffer parameter as const
mstorsjo
parents: 5879
diff changeset
409 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
410 {
6108
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
411 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
412 int ret;
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
413 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
414 HTTPContext *s = h->priv_data;
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
415
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
416 if (s->chunksize == -1) {
6152
b9dee5077174 HTTP: Clarify a comment
mstorsjo
parents: 6151
diff changeset
417 /* non-chunked data is sent without any special encoding */
5527
2d0a0d3e5df1 Reindent after r21166.
rbultje
parents: 5526
diff changeset
418 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
419 }
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
420
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
421 /* 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
422 * signal EOF */
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
423 if (size > 0) {
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
424 /* upload data using chunked encoding */
6155
a7094b61b3fb Reindent
mstorsjo
parents: 6154
diff changeset
425 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
426
6154
78f96a0ef08c HTTP: Compact the code for writing chunked post data
mstorsjo
parents: 6153
diff changeset
427 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
428 (ret = url_write(s->hd, buf, size)) < 0 ||
78f96a0ef08c HTTP: Compact the code for writing chunked post data
mstorsjo
parents: 6153
diff changeset
429 (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
430 return ret;
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
431 }
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
432 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
433 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
434
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
435 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
436 {
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
437 int ret = 0;
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
438 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
439 HTTPContext *s = h->priv_data;
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
440
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
441 /* signal end of chunked encoding if used */
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
442 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
443 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
444 ret = ret > 0 ? 0 : ret;
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
445 }
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
446
6107
5ad38b8596b2 Fix handling of errors in the http protocol
mstorsjo
parents: 6106
diff changeset
447 if (s->hd)
5ad38b8596b2 Fix handling of errors in the http protocol
mstorsjo
parents: 6106
diff changeset
448 url_close(s->hd);
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H?rdin
rbultje
parents: 5059
diff changeset
449 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
450 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
451
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3286
diff changeset
452 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
453 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
454 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
455 URLContext *old_hd = s->hd;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3286
diff changeset
456 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
457 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
458 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
459
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
460 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
461 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
462 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
463 return -1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
464
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
465 /* 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
466 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
467 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
468 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
469 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
470 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
471 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
472 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
473 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
474
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
475 /* 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
476 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
477 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
478 s->buf_ptr = s->buffer;
fc48f8bfbf2e restore old buffer content when seek failed in http protocol, fix issue #1631
bcoudurier
parents: 5527
diff changeset
479 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
480 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
481 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
482 return -1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
483 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
484 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
485 return off;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
486 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
487
4640
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
488 static int
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
489 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
490 {
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
491 HTTPContext *s = h->priv_data;
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
492 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
493 }
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
494
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
495 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
496 "http",
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
497 http_open,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
498 http_read,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
499 http_write,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
500 http_seek,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
501 http_close,
4640
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
502 .url_get_file_handle = http_get_file_handle,
6162
4c0017a87855 Allocate the HTTPContext through URLProtocol.priv_data_size
mstorsjo
parents: 6156
diff changeset
503 .priv_data_size = sizeof(HTTPContext),
6163
2e0ee73855cd Add an AVClass to the HTTPContext
mstorsjo
parents: 6162
diff changeset
504 .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
505 };