Added automatic User-Agent stream tagging
This commit is contained in:
		
							parent
							
								
									d0912c9d00
								
							
						
					
					
						commit
						9ddfa97148
					
				
					 8 changed files with 33 additions and 4 deletions
				
			
		|  | @ -67,6 +67,7 @@ namespace Mist{ | ||||||
|     lastStats = 0; |     lastStats = 0; | ||||||
|     maxSkipAhead = 7500; |     maxSkipAhead = 7500; | ||||||
|     minSkipAhead = 5000; |     minSkipAhead = 5000; | ||||||
|  |     uaDelay = 10; | ||||||
|     realTime = 1000; |     realTime = 1000; | ||||||
|     lastRecv = Util::epoch(); |     lastRecv = Util::epoch(); | ||||||
|     if (myConn){ |     if (myConn){ | ||||||
|  | @ -1207,6 +1208,17 @@ namespace Mist{ | ||||||
|       }else{ |       }else{ | ||||||
|         tmpEx.lastSecond(0); |         tmpEx.lastSecond(0); | ||||||
|       } |       } | ||||||
|  |       /*LTS-START*/ | ||||||
|  |       //Tag the session with the user agent
 | ||||||
|  |       static bool newUA = true;//we only do this once per connection
 | ||||||
|  |       if (newUA && ((now - myConn.connTime()) >= uaDelay || !myConn) && UA.size()){ | ||||||
|  |         std::string APIcall = "{\"tag_sessid\":{\"" + tmpEx.getSessId() + "\":" + JSON::string_escape("UA:"+UA) + "}}"; | ||||||
|  |         Socket::UDPConnection uSock; | ||||||
|  |         uSock.SetDestination("localhost", 4242); | ||||||
|  |         uSock.SendNow(APIcall); | ||||||
|  |         newUA = false; | ||||||
|  |       } | ||||||
|  |       /*LTS-END*/ | ||||||
|       statsPage.keepAlive(); |       statsPage.keepAlive(); | ||||||
|     } |     } | ||||||
|     doSync(); |     doSync(); | ||||||
|  |  | ||||||
|  | @ -100,6 +100,8 @@ namespace Mist { | ||||||
|       bool sought;///<If a seek has been done, this is set to true. Used for seeking on prepareNext().
 |       bool sought;///<If a seek has been done, this is set to true. Used for seeking on prepareNext().
 | ||||||
|     protected://these are to be messed with by child classes
 |     protected://these are to be messed with by child classes
 | ||||||
|       bool pushing; |       bool pushing; | ||||||
|  |       std::string UA; ///< User Agent string, if known.
 | ||||||
|  |       uint16_t uaDelay;///<Seconds to wait before setting the UA.
 | ||||||
|       uint64_t lastRecv; |       uint64_t lastRecv; | ||||||
|       long long unsigned int firstTime;///< Time of first packet after last seek. Used for real-time sending.
 |       long long unsigned int firstTime;///< Time of first packet after last seek. Used for real-time sending.
 | ||||||
|       virtual std::string getConnectedHost(); |       virtual std::string getConnectedHost(); | ||||||
|  |  | ||||||
|  | @ -8,7 +8,10 @@ | ||||||
| #include <iomanip> | #include <iomanip> | ||||||
| 
 | 
 | ||||||
| namespace Mist { | namespace Mist { | ||||||
|   OutDashMP4::OutDashMP4(Socket::Connection & conn) : HTTPOutput(conn){realTime = 0;} |   OutDashMP4::OutDashMP4(Socket::Connection & conn) : HTTPOutput(conn){ | ||||||
|  |     uaDelay = 0; | ||||||
|  |     realTime = 0; | ||||||
|  |   } | ||||||
|   OutDashMP4::~OutDashMP4(){} |   OutDashMP4::~OutDashMP4(){} | ||||||
|    |    | ||||||
|   std::string OutDashMP4::makeTime(uint64_t time){ |   std::string OutDashMP4::makeTime(uint64_t time){ | ||||||
|  |  | ||||||
|  | @ -131,6 +131,8 @@ namespace Mist { | ||||||
|   } //BuildManifest
 |   } //BuildManifest
 | ||||||
|    |    | ||||||
|   OutHDS::OutHDS(Socket::Connection & conn) : HTTPOutput(conn) { |   OutHDS::OutHDS(Socket::Connection & conn) : HTTPOutput(conn) { | ||||||
|  |     uaDelay = 0; | ||||||
|  |     realTime = 0; | ||||||
|     audioTrack = 0; |     audioTrack = 0; | ||||||
|     playUntil = 0; |     playUntil = 0; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -258,6 +258,7 @@ namespace Mist { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|   OutHLS::OutHLS(Socket::Connection & conn) : TSOutput(conn) { |   OutHLS::OutHLS(Socket::Connection & conn) : TSOutput(conn) { | ||||||
|  |     uaDelay = 0; | ||||||
|     realTime = 0; |     realTime = 0; | ||||||
|     until=0xFFFFFFFFFFFFFFFFull; |     until=0xFFFFFFFFFFFFFFFFull; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -46,7 +46,10 @@ std::string toUTF16(std::string original) { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| namespace Mist { | namespace Mist { | ||||||
|   OutHSS::OutHSS(Socket::Connection & conn) : HTTPOutput(conn){realTime = 0;} |   OutHSS::OutHSS(Socket::Connection & conn) : HTTPOutput(conn){ | ||||||
|  |     uaDelay = 0; | ||||||
|  |     realTime = 0; | ||||||
|  |   } | ||||||
|   OutHSS::~OutHSS(){} |   OutHSS::~OutHSS(){} | ||||||
| 
 | 
 | ||||||
|   void OutHSS::init(Util::Config * cfg) { |   void OutHSS::init(Util::Config * cfg) { | ||||||
|  |  | ||||||
|  | @ -213,6 +213,9 @@ namespace Mist { | ||||||
|    |    | ||||||
|   void HTTPOutput::onRequest(){ |   void HTTPOutput::onRequest(){ | ||||||
|     while (H.Read(myConn)){ |     while (H.Read(myConn)){ | ||||||
|  |       if (H.hasHeader("User-Agent")){ | ||||||
|  |         UA = H.GetHeader("User-Agent"); | ||||||
|  |       } | ||||||
|       if (hasSessionIDs()){ |       if (hasSessionIDs()){ | ||||||
|         if (H.GetVar("sessId").size()){ |         if (H.GetVar("sessId").size()){ | ||||||
|           std::string ua = H.GetVar("sessId"); |           std::string ua = H.GetVar("sessId"); | ||||||
|  | @ -222,8 +225,8 @@ namespace Mist { | ||||||
|           crc = checksum::crc32(0, ua.data(), ua.size()); |           crc = checksum::crc32(0, ua.data(), ua.size()); | ||||||
|         } |         } | ||||||
|       }else{ |       }else{ | ||||||
|         std::string ua = H.GetHeader("User-Agent") + H.GetHeader("X-Playback-Session-Id"); |         std::string mixed_ua = UA + H.GetHeader("X-Playback-Session-Id"); | ||||||
|         crc = checksum::crc32(0, ua.data(), ua.size()); |         crc = checksum::crc32(0, mixed_ua.data(), mixed_ua.size()); | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       INFO_MSG("Received request %s", H.getUrl().c_str()); |       INFO_MSG("Received request %s", H.getUrl().c_str()); | ||||||
|  |  | ||||||
|  | @ -597,6 +597,9 @@ namespace Mist { | ||||||
|       if (amfData.getContentP(2)->getContentP("objectEncoding")) { |       if (amfData.getContentP(2)->getContentP("objectEncoding")) { | ||||||
|         objencoding = amfData.getContentP(2)->getContentP("objectEncoding")->NumValue(); |         objencoding = amfData.getContentP(2)->getContentP("objectEncoding")->NumValue(); | ||||||
|       } |       } | ||||||
|  |       if (amfData.getContentP(2)->getContentP("flashVer")) { | ||||||
|  |         UA = amfData.getContentP(2)->getContentP("flashVer")->StrValue(); | ||||||
|  |       } | ||||||
|       app_name = amfData.getContentP(2)->getContentP("tcUrl")->StrValue(); |       app_name = amfData.getContentP(2)->getContentP("tcUrl")->StrValue(); | ||||||
|       reqUrl = app_name;//LTS
 |       reqUrl = app_name;//LTS
 | ||||||
|       app_name = app_name.substr(app_name.find('/', 7) + 1); |       app_name = app_name.substr(app_name.find('/', 7) + 1); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Thulinma
						Thulinma