Source: http://git.videolan.org/?p=vlc/vlc-3.0.git;a=blob;f=contrib/src/live555/expose_server_string.patch
live555: expose Server header

diff -Naur live555/liveMedia/include/RTSPClient.hh live555.modified/liveMedia/include/RTSPClient.hh
--- live555/liveMedia/include/RTSPClient.hh	2017-11-30 19:34:25.210638324 +0100
+++ live555.modified/liveMedia/include/RTSPClient.hh	2017-11-30 19:32:06.322693792 +0100
@@ -36,6 +36,8 @@
 #endif
 #endif
 
+#define VLC_PATCH_RTSPCLIENT_SERVERSTRING
+
 class RTSPClient: public Medium {
 public:
   static RTSPClient* createNew(UsageEnvironment& env, char const* rtspURL,
@@ -186,6 +188,7 @@
   unsigned sessionTimeoutParameter() const { return fSessionTimeoutParameter; }
 
   char const* url() const { return fBaseURL; }
+  char const* serverString() const { return fserverString; }
 
   static unsigned responseBufferSize;
 
@@ -238,6 +241,7 @@
 
   void reset();
   void setBaseURL(char const* url);
+  void setServerString(char const* str);
   int grabSocket(); // allows a subclass to reuse our input socket, so that it won't get closed when we're deleted
   virtual unsigned sendRequest(RequestRecord* request);
   virtual Boolean setRequestFields(RequestRecord* request,
@@ -334,6 +338,7 @@
   unsigned fUserAgentHeaderStrLen;
   int fInputSocketNum, fOutputSocketNum;
   char* fBaseURL;
+  char *fserverString;
   unsigned char fTCPStreamIdCount; // used for (optional) RTP/TCP
   char* fLastSessionId;
   unsigned fSessionTimeoutParameter; // optionally set in response "Session:" headers
diff -Naur live555/liveMedia/RTSPClient.cpp live555.modified/liveMedia/RTSPClient.cpp
--- live555/liveMedia/RTSPClient.cpp	2017-11-30 19:34:25.210638324 +0100
+++ live555.modified/liveMedia/RTSPClient.cpp	2017-11-30 19:28:18.691423659 +0100
@@ -366,7 +366,7 @@
     fAllowBasicAuthentication(True), fServerAddress(0),
     fTunnelOverHTTPPortNum(tunnelOverHTTPPortNum),
     fUserAgentHeaderStr(NULL), fUserAgentHeaderStrLen(0),
-    fInputSocketNum(-1), fOutputSocketNum(-1), fBaseURL(NULL), fTCPStreamIdCount(0),
+    fInputSocketNum(-1), fOutputSocketNum(-1), fBaseURL(NULL), fserverString(NULL), fTCPStreamIdCount(0),
     fLastSessionId(NULL), fSessionTimeoutParameter(0), fSessionCookieCounter(0), fHTTPTunnelingConnectionIsPending(False) {
   setBaseURL(rtspURL);
 
@@ -416,6 +416,7 @@
   fServerAddress = 0;
 
   setBaseURL(NULL);
+  setServerString(NULL);
 
   fCurrentAuthenticator.reset();
 
@@ -426,6 +427,10 @@
   delete[] fBaseURL; fBaseURL = strDup(url);
 }
 
+void RTSPClient::setServerString(char const* str) {
+  delete[] fserverString; fserverString = strDup(str);
+}
+
 int RTSPClient::grabSocket() {
   int inputSocket = fInputSocketNum;
   fInputSocketNum = -1;
@@ -1655,6 +1660,7 @@
     char const* rtpInfoParamsStr = NULL;
     char const* wwwAuthenticateParamsStr = NULL;
     char const* publicParamsStr = NULL;
+    char const* serverStr = NULL;
     char* bodyStart = NULL;
     unsigned numBodyBytes = 0;
     responseSuccess = False;
@@ -1725,6 +1731,8 @@
 	} else if (checkForHeader(lineStart, "Transport:", 10, transportParamsStr)) {
 	} else if (checkForHeader(lineStart, "Scale:", 6, scaleParamsStr)) {
 	} else if (checkForHeader(lineStart, "Speed:", 6, speedParamsStr)) {
+    } else if (checkForHeader(lineStart, "Server:", 7, serverStr)) {
+        setServerString(serverStr);
 	} else if (checkForHeader(lineStart, "Range:", 6, rangeParamsStr)) {
 	} else if (checkForHeader(lineStart, "RTP-Info:", 9, rtpInfoParamsStr)) {
 	} else if (checkForHeader(lineStart, "WWW-Authenticate:", 17, headerParamsStr)) {
