annotate http.c @ 6118:6780dc315f36 libavformat

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