[Live-devel] [PATCH] Allow streaming from subdirectories

Mike Williams mike at mikebwilliams.com
Wed Jul 27 07:44:29 PDT 2011


This patch modifies the parseRTSPRequestString section to return the
entire string between the first / after the host:port and the urlSuffix
section. It then conditionally pieces these together based on the request
type to handle the fact that SETUP requests have track information appended.

Signed-off-by: Mike Williams <mike at mikebwilliams.com>
---
 liveMedia/RTSPCommon.cpp |   11 +++--------
 liveMedia/RTSPServer.cpp |   40 ++++++++++++++++++++++++++--------------
 2 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/liveMedia/RTSPCommon.cpp b/liveMedia/RTSPCommon.cpp
index dbc16fc..f872d2e 100644
--- a/liveMedia/RTSPCommon.cpp
+++ b/liveMedia/RTSPCommon.cpp
@@ -92,15 +92,10 @@ Boolean parseRTSPRequestString(char const* reqStr,
       while (k2 <= k) resultURLSuffix[n++] = reqStr[k2++];
       resultURLSuffix[n] = '\0';
 
-      // Also look for the URL 'pre-suffix' before this:
-      unsigned k3 = (k1 == 0) ? 0 : --k1;
-      while (k3 > i && reqStr[k3] != '/') --k3;
-      // the URL pre-suffix comes from [k3+1,k1]
-
       // Copy "resultURLPreSuffix":
-      if (k1 - k3 + 1 > resultURLPreSuffixMaxSize) return False; // there's no room
-      n = 0; k2 = k3+1;
-      while (k2 <= k1) resultURLPreSuffix[n++] = reqStr[k2++];
+      if (k1 - i + 1> resultURLPreSuffixMaxSize) return False; // there's no room
+      n = 0; k2 = i + 1;
+      while (k2 <= k1 - 1) resultURLPreSuffix[n++] = reqStr[k2++];
       resultURLPreSuffix[n] = '\0';
 
       i = k + 7; // to go past " RTSP/"
diff --git a/liveMedia/RTSPServer.cpp b/liveMedia/RTSPServer.cpp
index dcb2086..4b4650f 100644
--- a/liveMedia/RTSPServer.cpp
+++ b/liveMedia/RTSPServer.cpp
@@ -449,21 +449,33 @@ void RTSPServer::RTSPClientSession::handleRequestBytes(int newBytesRead) {
     // If there was a "Content-Length:" header, then make sure we've received all of the data that it specified:
     if (ptr + newBytesRead < tmpPtr + 2 + contentLength) return; // we still need more data; subsequent reads will give it to us 
 
-    if (strcmp(cmdName, "OPTIONS") == 0) {
-      handleCmd_OPTIONS(cseq);
-    } else if (strcmp(cmdName, "DESCRIBE") == 0) {
-      handleCmd_DESCRIBE(cseq, urlSuffix, (char const*)fRequestBuffer);
-    } else if (strcmp(cmdName, "SETUP") == 0) {
-      handleCmd_SETUP(cseq, urlPreSuffix, urlSuffix, (char const*)fRequestBuffer);
-    } else if (strcmp(cmdName, "TEARDOWN") == 0
-	       || strcmp(cmdName, "PLAY") == 0
-	       || strcmp(cmdName, "PAUSE") == 0
-	       || strcmp(cmdName, "GET_PARAMETER") == 0
-	       || strcmp(cmdName, "SET_PARAMETER") == 0) {
-      handleCmd_withinSession(cmdName, urlPreSuffix, urlSuffix, cseq,
-			      (char const*)fRequestBuffer);
+    char urlTotalSuffix[RTSP_PARAM_STRING_MAX] = {0};
+    if (strlen(urlPreSuffix) + strlen(urlSuffix) + 2 > RTSP_PARAM_STRING_MAX) {
+      handleCmd_bad(cseq);
     } else {
-      handleCmd_notSupported(cseq);
+
+      if (urlPreSuffix[0] != '\0') {
+        strcat(urlTotalSuffix, urlPreSuffix);
+        strcat(urlTotalSuffix, "/");
+      }
+      strcat(urlTotalSuffix, urlSuffix);
+
+      if (strcmp(cmdName, "OPTIONS") == 0) {
+        handleCmd_OPTIONS(cseq);
+      } else if (strcmp(cmdName, "DESCRIBE") == 0) {
+        handleCmd_DESCRIBE(cseq, urlTotalSuffix, (char const*)fRequestBuffer);
+      } else if (strcmp(cmdName, "SETUP") == 0) {
+        handleCmd_SETUP(cseq, urlPreSuffix, urlSuffix, (char const*)fRequestBuffer);
+      } else if (strcmp(cmdName, "TEARDOWN") == 0
+              || strcmp(cmdName, "PLAY") == 0
+              || strcmp(cmdName, "PAUSE") == 0
+              || strcmp(cmdName, "GET_PARAMETER") == 0
+              || strcmp(cmdName, "SET_PARAMETER") == 0) {
+        handleCmd_withinSession(cmdName, urlPreSuffix, urlSuffix, cseq,
+                                (char const*)fRequestBuffer);
+      } else {
+        handleCmd_notSupported(cseq);
+      }
     }
   } else {
 #ifdef DEBUG
-- 
1.7.3.4



More information about the live-devel mailing list