[FFmpeg-devel] [PATCH] Add support for digest auth in the http and rtsp protocols
Martin Storsjö
martin
Thu Mar 25 22:52:06 CET 2010
On Thu, 25 Mar 2010, Ronald S. Bultje wrote:
> On Thu, Mar 25, 2010 at 5:08 PM, Martin Storsj? <martin at martin.st> wrote:
> > On Thu, 25 Mar 2010, Ronald S. Bultje wrote:
> >> On Thu, Mar 25, 2010 at 4:09 AM, Martin Storsj? <martin at martin.st> wrote:
> >> [..]
> >> > +static int find_method_and_url(char *buf, const char **method, const char **url)
> >> [..]
> >>
> >> As said on IRC, this is a little ugly, we're basically creating a line
> >> from elements and then splitting again.
> >>
> >> You can say no then I'll do it ;-), but we need to split this function
> >> a little so it takes (instead of just "cmd") a "method", "uri" and
> >> "cmd" (which is original cmd - method/uri), and then have
> >> ff_rtsp_send_cmd_with_content_async() construct the correct first
> >> line. Might not be ideal, but will prevent the having to split it
> >> again, which I personally consider ugly.
> >
> > Ok, tested this approach now.
> >
> > This requires a bit of modifications to all users of the rtsp_send_cmd
> > functions, but IMO it actually cleans some things up a little. And thanks
> > to this, the later patches become much more acceptable.
> [..]
> > @@ -1002,10 +1003,13 @@ void ff_rtsp_send_cmd_with_content_async(AVFormatContext *s,
> > char buf[4096], buf1[1024];
> >
> > rt->seq++;
> > - av_strlcpy(buf, cmd, sizeof(buf));
> > + snprintf(buf, sizeof(buf), "%s %s RTSP/1.0\r\n", method, url);
> > + if (headers)
> > + av_strlcat(buf, headers, sizeof(buf));
> > snprintf(buf1, sizeof(buf1), "CSeq: %d\r\n", rt->seq);
> > av_strlcat(buf, buf1, sizeof(buf));
> > - if (rt->session_id[0] != '\0' && !strstr(cmd, "\nIf-Match:")) {
> > + if (rt->session_id[0] != '\0' && (!headers ||
> > + !strstr(headers, "\nIf-Match:"))) {
> > snprintf(buf1, sizeof(buf1), "Session: %s\r\n", rt->session_id);
> > av_strlcat(buf, buf1, sizeof(buf));
> > }
>
> Completely irrelevant here, but can you change this (afterwards) to
> use av_strlcatf() instead of this buf1[] mess?
Will send such a patch soon. :-)
> > @@ -1365,9 +1366,7 @@ static int rtsp_setup_output_streams(AVFormatContext *s, const char *addr)
> >
> > /* Announce the stream */
> > snprintf(cmd, sizeof(cmd),
> > - "ANNOUNCE %s RTSP/1.0\r\n"
> > - "Content-Type: application/sdp\r\n",
> > - rt->control_uri);
> > + "Content-Type: application/sdp\r\n");
> > sdp = av_mallocz(8192);
> > if (sdp == NULL)
> > return AVERROR(ENOMEM);
> > @@ -1392,7 +1391,8 @@ static int rtsp_setup_output_streams(AVFormatContext *s, const char *addr)
> > return AVERROR_INVALIDDATA;
> > }
> > av_log(s, AV_LOG_INFO, "SDP:\n%s\n", sdp);
> > - ff_rtsp_send_cmd_with_content(s, cmd, reply, NULL, sdp, strlen(sdp));
> > + ff_rtsp_send_cmd_with_content(s, "ANNOUNCE", rt->control_uri, cmd,
> > + reply, NULL, sdp, strlen(sdp));
> > av_free(sdp);
> > if (reply->status_code != RTSP_STATUS_OK)
> > return AVERROR_INVALIDDATA;
>
> cmd is unneeded and can be removed.
>
> Rest for this patch OK, feel free to commit. Patch #2 is also OK.
Applied with these changes.
> For #3:
>
> > @@ -871,6 +872,12 @@ void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf)
> > } else if (av_stristart(p, "Location:", &p)) {
> > skip_spaces(&p);
> > av_strlcpy(reply->location, p , sizeof(reply->location));
> > + } else if (av_stristart(p, "WWW-Authenticate:", &p)) {
> > + skip_spaces(&p);
> > + ff_http_auth_handle_header(auth_state, "WWW-Authenticate", p);
> > + } else if (av_stristart(p, "Authentication-Info:", &p)) {
> > + skip_spaces(&p);
> > + ff_http_auth_handle_header(auth_state, "Authentication-Info", p);
> > }
> > }
>
> This needs an if (auth_state), else it'll crash for ffserver. Can be
> committed with that modification.
>
> Patch #4 is OK then.
Applied with these modifications. Hooray \o/
// Martin
More information about the ffmpeg-devel
mailing list