summaryrefslogtreecommitdiff
path: root/libavformat/http.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-03-14 02:04:18 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-03-14 02:10:11 +0100
commit6968a7d1938cc009bad7a971f26d85ed271747ef (patch)
treeeb106dfbdfe9a7bc9d7fe53ead7b56c725d406fe /libavformat/http.c
parentc2e3b564b32d596f5a66d47409f9e07a067a3084 (diff)
parent972880f597d74673a04d3ea8540864ae715ce9a6 (diff)
Merge remote-tracking branch 'qatar/master'
* qatar/master: doc/general: update supported devices table. doc/general: add missing @tab to codecs table. h264: Fix invalid interlaced/progressive MB combinations for direct mode prediction. avconv: reindent avconv: link '-passlogfile' option to libx264 'stats' AVOption. libx264: add 'stats' private option for setting 2pass stats filename. libx264: fix help text for slice-max-size option. http: Clear the auth state on redirects http: Retry auth if it failed due to being stale rtsp: Resend new keepalive commands if they used stale auth rtsp: Retry authentication if failed due to being stale httpauth: Parse the stale field in digest auth dxva2_vc1: pass the overlap flag to the decoder dxva2_vc1: fix decoding of BI frames FATE: add shorthand to wavpack test dfa: convert to bytestream2 API anm decoder: move buffer allocation from decode_init() to decode_frame() h264: improve parsing of broken AVC SPS Conflicts: ffmpeg.c libavcodec/anm.c libavcodec/dfa.c libavcodec/h264.c libavcodec/h264_direct.c libavcodec/h264_ps.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/http.c')
-rw-r--r--libavformat/http.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/libavformat/http.c b/libavformat/http.c
index 8922a74441..2589a8ffb9 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -96,7 +96,7 @@ static int http_open_cnx(URLContext *h)
char auth[1024], proxyauth[1024] = "";
char path1[1024];
char buf[1024], urlbuf[1024];
- int port, use_proxy, err, location_changed = 0, redirects = 0;
+ int port, use_proxy, err, location_changed = 0, redirects = 0, attempts = 0;
HTTPAuthType cur_auth_type, cur_proxy_auth_type;
HTTPContext *s = h->priv_data;
URLContext *hd = NULL;
@@ -148,16 +148,18 @@ static int http_open_cnx(URLContext *h)
cur_proxy_auth_type = s->auth_state.auth_type;
if (http_connect(h, path, local_path, hoststr, auth, proxyauth, &location_changed) < 0)
goto fail;
+ attempts++;
if (s->http_code == 401) {
- if (cur_auth_type == HTTP_AUTH_NONE && s->auth_state.auth_type != HTTP_AUTH_NONE) {
+ if ((cur_auth_type == HTTP_AUTH_NONE || s->auth_state.stale) &&
+ s->auth_state.auth_type != HTTP_AUTH_NONE && attempts < 4) {
ffurl_close(hd);
goto redo;
} else
goto fail;
}
if (s->http_code == 407) {
- if (cur_proxy_auth_type == HTTP_AUTH_NONE &&
- s->proxy_auth_state.auth_type != HTTP_AUTH_NONE) {
+ if ((cur_proxy_auth_type == HTTP_AUTH_NONE || s->proxy_auth_state.stale) &&
+ s->proxy_auth_state.auth_type != HTTP_AUTH_NONE && attempts < 4) {
ffurl_close(hd);
goto redo;
} else
@@ -169,6 +171,10 @@ static int http_open_cnx(URLContext *h)
ffurl_close(hd);
if (redirects++ >= MAX_REDIRECTS)
return AVERROR(EIO);
+ /* Restart the authentication process with the new target, which
+ * might use a different auth mechanism. */
+ memset(&s->auth_state, 0, sizeof(s->auth_state));
+ attempts = 0;
location_changed = 0;
goto redo;
}
@@ -602,7 +608,7 @@ static int http_proxy_open(URLContext *h, const char *uri, int flags)
char hostname[1024], hoststr[1024];
char auth[1024], pathbuf[1024], *path;
char line[1024], lower_url[100];
- int port, ret = 0;
+ int port, ret = 0, attempts = 0;
HTTPAuthType cur_auth_type;
char *authstr;
@@ -669,8 +675,10 @@ redo:
break;
s->line_count++;
}
- if (s->http_code == 407 && cur_auth_type == HTTP_AUTH_NONE &&
- s->proxy_auth_state.auth_type != HTTP_AUTH_NONE) {
+ attempts++;
+ if (s->http_code == 407 &&
+ (cur_auth_type == HTTP_AUTH_NONE || s->proxy_auth_state.stale) &&
+ s->proxy_auth_state.auth_type != HTTP_AUTH_NONE && attempts < 2) {
ffurl_close(s->hd);
s->hd = NULL;
goto redo;