<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=koi8-r">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:2.0cm 42.5pt 2.0cm 3.0cm;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="RU" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Hello,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I found some behavior in proxyServer that might be a bug. It can be reproduced on latest version on live555 library.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">If I specify username and password with -u command line argument then<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">OPTIONS keepalive request is sent without Authorization header.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">And  subsequent requests (e.g. PAUSE or TEARDOWN) are also sent without authorization info.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">If server requires every request to be authorized than such request breaks session.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">If I supply username and password in the url then OPTIONS request is sent with Authorization header and
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">everything works fine.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I have found that described behavior could be caused by next lines of code:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                unsigned RTSPClient::sendOptionsCommand(responseHandler* responseHandler, Authenticator* authenticator) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                  if (authenticator != NULL) fCurrentAuthenticator = *authenticator;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                  return sendRequest(new RequestRecord(++fCSeq, "OPTIONS", responseHandler));<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">If username and password are supplied with -u command line argument then authenticator passed to this  method is not null<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">and it replaces valid (filled with realm, nonce etc.) fCurrentAuthenticator.
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Suggested fix is to replace if statement with<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">similarly to other send... methods of RTSPClient. But I am not sure this is the best way to handle this situation.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Is there a reason to handle OPTIONS request differently of other requests?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Here is rtsp exchange:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Request: DESCRIBE rtsp://10.41.170.250:554/PSIA/streaming/channels/102 RTSP/1.0\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    CSeq: 86\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    User-Agent: ProxyRTSPClient (LIVE555 Streaming Media v2018.12.14)\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Accept: application/sdp\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    \r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Response: RTSP/1.0 401 Unauthorized\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    CSeq: 86\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    WWW-Authenticate: Digest realm="9d321e21c4dd9bd63b1a80bd", nonce="867e523c35", algorithm="MD5"\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    WWW-Authenticate: Basic realm="/"\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    \r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Request: DESCRIBE rtsp://10.41.170.250:554/PSIA/streaming/channels/102 RTSP/1.0\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    CSeq: 87\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Authorization: Digest username="admin", realm="9d321e21c4dd9bd63b1a80bd", nonce="867e523c35", uri="rtsp://10.41.170.250:554/PSIA/streaming/channels/102", response="01e817521210b74227b60711cf079ca4"\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    User-Agent: ProxyRTSPClient (LIVE555 Streaming Media v2018.12.14)\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Accept: application/sdp\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    \r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Response: RTSP/1.0 200 OK\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    CSeq: 87\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Content-type: application/sdp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Content-length: 518<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Date: Thu, 23 Apr 2020 09:22:37 GMT\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    \r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Session Description Protocol<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Request: SETUP rtsp://10.41.170.250:554/PSIA/streaming/channels/102/trackID=video RTSP/1.0\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    CSeq: 88\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Authorization: Digest username="admin", realm="9d321e21c4dd9bd63b1a80bd", nonce="867e523c35", uri="rtsp://10.41.170.250:554/PSIA/streaming/channels/102", response="197123fa4219c96a2e4b8d7ade28f3a4"\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    User-Agent: ProxyRTSPClient (LIVE555 Streaming Media v2018.12.14)\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Transport: RTP/AVP/TCP;unicast;interleaved=28-29<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    \r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Response: RTSP/1.0 200 OK\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Session: 258361686;timeout=60<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Transport: RTP/AVP/TCP;unicast;interleaved=28-29;ssrc=f664956<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    CSeq: 88\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Accept-Ranges: NPT\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Media-Properties: No-Seeking, Time-Progressing, Time-Duration=0\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Date: Thu, 23 Apr 2020 09:22:38 GMT\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    \r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Request: PLAY rtsp://10.41.170.250:554/PSIA/streaming/channels/102 RTSP/1.0\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    CSeq: 89\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Authorization: Digest username="admin", realm="9d321e21c4dd9bd63b1a80bd", nonce="867e523c35", uri="rtsp://10.41.170.250:554/PSIA/streaming/channels/102", response="e11c9fb29d110e853a5ea54402114bd4"\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    User-Agent: ProxyRTSPClient (LIVE555 Streaming Media v2018.12.14)\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Session: 258361686<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    \r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Response: RTSP/1.0 200 OK\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Session: 258361686<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    CSeq: 89\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Date: Thu, 23 Apr 2020 09:22:38 GMT\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    \r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Request: OPTIONS rtsp://10.41.170.250:554/PSIA/streaming/channels/102 RTSP/1.0\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    CSeq: 90\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    User-Agent: ProxyRTSPClient (LIVE555 Streaming Media v2018.12.14)\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Session: 258361686<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    \r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Request: TEARDOWN rtsp://10.41.170.250:554/PSIA/streaming/channels/102 RTSP/1.0\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    CSeq: 91\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    User-Agent: ProxyRTSPClient (LIVE555 Streaming Media v2018.12.14)\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Session: 258361686<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    \r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    Response: RTSP/1.0 401 Unauthorized\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    CSeq: 91\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    WWW-Authenticate: Digest realm="9d321e21c4dd9bd63b1a80bd", nonce="913dd31768", algorithm="MD5"\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    WWW-Authenticate: Basic realm="/"\r\n<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    </span>\r\n<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks<span lang="EN-US">,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Alexander Prokhorov<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
</div>
</body>
</html>