Mercurial > libavformat.hg
annotate http.c @ 6161:f7090c70ed34 libavformat
Add priv_data_size and priv_data_class to URLProtocol
This allows url_alloc to allocate and initialize the priv_data.
author | mstorsjo |
---|---|
date | Tue, 22 Jun 2010 14:09:08 +0000 |
parents | 85710c0ef275 |
children | 4c0017a87855 |
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 | 21 |
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 | 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 | 32 /* XXX: POST protocol is not completely implemented because ffmpeg uses |
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 | 50 unsigned char headers[BUFFER_SIZE]; |
1822
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
51 } HTTPContext; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
52 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
53 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
|
54 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
|
55 |
6104 | 56 void ff_http_set_headers(URLContext *h, const char *headers) |
57 { | |
58 HTTPContext *s = h->priv_data; | |
59 int len = strlen(headers); | |
60 | |
61 if (len && strcmp("\r\n", headers + len - 2)) | |
62 av_log(NULL, AV_LOG_ERROR, "No trailing CRLF found in HTTP header.\n"); | |
63 | |
64 av_strlcpy(s->headers, headers, sizeof(s->headers)); | |
65 } | |
1822
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
66 |
6108
117b1826ce8e
Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents:
6107
diff
changeset
|
67 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
|
68 { |
6153
2e07dcbab954
HTTP: Get rid of the is_chunked variable, use the chunksize variable instead
mstorsjo
parents:
6152
diff
changeset
|
69 ((HTTPContext*)h->priv_data)->chunksize = is_chunked ? 0 : -1; |
6108
117b1826ce8e
Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents:
6107
diff
changeset
|
70 } |
117b1826ce8e
Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents:
6107
diff
changeset
|
71 |
6156
85710c0ef275
HTTP: Add a method for initializing the authentication state from another connection
mstorsjo
parents:
6155
diff
changeset
|
72 void ff_http_init_auth_state(URLContext *dest, const URLContext *src) |
85710c0ef275
HTTP: Add a method for initializing the authentication state from another connection
mstorsjo
parents:
6155
diff
changeset
|
73 { |
85710c0ef275
HTTP: Add a method for initializing the authentication state from another connection
mstorsjo
parents:
6155
diff
changeset
|
74 memcpy(&((HTTPContext*)dest->priv_data)->auth_state, |
85710c0ef275
HTTP: Add a method for initializing the authentication state from another connection
mstorsjo
parents:
6155
diff
changeset
|
75 &((HTTPContext*)src->priv_data)->auth_state, sizeof(HTTPAuthState)); |
85710c0ef275
HTTP: Add a method for initializing the authentication state from another connection
mstorsjo
parents:
6155
diff
changeset
|
76 } |
85710c0ef275
HTTP: Add a method for initializing the authentication state from another connection
mstorsjo
parents:
6155
diff
changeset
|
77 |
1822
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
78 /* 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
|
79 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
|
80 { |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
81 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
|
82 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
|
83 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
|
84 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
|
85 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
|
86 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
|
87 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
|
88 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
|
89 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
|
90 |
6103
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
91 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
|
92 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
|
93 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
|
94 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
|
95 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
96 /* 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
|
97 redo: |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
98 /* needed in any case to build the host string */ |
5775 | 99 ff_url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port, |
5776 | 100 path1, sizeof(path1), s->location); |
5756
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5544
diff
changeset
|
101 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
|
102 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
103 if (use_proxy) { |
5775 | 104 ff_url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port, |
5776 | 105 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
|
106 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
|
107 } else { |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
108 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
|
109 path = "/"; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
110 else |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
111 path = path1; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
112 } |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
113 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
|
114 port = 80; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
115 |
5756
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5544
diff
changeset
|
116 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
|
117 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
|
118 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
|
119 goto fail; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
120 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
121 s->hd = hd; |
5879
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
122 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
|
123 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
|
124 goto fail; |
5879
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
125 if (s->http_code == 401) { |
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
126 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
|
127 url_close(hd); |
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
128 goto redo; |
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
129 } else |
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
130 goto fail; |
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
131 } |
1852
467a411b5d26
make HTTP MOVED messages also work in ffmpeg (302 is essentially the same as 303).
gpoirier
parents:
1822
diff
changeset
|
132 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
|
133 /* 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
|
134 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
|
135 if (redirects++ >= MAX_REDIRECTS) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2193
diff
changeset
|
136 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
|
137 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
|
138 goto redo; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
139 } |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
140 return 0; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
141 fail: |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
142 if (hd) |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
143 url_close(hd); |
6107 | 144 s->hd = NULL; |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2193
diff
changeset
|
145 return AVERROR(EIO); |
1822
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
146 } |
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 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
|
149 { |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
150 HTTPContext *s; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
151 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
152 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
|
153 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
154 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
|
155 if (!s) { |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
156 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
|
157 } |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
158 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
|
159 s->filesize = -1; |
6153
2e07dcbab954
HTTP: Get rid of the is_chunked variable, use the chunksize variable instead
mstorsjo
parents:
6152
diff
changeset
|
160 s->chunksize = 0; /* Default to chunked POSTs */ |
1822
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
161 s->off = 0; |
6103
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
162 s->init = 0; |
6107 | 163 s->hd = NULL; |
6104 | 164 *s->headers = '\0'; |
5879
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
165 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
|
166 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
|
167 |
6103
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
168 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
|
169 } |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
170 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
|
171 { |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
172 int len; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
173 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
|
174 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
|
175 if (len < 0) { |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2193
diff
changeset
|
176 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
|
177 } 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
|
178 return -1; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
179 } else { |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
180 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
|
181 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
|
182 } |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
183 } |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
184 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
|
185 } |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
186 |
5007
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
187 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
|
188 { |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
189 int ch; |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
190 char *q; |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
191 |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
192 q = line; |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
193 for(;;) { |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
194 ch = http_getc(s); |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
195 if (ch < 0) |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
196 return AVERROR(EIO); |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
197 if (ch == '\n') { |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
198 /* process line */ |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
199 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
|
200 q--; |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
201 *q = '\0'; |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
202 |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
203 return 0; |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
204 } else { |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
205 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
|
206 *q++ = ch; |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
207 } |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
208 } |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
209 } |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
210 |
1822
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
211 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
|
212 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
|
213 { |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
214 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
|
215 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
|
216 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
217 /* 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
|
218 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
|
219 return 0; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
220 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
221 p = line; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
222 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
|
223 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
|
224 p++; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
225 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
|
226 p++; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
227 s->http_code = strtol(p, NULL, 10); |
5009 | 228 |
229 dprintf(NULL, "http_code=%d\n", s->http_code); | |
230 | |
5879
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
231 /* 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
|
232 * don't abort until all headers have been parsed. */ |
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
233 if (s->http_code >= 400 && s->http_code < 600 && s->http_code != 401) |
1881 | 234 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
|
235 } else { |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
236 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
|
237 p++; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
238 if (*p != ':') |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
239 return 1; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
240 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
241 *p = '\0'; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
242 tag = line; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
243 p++; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
244 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
|
245 p++; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
246 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
|
247 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
|
248 *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
|
249 } 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
|
250 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
|
251 } 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
|
252 /* "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
|
253 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
|
254 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
|
255 p += 6; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
256 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
|
257 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
|
258 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
|
259 } |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
260 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
|
261 } 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
|
262 s->filesize = -1; |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
263 s->chunksize = 0; |
5879
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
264 } else if (!strcmp (tag, "WWW-Authenticate")) { |
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
265 ff_http_auth_handle_header(&s->auth_state, tag, p); |
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
266 } else if (!strcmp (tag, "Authentication-Info")) { |
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
267 ff_http_auth_handle_header(&s->auth_state, tag, p); |
1822
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 } |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
270 return 1; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
271 } |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
272 |
6104 | 273 static inline int has_header(const char *str, const char *header) |
274 { | |
275 /* header + 2 to skip over CRLF prefix. (make sure you have one!) */ | |
276 return av_stristart(str, header + 2, NULL) || av_stristr(str, header); | |
277 } | |
278 | |
1822
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
279 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
|
280 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
|
281 { |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
282 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
|
283 int post, err; |
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
284 char line[1024]; |
6106 | 285 char headers[1024] = ""; |
5879
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
286 char *authstr = NULL; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3286
diff
changeset
|
287 int64_t off = s->off; |
6104 | 288 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
|
289 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
290 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
291 /* 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
|
292 post = h->flags & URL_WRONLY; |
5879
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
293 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
|
294 post ? "POST" : "GET"); |
6104 | 295 |
296 /* set default headers if needed */ | |
297 if (!has_header(s->headers, "\r\nUser-Agent: ")) | |
298 len += av_strlcatf(headers + len, sizeof(headers) - len, | |
299 "User-Agent: %s\r\n", LIBAVFORMAT_IDENT); | |
300 if (!has_header(s->headers, "\r\nAccept: ")) | |
301 len += av_strlcpy(headers + len, "Accept: */*\r\n", | |
302 sizeof(headers) - len); | |
303 if (!has_header(s->headers, "\r\nRange: ")) | |
304 len += av_strlcatf(headers + len, sizeof(headers) - len, | |
6106 | 305 "Range: bytes=%"PRId64"-\r\n", s->off); |
6104 | 306 if (!has_header(s->headers, "\r\nConnection: ")) |
307 len += av_strlcpy(headers + len, "Connection: close\r\n", | |
308 sizeof(headers)-len); | |
309 if (!has_header(s->headers, "\r\nHost: ")) | |
310 len += av_strlcatf(headers + len, sizeof(headers) - len, | |
311 "Host: %s\r\n", hoststr); | |
312 | |
313 /* now add in custom headers */ | |
314 av_strlcpy(headers+len, s->headers, sizeof(headers)-len); | |
315 | |
1822
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
316 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
|
317 "%s %s HTTP/1.1\r\n" |
5879
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
318 "%s" |
6104 | 319 "%s" |
5526
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
320 "%s" |
1822
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
321 "\r\n", |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
322 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
|
323 path, |
6153
2e07dcbab954
HTTP: Get rid of the is_chunked variable, use the chunksize variable instead
mstorsjo
parents:
6152
diff
changeset
|
324 post && s->chunksize >= 0 ? "Transfer-Encoding: chunked\r\n" : "", |
6104 | 325 headers, |
326 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
|
327 |
5879
61062082488b
Split out http authentication handling into a separate file
mstorsjo
parents:
5837
diff
changeset
|
328 av_freep(&authstr); |
6150
6b770ef6cbea
Use url_write(), not http_write(), for sending the HTTP headers. This prevents
rbultje
parents:
6117
diff
changeset
|
329 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
|
330 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
|
331 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
332 /* 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
|
333 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
|
334 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
|
335 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
|
336 s->off = 0; |
1909
663139d56669
Properly initialize filesize during input buffer initialization.
diego
parents:
1881
diff
changeset
|
337 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
|
338 if (post) { |
6080 | 339 /* Pretend that it did work. We didn't read any header yet, since |
340 * we've still to send the POST data, but the code calling this | |
341 * function will check http_code after we return. */ | |
342 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
|
343 return 0; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
344 } |
6153
2e07dcbab954
HTTP: Get rid of the is_chunked variable, use the chunksize variable instead
mstorsjo
parents:
6152
diff
changeset
|
345 s->chunksize = -1; |
1822
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
346 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
347 /* 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
|
348 for(;;) { |
5007
1d5f8836c8a8
Introduce http_get_line and modify http_connect to use http_get_line.
jai_menon
parents:
4640
diff
changeset
|
349 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
|
350 return AVERROR(EIO); |
5009 | 351 |
352 dprintf(NULL, "header='%s'\n", line); | |
353 | |
5008 | 354 err = process_line(h, line, s->line_count, new_location); |
355 if (err < 0) | |
356 return err; | |
357 if (err == 0) | |
358 break; | |
359 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
|
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 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
|
363 } |
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 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
366 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
|
367 { |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
368 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
|
369 int len; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
370 |
6103
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
371 if (!s->init) { |
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
372 int ret = http_open_cnx(h); |
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
373 if (ret != 0) |
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
374 return ret; |
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
375 } |
6117
f221641c262a
Make sure the http protocol handler returns errors if a delayed open had failed
mstorsjo
parents:
6115
diff
changeset
|
376 if (!s->hd) |
f221641c262a
Make sure the http protocol handler returns errors if a delayed open had failed
mstorsjo
parents:
6115
diff
changeset
|
377 return AVERROR(EIO); |
6103
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
378 |
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
379 /* 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
|
380 * initializaton of the connection. */ |
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
381 if (!size) |
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
382 return 0; |
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
383 |
5059
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
384 if (s->chunksize >= 0) { |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
385 if (!s->chunksize) { |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
386 char line[32]; |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
387 |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
388 for(;;) { |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
389 do { |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
390 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
|
391 return AVERROR(EIO); |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
392 } 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
|
393 |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
394 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
|
395 |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
396 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
|
397 |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
398 if (!s->chunksize) |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
399 return 0; |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
400 break; |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
401 } |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
402 } |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
403 size = FFMIN(size, s->chunksize); |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
404 } |
1822
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
405 /* 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
|
406 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
|
407 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
|
408 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
|
409 len = size; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
410 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
|
411 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
|
412 } else { |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
413 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
|
414 } |
5059
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
415 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
|
416 s->off += len; |
5059
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
417 if (s->chunksize > 0) |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
418 s->chunksize -= len; |
a5b8b8cce2dd
Add support for "chunked" data blocks. Patch by Peter Holik (peter holik at).
rbultje
parents:
5009
diff
changeset
|
419 } |
1822
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
420 return len; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
421 } |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
422 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
423 /* used only when posting data */ |
6068 | 424 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
|
425 { |
6108
117b1826ce8e
Add support for disabling chunked transfer encoding for the http protocol
mstorsjo
parents:
6107
diff
changeset
|
426 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
|
427 int ret; |
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
428 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
|
429 HTTPContext *s = h->priv_data; |
5526
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
430 |
6103
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
431 if (!s->init) { |
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
432 int ret = http_open_cnx(h); |
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
433 if (ret != 0) |
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
434 return ret; |
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
435 } |
6117
f221641c262a
Make sure the http protocol handler returns errors if a delayed open had failed
mstorsjo
parents:
6115
diff
changeset
|
436 if (!s->hd) |
f221641c262a
Make sure the http protocol handler returns errors if a delayed open had failed
mstorsjo
parents:
6115
diff
changeset
|
437 return AVERROR(EIO); |
6103
447fe3440991
Modify the behaviour of http_open to implicitly delay connection establishment
mstorsjo
parents:
6080
diff
changeset
|
438 |
5526
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
439 if (s->chunksize == -1) { |
6152 | 440 /* non-chunked data is sent without any special encoding */ |
5527 | 441 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
|
442 } |
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
443 |
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
444 /* 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
|
445 * signal EOF */ |
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
446 if (size > 0) { |
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
447 /* upload data using chunked encoding */ |
6155 | 448 snprintf(temp, sizeof(temp), "%x\r\n", size); |
5526
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
449 |
6154
78f96a0ef08c
HTTP: Compact the code for writing chunked post data
mstorsjo
parents:
6153
diff
changeset
|
450 if ((ret = url_write(s->hd, temp, strlen(temp))) < 0 || |
78f96a0ef08c
HTTP: Compact the code for writing chunked post data
mstorsjo
parents:
6153
diff
changeset
|
451 (ret = url_write(s->hd, buf, size)) < 0 || |
78f96a0ef08c
HTTP: Compact the code for writing chunked post data
mstorsjo
parents:
6153
diff
changeset
|
452 (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
|
453 return ret; |
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
454 } |
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
455 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
|
456 } |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
457 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
458 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
|
459 { |
5526
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
460 int ret = 0; |
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
461 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
|
462 HTTPContext *s = h->priv_data; |
5526
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
463 |
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
464 /* signal end of chunked encoding if used */ |
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
465 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
|
466 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
|
467 ret = ret > 0 ? 0 : ret; |
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
468 } |
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
469 |
6107 | 470 if (s->hd) |
471 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
|
472 av_free(s); |
5526
f09594ca5f77
Use chunked encoding for HTTP uploads. Patch by Tomas H¸«£rdin
rbultje
parents:
5059
diff
changeset
|
473 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
|
474 } |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
475 |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3286
diff
changeset
|
476 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
|
477 { |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
478 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
|
479 URLContext *old_hd = s->hd; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3286
diff
changeset
|
480 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
|
481 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
|
482 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
|
483 |
6115 | 484 if (!s->init) { |
485 int ret = http_open_cnx(h); | |
486 if (ret != 0) | |
487 return ret; | |
488 } | |
6117
f221641c262a
Make sure the http protocol handler returns errors if a delayed open had failed
mstorsjo
parents:
6115
diff
changeset
|
489 if (!s->hd) |
f221641c262a
Make sure the http protocol handler returns errors if a delayed open had failed
mstorsjo
parents:
6115
diff
changeset
|
490 return AVERROR(EIO); |
6115 | 491 |
1822
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
492 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
|
493 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
|
494 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
|
495 return -1; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
496 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
497 /* 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
|
498 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
|
499 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
|
500 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
|
501 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
|
502 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
|
503 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
|
504 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
|
505 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
|
506 |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
507 /* 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
|
508 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
|
509 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
|
510 s->buf_ptr = s->buffer; |
fc48f8bfbf2e
restore old buffer content when seek failed in http protocol, fix issue #1631
bcoudurier
parents:
5527
diff
changeset
|
511 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
|
512 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
|
513 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
|
514 return -1; |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
515 } |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
516 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
|
517 return off; |
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 |
4640
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4630
diff
changeset
|
520 static int |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4630
diff
changeset
|
521 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
|
522 { |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4630
diff
changeset
|
523 HTTPContext *s = h->priv_data; |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4630
diff
changeset
|
524 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
|
525 } |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4630
diff
changeset
|
526 |
1822
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
527 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
|
528 "http", |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
529 http_open, |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
530 http_read, |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
531 http_write, |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
532 http_seek, |
2526fc1e568b
Reverting stray commit part II, r8156 had the base64 export patch mixed with the nutdec patch
lu_zero
parents:
diff
changeset
|
533 http_close, |
4640
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4630
diff
changeset
|
534 .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
|
535 }; |