Commit 1d2136be authored by lu_zero's avatar lu_zero

Support 3xx redirection in rtsp

All the error codes 3xx got managed the same way.
After setup/early play redirection will not be managed
REDIRECT method is yet to be supported (if somebody knows a server implementing
it please contact me)



git-svn-id: file:///var/local/repositories/ffmpeg/trunk@20369 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 7291266e
...@@ -704,6 +704,9 @@ void rtsp_parse_line(RTSPMessageHeader *reply, const char *buf) ...@@ -704,6 +704,9 @@ void rtsp_parse_line(RTSPMessageHeader *reply, const char *buf)
} else if (av_stristart(p, "Notice:", &p) || } else if (av_stristart(p, "Notice:", &p) ||
av_stristart(p, "X-Notice:", &p)) { av_stristart(p, "X-Notice:", &p)) {
reply->notice = strtol(p, NULL, 10); reply->notice = strtol(p, NULL, 10);
} else if (av_stristart(p, "Location:", &p)) {
skip_spaces(&p);
av_strlcpy(reply->location, p , sizeof(reply->location));
} }
} }
...@@ -1180,7 +1183,7 @@ static int rtsp_read_header(AVFormatContext *s, ...@@ -1180,7 +1183,7 @@ static int rtsp_read_header(AVFormatContext *s,
unsigned char *content = NULL; unsigned char *content = NULL;
int lower_transport_mask = 0; int lower_transport_mask = 0;
char real_challenge[64]; char real_challenge[64];
redirect:
/* extract hostname and port */ /* extract hostname and port */
url_split(NULL, 0, auth, sizeof(auth), url_split(NULL, 0, auth, sizeof(auth),
host, sizeof(host), &port, path, sizeof(path), s->filename); host, sizeof(host), &port, path, sizeof(path), s->filename);
...@@ -1338,6 +1341,13 @@ static int rtsp_read_header(AVFormatContext *s, ...@@ -1338,6 +1341,13 @@ static int rtsp_read_header(AVFormatContext *s,
av_freep(&content); av_freep(&content);
url_close(rt->rtsp_hd); url_close(rt->rtsp_hd);
av_freep(&rt->auth_b64); av_freep(&rt->auth_b64);
if (reply->status_code >=300 && reply->status_code < 400) {
av_strlcpy(s->filename, reply->location, sizeof(s->filename));
av_log(s, AV_LOG_INFO, "Status %d: Redirecting to %s\n",
reply->status_code,
s->filename);
goto redirect;
}
return err; return err;
} }
......
...@@ -121,6 +121,10 @@ typedef struct RTSPMessageHeader { ...@@ -121,6 +121,10 @@ typedef struct RTSPMessageHeader {
* should be re-transmitted by the client in every RTSP command. */ * should be re-transmitted by the client in every RTSP command. */
char session_id[512]; char session_id[512];
/** the "Location:" field. This value is used to handle redirection.
*/
char location[4096];
/** the "RealChallenge1:" field from the server */ /** the "RealChallenge1:" field from the server */
char real_challenge[64]; char real_challenge[64];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment