summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2010-03-25 21:47:33 +0000
committerMartin Storsjö <martin@martin.st>2010-03-25 21:47:33 +0000
commitaa8bf2fb8062880e02c0b8ffeb3bd5fce0753733 (patch)
tree6748e4ac3bc4ad7306ecdf523c85c8a245d80b0d
parentb17d11c6329848b6f6e3af90baf2bcf044275ce9 (diff)
Make RTSP use the generic http authentication code
Still hardcoded to use Basic auth, without parsing the reply headers Originally committed as revision 22676 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavformat/Makefile4
-rw-r--r--libavformat/rtsp.c22
-rw-r--r--libavformat/rtsp.h8
3 files changed, 17 insertions, 17 deletions
diff --git a/libavformat/Makefile b/libavformat/Makefile
index 0832155c32..79430982da 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -215,8 +215,8 @@ OBJS-$(CONFIG_RTP_MUXER) += rtp.o \
rtpenc.o \
rtpenc_h264.o \
avc.o
-OBJS-$(CONFIG_RTSP_DEMUXER) += rtsp.o
-OBJS-$(CONFIG_RTSP_MUXER) += rtsp.o rtspenc.o
+OBJS-$(CONFIG_RTSP_DEMUXER) += rtsp.o httpauth.o
+OBJS-$(CONFIG_RTSP_MUXER) += rtsp.o rtspenc.o httpauth.o
OBJS-$(CONFIG_SDP_DEMUXER) += rtsp.o \
rdt.o \
rtp.o \
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index c5502bbed4..231795a31f 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -612,7 +612,6 @@ void ff_rtsp_close_streams(AVFormatContext *s)
av_close_input_stream (rt->asf_ctx);
rt->asf_ctx = NULL;
}
- av_freep(&rt->auth_b64);
}
static void *rtsp_rtp_mux_open(AVFormatContext *s, AVStream *st,
@@ -1013,10 +1012,13 @@ void ff_rtsp_send_cmd_with_content_async(AVFormatContext *s,
snprintf(buf1, sizeof(buf1), "Session: %s\r\n", rt->session_id);
av_strlcat(buf, buf1, sizeof(buf));
}
- if (rt->auth_b64)
- av_strlcatf(buf, sizeof(buf),
- "Authorization: Basic %s\r\n",
- rt->auth_b64);
+ if (rt->auth[0]) {
+ char *str = ff_http_auth_create_response(&rt->auth_state,
+ rt->auth, url, method);
+ if (str)
+ av_strlcat(buf, str, sizeof(buf));
+ av_free(str);
+ }
if (send_content_length > 0 && send_content)
av_strlcatf(buf, sizeof(buf), "Content-Length: %d\r\n", send_content_length);
av_strlcat(buf, "\r\n", sizeof(buf));
@@ -1437,14 +1439,8 @@ redirect:
ff_url_split(NULL, 0, auth, sizeof(auth),
host, sizeof(host), &port, path, sizeof(path), s->filename);
if (*auth) {
- int auth_len = strlen(auth), b64_len = ((auth_len + 2) / 3) * 4 + 1;
-
- if (!(rt->auth_b64 = av_malloc(b64_len)))
- return AVERROR(ENOMEM);
- if (!av_base64_encode(rt->auth_b64, b64_len, auth, auth_len)) {
- err = AVERROR(EINVAL);
- goto fail;
- }
+ av_strlcpy(rt->auth, auth, sizeof(rt->auth));
+ rt->auth_state.auth_type = HTTP_AUTH_BASIC;
}
if (port < 0)
port = RTSP_DEFAULT_PORT;
diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h
index d317eee44b..e9625bc65d 100644
--- a/libavformat/rtsp.h
+++ b/libavformat/rtsp.h
@@ -26,6 +26,7 @@
#include "rtspcodes.h"
#include "rtpdec.h"
#include "network.h"
+#include "httpauth.h"
/**
* Network layer over which RTP/etc packet data will be transported.
@@ -232,8 +233,11 @@ typedef struct RTSPState {
* of RTSPMessageHeader->real_challenge */
enum RTSPServerType server_type;
- /** base64-encoded authorization lines (username:password) */
- char *auth_b64;
+ /** plaintext authorization line (username:password) */
+ char auth[128];
+
+ /** authentication state */
+ HTTPAuthState auth_state;
/** The last reply of the server to a RTSP command */
char last_reply[2048]; /* XXX: allocate ? */