annotate http.c @ 6150:6b770ef6cbea libavformat

Use url_write(), not http_write(), for sending the HTTP headers. This prevents them from being sent using chunked encoding (I don't think this ever happened, but either way it would be wrong).
author rbultje
date Sun, 20 Jun 2010 21:38:16 +0000
parents f221641c262a
children 8634f4b534fc
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"
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
31
1986
cf1622476eb7 typos/grammar
diego
parents: 1934
diff changeset
32 /* XXX: POST protocol is not completely implemented because ffmpeg uses
cf1622476eb7 typos/grammar
diego
parents: 1934
diff changeset
33 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
34
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
35 /* 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
36 #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
37 #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
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 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
41 URLContext *hd;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
42 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
43 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
44 int http_code;
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
45 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
46 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
47 char location[URL_SIZE];
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
48 HTTPAuthState auth_state;
6103
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
49 int init;
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
50 unsigned char headers[BUFFER_SIZE];
6108
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
51 int is_chunked;
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
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
54 static int http_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
55 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
56
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
57 void ff_http_set_headers(URLContext *h, const char *headers)
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
58 {
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
59 HTTPContext *s = h->priv_data;
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
60 int len = strlen(headers);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
61
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
62 if (len && strcmp("\r\n", headers + len - 2))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
63 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
64
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
65 av_strlcpy(s->headers, headers, sizeof(s->headers));
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
66 }
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
67
6108
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
68 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
69 {
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
70 ((HTTPContext*)h->priv_data)->is_chunked = is_chunked;
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
71 }
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
72
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
73 /* 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
74 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
75 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
76 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
77 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
78 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
79 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
80 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
81 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
82 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
83 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
84 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
85
6103
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
86 s->init = 1;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
87 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
88 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
89 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
90
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
91 /* 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
92 redo:
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
93 /* needed in any case to build the host string */
5775
7a123cc24a81 Rename url_split to ff_url_split
mstorsjo
parents: 5756
diff changeset
94 ff_url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port,
5776
d34f985d6e8f Reindent
mstorsjo
parents: 5775
diff changeset
95 path1, sizeof(path1), s->location);
5756
7c7fe75728dd Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents: 5544
diff changeset
96 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
97
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
98 if (use_proxy) {
5775
7a123cc24a81 Rename url_split to ff_url_split
mstorsjo
parents: 5756
diff changeset
99 ff_url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port,
5776
d34f985d6e8f Reindent
mstorsjo
parents: 5775
diff changeset
100 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
101 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
102 } else {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
103 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
104 path = "/";
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
105 else
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
106 path = path1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
107 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
108 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
109 port = 80;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
110
5756
7c7fe75728dd Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents: 5544
diff changeset
111 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
112 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
113 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
114 goto fail;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
115
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
116 s->hd = hd;
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
117 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
118 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
119 goto fail;
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
120 if (s->http_code == 401) {
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
121 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
122 url_close(hd);
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
123 goto redo;
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
124 } else
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
125 goto fail;
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
126 }
1852
467a411b5d26 make HTTP MOVED messages also work in ffmpeg (302 is essentially the same as 303).
gpoirier
parents: 1822
diff changeset
127 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
128 /* 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
129 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
130 if (redirects++ >= MAX_REDIRECTS)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2193
diff changeset
131 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
132 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 redo;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
134 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
135 return 0;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
136 fail:
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
137 if (hd)
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
138 url_close(hd);
6107
5ad38b8596b2 Fix handling of errors in the http protocol
mstorsjo
parents: 6106
diff changeset
139 s->hd = NULL;
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2193
diff changeset
140 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
141 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
142
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
143 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
144 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
145 HTTPContext *s;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
146
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
147 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
148
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
149 s = av_malloc(sizeof(HTTPContext));
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
150 if (!s) {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
151 return AVERROR(ENOMEM);
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
152 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
153 h->priv_data = s;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
154 s->filesize = -1;
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
155 s->chunksize = -1;
6108
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
156 s->is_chunked = 1;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
157 s->off = 0;
6103
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
158 s->init = 0;
6107
5ad38b8596b2 Fix handling of errors in the http protocol
mstorsjo
parents: 6106
diff changeset
159 s->hd = NULL;
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
160 *s->headers = '\0';
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
161 memset(&s->auth_state, 0, sizeof(s->auth_state));
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
162 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
163
6103
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
164 return 0;
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
165 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
166 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
167 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
168 int len;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
169 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
170 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
171 if (len < 0) {
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2193
diff changeset
172 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
173 } 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
174 return -1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
175 } else {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
176 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
177 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
178 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
179 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
180 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
181 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
182
5007
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
183 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
184 {
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
185 int ch;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
186 char *q;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
187
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
188 q = line;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
189 for(;;) {
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
190 ch = http_getc(s);
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
191 if (ch < 0)
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
192 return AVERROR(EIO);
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
193 if (ch == '\n') {
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
194 /* process line */
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
195 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
196 q--;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
197 *q = '\0';
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
198
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
199 return 0;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
200 } else {
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
201 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
202 *q++ = ch;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
203 }
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
204 }
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
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
207 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
208 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
209 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
210 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
211 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
212
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
213 /* 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
214 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
215 return 0;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
216
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
217 p = line;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
218 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
219 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
220 p++;
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))
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 s->http_code = strtol(p, NULL, 10);
5009
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
224
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
225 dprintf(NULL, "http_code=%d\n", s->http_code);
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
226
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
227 /* 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
228 * don't abort until all headers have been parsed. */
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
229 if (s->http_code >= 400 && s->http_code < 600 && s->http_code != 401)
1881
a7abdfdb5ed7 handle http error codes
alex
parents: 1853
diff changeset
230 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
231 } else {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
232 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
233 p++;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
234 if (*p != ':')
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
235 return 1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
236
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
237 *p = '\0';
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
238 tag = line;
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 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
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 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
243 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
244 *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
245 } 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
246 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
247 } 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
248 /* "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
249 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
250 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
251 p += 6;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
252 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
253 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
254 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
255 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
256 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
257 } 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
258 s->filesize = -1;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
259 s->chunksize = 0;
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
260 } else if (!strcmp (tag, "WWW-Authenticate")) {
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
261 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
262 } else if (!strcmp (tag, "Authentication-Info")) {
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);
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
264 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
265 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
266 return 1;
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
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
269 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
270 {
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
271 /* 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
272 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
273 }
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
274
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
275 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
276 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
277 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
278 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
279 int post, err;
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
280 char line[1024];
6106
44ee60d0c688 Fix bugs in the http custom header handling
mstorsjo
parents: 6104
diff changeset
281 char headers[1024] = "";
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
282 char *authstr = NULL;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3286
diff changeset
283 int64_t off = s->off;
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
284 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
285
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 /* 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
288 post = h->flags & URL_WRONLY;
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
289 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
290 post ? "POST" : "GET");
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
291
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
292 /* set default headers if needed */
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
293 if (!has_header(s->headers, "\r\nUser-Agent: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
294 len += av_strlcatf(headers + len, sizeof(headers) - len,
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
295 "User-Agent: %s\r\n", LIBAVFORMAT_IDENT);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
296 if (!has_header(s->headers, "\r\nAccept: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
297 len += av_strlcpy(headers + len, "Accept: */*\r\n",
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
298 sizeof(headers) - len);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
299 if (!has_header(s->headers, "\r\nRange: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
300 len += av_strlcatf(headers + len, sizeof(headers) - len,
6106
44ee60d0c688 Fix bugs in the http custom header handling
mstorsjo
parents: 6104
diff changeset
301 "Range: bytes=%"PRId64"-\r\n", s->off);
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
302 if (!has_header(s->headers, "\r\nConnection: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
303 len += av_strlcpy(headers + len, "Connection: close\r\n",
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
304 sizeof(headers)-len);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
305 if (!has_header(s->headers, "\r\nHost: "))
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
306 len += av_strlcatf(headers + len, sizeof(headers) - len,
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
307 "Host: %s\r\n", hoststr);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
308
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
309 /* now add in custom headers */
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
310 av_strlcpy(headers+len, s->headers, sizeof(headers)-len);
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
311
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
312 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
313 "%s %s HTTP/1.1\r\n"
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
314 "%s"
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
315 "%s"
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
316 "%s"
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
317 "\r\n",
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
318 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
319 path,
6108
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
320 post && s->is_chunked ? "Transfer-Encoding: chunked\r\n" : "",
6104
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
321 headers,
a5eaf91edd4a Add the capability to write custom HTTP headers
mstorsjo
parents: 6103
diff changeset
322 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
323
5879
61062082488b Split out http authentication handling into a separate file
mstorsjo
parents: 5837
diff changeset
324 av_freep(&authstr);
6150
6b770ef6cbea Use url_write(), not http_write(), for sending the HTTP headers. This prevents
rbultje
parents: 6117
diff changeset
325 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
326 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
327
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
328 /* 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
329 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
330 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
331 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
332 s->off = 0;
1909
663139d56669 Properly initialize filesize during input buffer initialization.
diego
parents: 1881
diff changeset
333 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
334 if (post) {
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
335 /* always use chunked encoding for upload data */
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
336 s->chunksize = 0;
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 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
343
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
344 /* 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
345 for(;;) {
5007
1d5f8836c8a8 Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents: 4640
diff changeset
346 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
347 return AVERROR(EIO);
5009
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
348
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
349 dprintf(NULL, "header='%s'\n", line);
822a36d7ac0a Cosmetics : Use dprintf instead of printf.
jai_menon
parents: 5008
diff changeset
350
5008
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
351 err = process_line(h, line, s->line_count, new_location);
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
352 if (err < 0)
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
353 return err;
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
354 if (err == 0)
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
355 break;
370160e040d9 Cosmetics : Fix indentation after last commit.
jai_menon
parents: 5007
diff changeset
356 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
357 }
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 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
360 }
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 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
364 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
365 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
366 int len;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
367
6103
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
368 if (!s->init) {
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
369 int ret = http_open_cnx(h);
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
370 if (ret != 0)
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
371 return ret;
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
372 }
6117
f221641c262a Make sure the http protocol handler returns errors if a delayed open had failed
mstorsjo
parents: 6115
diff changeset
373 if (!s->hd)
f221641c262a Make sure the http protocol handler returns errors if a delayed open had failed
mstorsjo
parents: 6115
diff changeset
374 return AVERROR(EIO);
6103
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
375
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
376 /* A size of zero can be used to force
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
377 * initializaton of the connection. */
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
378 if (!size)
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
379 return 0;
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
380
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
381 if (s->chunksize >= 0) {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
382 if (!s->chunksize) {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
383 char line[32];
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
384
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
385 for(;;) {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
386 do {
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
387 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
388 return AVERROR(EIO);
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
389 } 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
390
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
391 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
392
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
393 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
394
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
395 if (!s->chunksize)
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
396 return 0;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
397 break;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
398 }
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
399 }
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
400 size = FFMIN(size, s->chunksize);
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
401 }
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
402 /* 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
403 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
404 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
405 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
406 len = size;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
407 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
408 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
409 } else {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
410 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
411 }
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
412 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
413 s->off += len;
5059
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
414 if (s->chunksize > 0)
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
415 s->chunksize -= len;
a5b8b8cce2dd Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents: 5009
diff changeset
416 }
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
417 return len;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
418 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
419
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
420 /* used only when posting data */
6068
7fdda2416684 Declare the url_write buffer parameter as const
mstorsjo
parents: 5879
diff changeset
421 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
422 {
6108
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
423 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
424 int ret;
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
425 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
426 HTTPContext *s = h->priv_data;
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
427
6103
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
428 if (!s->init) {
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
429 int ret = http_open_cnx(h);
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
430 if (ret != 0)
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
431 return ret;
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
432 }
6117
f221641c262a Make sure the http protocol handler returns errors if a delayed open had failed
mstorsjo
parents: 6115
diff changeset
433 if (!s->hd)
f221641c262a Make sure the http protocol handler returns errors if a delayed open had failed
mstorsjo
parents: 6115
diff changeset
434 return AVERROR(EIO);
6103
447fe3440991 Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents: 6080
diff changeset
435
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
436 if (s->chunksize == -1) {
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
437 /* headers are sent without any special encoding */
5527
2d0a0d3e5df1 Reindent after r21166.
rbultje
parents: 5526
diff changeset
438 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
439 }
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 /* 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
442 * signal EOF */
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
443 if (size > 0) {
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
444 /* upload data using chunked encoding */
6108
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
445 if(s->is_chunked) {
6110
d3cfb2687491 Reindent
mstorsjo
parents: 6108
diff changeset
446 snprintf(temp, sizeof(temp), "%x\r\n", size);
6108
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
447 if ((ret = url_write(s->hd, temp, strlen(temp))) < 0)
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
448 return ret;
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
449 }
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
450
6108
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
451 if ((ret = url_write(s->hd, buf, size)) < 0)
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
452 return ret;
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
453
117b1826ce8e Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents: 6107
diff changeset
454 if (s->is_chunked && (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
455 return ret;
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
456 }
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
457 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
458 }
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 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
461 {
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
462 int ret = 0;
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
463 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
464 HTTPContext *s = h->priv_data;
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
465
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
466 /* signal end of chunked encoding if used */
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
467 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
468 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
469 ret = ret > 0 ? 0 : ret;
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
470 }
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
471
6107
5ad38b8596b2 Fix handling of errors in the http protocol
mstorsjo
parents: 6106
diff changeset
472 if (s->hd)
5ad38b8596b2 Fix handling of errors in the http protocol
mstorsjo
parents: 6106
diff changeset
473 url_close(s->hd);
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
474 av_free(s);
5526
f09594ca5f77 Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents: 5059
diff changeset
475 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
476 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
477
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3286
diff changeset
478 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
479 {
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
480 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
481 URLContext *old_hd = s->hd;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3286
diff changeset
482 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
483 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
484 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
485
6115
4c91cdcb8a52 Initialize the http connection in http_seek, too
mstorsjo
parents: 6110
diff changeset
486 if (!s->init) {
4c91cdcb8a52 Initialize the http connection in http_seek, too
mstorsjo
parents: 6110
diff changeset
487 int ret = http_open_cnx(h);
4c91cdcb8a52 Initialize the http connection in http_seek, too
mstorsjo
parents: 6110
diff changeset
488 if (ret != 0)
4c91cdcb8a52 Initialize the http connection in http_seek, too
mstorsjo
parents: 6110
diff changeset
489 return ret;
4c91cdcb8a52 Initialize the http connection in http_seek, too
mstorsjo
parents: 6110
diff changeset
490 }
6117
f221641c262a Make sure the http protocol handler returns errors if a delayed open had failed
mstorsjo
parents: 6115
diff changeset
491 if (!s->hd)
f221641c262a Make sure the http protocol handler returns errors if a delayed open had failed
mstorsjo
parents: 6115
diff changeset
492 return AVERROR(EIO);
6115
4c91cdcb8a52 Initialize the http connection in http_seek, too
mstorsjo
parents: 6110
diff changeset
493
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
494 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
495 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
496 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
497 return -1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
498
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
499 /* 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
500 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
501 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
502 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
503 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
504 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
505 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
506 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
507 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
508
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
509 /* 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
510 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
511 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
512 s->buf_ptr = s->buffer;
fc48f8bfbf2e restore old buffer content when seek failed in http protocol, fix issue #1631
bcoudurier
parents: 5527
diff changeset
513 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
514 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
515 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
516 return -1;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
517 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
518 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
519 return off;
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
520 }
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
521
4640
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
522 static int
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
523 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
524 {
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
525 HTTPContext *s = h->priv_data;
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
526 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
527 }
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
528
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
529 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
530 "http",
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
531 http_open,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
532 http_read,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
533 http_write,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
534 http_seek,
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
535 http_close,
4640
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4630
diff changeset
536 .url_get_file_handle = http_get_file_handle,
1822
2526fc1e568b Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff changeset
537 };