From b325ca96ee7a194c2f5ed553fbfda09de250bd96 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Thu, 23 Oct 2014 15:12:33 +0200 Subject: [PATCH] Added checksum to stats of HTTP based outputs for later merging of connections. --- src/controller/controller_statistics.cpp | 7 ++++++- src/controller/controller_statistics.h | 1 + src/output/output.cpp | 4 +++- src/output/output.h | 1 + src/output/output_hds.cpp | 3 ++- src/output/output_hls.cpp | 2 ++ src/output/output_hss.cpp | 3 +++ src/output/output_httpts.cpp | 2 ++ src/output/output_json.cpp | 3 +++ src/output/output_progressive_flv.cpp | 3 +++ src/output/output_progressive_mp3.cpp | 3 +++ src/output/output_progressive_mp4.cpp | 3 +++ src/output/output_srt.cpp | 3 +++ 13 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/controller/controller_statistics.cpp b/src/controller/controller_statistics.cpp index 7d59b41d..4ef0ba11 100644 --- a/src/controller/controller_statistics.cpp +++ b/src/controller/controller_statistics.cpp @@ -15,6 +15,7 @@ #define STAT_CLI_UP 64 #define STAT_CLI_BPS_DOWN 128 #define STAT_CLI_BPS_UP 256 +#define STAT_CLI_CRC 512 #define STAT_CLI_ALL 0xFFFF // These are used to store "totals" field requests in a bitfield for speedup. #define STAT_TOT_CLIENTS 1 @@ -31,7 +32,7 @@ std::map Controller::curConns;///is_active){ //parse current users statServer.parseEach(parseStatistics); @@ -63,6 +64,7 @@ void Controller::statStorage::update(IPC::statExchange & data) { if (!connector.size()){ connector = data.connector(); } + crc = data.crc(); statLog tmp; tmp.time = data.time(); tmp.lastSecond = data.lastSecond(); @@ -193,6 +195,7 @@ void Controller::fillClients(JSON::Value & req, JSON::Value & rep){ if (fields & STAT_CLI_UP){rep["fields"].append("up");} if (fields & STAT_CLI_BPS_DOWN){rep["fields"].append("downbps");} if (fields & STAT_CLI_BPS_UP){rep["fields"].append("upbps");} + if (fields & STAT_CLI_CRC){rep["fields"].append("crc");} //output the data itself rep["data"].null(); //start with current connections @@ -233,6 +236,7 @@ void Controller::fillClients(JSON::Value & req, JSON::Value & rep){ d.append(statRef->second.up); } } + if (fields & STAT_CLI_CRC){d.append((long long)it->second.crc);} rep["data"].append(d); } } @@ -272,6 +276,7 @@ void Controller::fillClients(JSON::Value & req, JSON::Value & rep){ d.append(statRef->second.up); } } + if (fields & STAT_CLI_CRC){d.append((long long)it->second.crc);} rep["data"].append(d); } } diff --git a/src/controller/controller_statistics.h b/src/controller/controller_statistics.h index 5671fbb5..fefa010c 100644 --- a/src/controller/controller_statistics.h +++ b/src/controller/controller_statistics.h @@ -18,6 +18,7 @@ namespace Controller { public: void update(IPC::statExchange & data); std::string host; + unsigned int crc; std::string streamName; std::string connector; std::map log; diff --git a/src/output/output.cpp b/src/output/output.cpp index 5e2e0fa3..60c6ce3f 100644 --- a/src/output/output.cpp +++ b/src/output/output.cpp @@ -34,6 +34,7 @@ namespace Mist { Output::Output(Socket::Connection & conn) : myConn(conn) { firstTime = 0; + crc = 0; parseData = false; wantRequest = true; sought = false; @@ -238,7 +239,7 @@ namespace Mist { onFail(); return; } - statsPage = IPC::sharedClient("statistics", 88, true); + statsPage = IPC::sharedClient("statistics", STAT_EX_SIZE, true); playerConn = IPC::sharedClient(streamName + "_users", 30, true); updateMeta(); @@ -652,6 +653,7 @@ namespace Mist { tmpEx.host(myConn.getBinHost()); setHost = false; } + tmpEx.crc(crc); tmpEx.streamName(streamName); tmpEx.connector(capa["name"].asString()); tmpEx.up(myConn.dataUp()); diff --git a/src/output/output.h b/src/output/output.h index c76abf64..48b35e9e 100644 --- a/src/output/output.h +++ b/src/output/output.h @@ -78,6 +78,7 @@ namespace Mist { std::map lastKeyTime;///< Stores the time of the last keyframe, for preventing duplicates bool sought;/// indexPages;///< Maintains index pages of each track, holding information about available pages with DTSC packets. diff --git a/src/output/output_hds.cpp b/src/output/output_hds.cpp index ffdb1c81..de332c8f 100644 --- a/src/output/output_hds.cpp +++ b/src/output/output_hds.cpp @@ -3,7 +3,6 @@ #include #include #include - #include #include @@ -191,6 +190,8 @@ namespace Mist { void OutHDS::onRequest(){ HTTP_R.Clean(); while (HTTP_R.Read(myConn)){ + std::string ua = HTTP_R.GetHeader("User-Agent"); + crc = checksum::crc32(0, ua.data(), ua.size()); DEBUG_MSG(DLVL_DEVEL, "Received request: %s", HTTP_R.getUrl().c_str()); if (HTTP_R.url.find(".abst") != std::string::npos){ initialize(); diff --git a/src/output/output_hls.cpp b/src/output/output_hls.cpp index 4d1f39ee..42e0915d 100644 --- a/src/output/output_hls.cpp +++ b/src/output/output_hls.cpp @@ -286,6 +286,8 @@ namespace Mist { void OutHLS::onRequest(){ while (HTTP_R.Read(myConn)){ + std::string ua = HTTP_R.GetHeader("User-Agent"); + crc = checksum::crc32(0, ua.data(), ua.size()); DEBUG_MSG(DLVL_MEDIUM, "Received request: %s", HTTP_R.getUrl().c_str()); if (HTTP_R.url == "/crossdomain.xml"){ HTTP_S.Clean(); diff --git a/src/output/output_hss.cpp b/src/output/output_hss.cpp index 687103c6..605e4b84 100644 --- a/src/output/output_hss.cpp +++ b/src/output/output_hss.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -449,6 +450,8 @@ namespace Mist { sentHeader = false; while (HTTP_R.Read(myConn)) { initialize(); + std::string ua = HTTP_R.GetHeader("User-Agent"); + crc = checksum::crc32(0, ua.data(), ua.size()); if (HTTP_R.url.find("Manifest") != std::string::npos) { //Manifest, direct reply HTTP_S.Clean(); diff --git a/src/output/output_httpts.cpp b/src/output/output_httpts.cpp index 09d7e3bf..3c98d4a4 100644 --- a/src/output/output_httpts.cpp +++ b/src/output/output_httpts.cpp @@ -154,6 +154,8 @@ namespace Mist { void OutHTTPTS::onRequest(){ while (HTTP_R.Read(myConn)){ + std::string ua = HTTP_R.GetHeader("User-Agent"); + crc = checksum::crc32(0, ua.data(), ua.size()); DEBUG_MSG(DLVL_MEDIUM, "Received request: %s", HTTP_R.getUrl().c_str()); initialize(); HTTP_S.Clean(); diff --git a/src/output/output_json.cpp b/src/output/output_json.cpp index d6263001..9632db08 100644 --- a/src/output/output_json.cpp +++ b/src/output/output_json.cpp @@ -1,6 +1,7 @@ #include "output_json.h" #include #include +#include #include namespace Mist { @@ -61,6 +62,8 @@ namespace Mist { void OutJSON::onRequest(){ HTTP::Parser HTTP_R; while (HTTP_R.Read(myConn)){ + std::string ua = HTTP_R.GetHeader("User-Agent"); + crc = checksum::crc32(0, ua.data(), ua.size()); DEBUG_MSG(DLVL_DEVEL, "Received request %s", HTTP_R.getUrl().c_str()); first = true; jsonp = ""; diff --git a/src/output/output_progressive_flv.cpp b/src/output/output_progressive_flv.cpp index 5d58197b..f33289b5 100644 --- a/src/output/output_progressive_flv.cpp +++ b/src/output/output_progressive_flv.cpp @@ -1,4 +1,5 @@ #include "output_progressive_flv.h" +#include #include #include @@ -86,6 +87,8 @@ namespace Mist { void OutProgressiveFLV::onRequest(){ HTTP::Parser HTTP_R; while (HTTP_R.Read(myConn)){ + std::string ua = HTTP_R.GetHeader("User-Agent"); + crc = checksum::crc32(0, ua.data(), ua.size()); DEBUG_MSG(DLVL_DEVEL, "Received request %s", HTTP_R.getUrl().c_str()); if (HTTP_R.GetVar("audio") != ""){ selectedTracks.insert(JSON::Value(HTTP_R.GetVar("audio")).asInt()); diff --git a/src/output/output_progressive_mp3.cpp b/src/output/output_progressive_mp3.cpp index 22801772..fe7dbc69 100644 --- a/src/output/output_progressive_mp3.cpp +++ b/src/output/output_progressive_mp3.cpp @@ -1,6 +1,7 @@ #include "output_progressive_mp3.h" #include #include +#include namespace Mist { OutProgressiveMP3::OutProgressiveMP3(Socket::Connection & conn) : Output(conn) { @@ -54,6 +55,8 @@ namespace Mist { void OutProgressiveMP3::onRequest(){ HTTP::Parser HTTP_R; while (HTTP_R.Read(myConn)){ + std::string ua = HTTP_R.GetHeader("User-Agent"); + crc = checksum::crc32(0, ua.data(), ua.size()); DEBUG_MSG(DLVL_DEVEL, "Received request %s", HTTP_R.getUrl().c_str()); if (HTTP_R.GetVar("audio") != ""){ selectedTracks.insert(JSON::Value(HTTP_R.GetVar("audio")).asInt()); diff --git a/src/output/output_progressive_mp4.cpp b/src/output/output_progressive_mp4.cpp index 28527854..4ea5b2d7 100644 --- a/src/output/output_progressive_mp4.cpp +++ b/src/output/output_progressive_mp4.cpp @@ -2,6 +2,7 @@ #include #include #include +#include namespace Mist { OutProgressiveMP4::OutProgressiveMP4(Socket::Connection & conn) : Output(conn) { @@ -421,6 +422,8 @@ namespace Mist { void OutProgressiveMP4::onRequest(){ if (HTTP_R.Read(myConn)){ + std::string ua = HTTP_R.GetHeader("User-Agent"); + crc = checksum::crc32(0, ua.data(), ua.size()); DEBUG_MSG(DLVL_MEDIUM, "Received request: %s", HTTP_R.getUrl().c_str()); if (HTTP_R.GetVar("audio") != ""){ selectedTracks.insert(JSON::Value(HTTP_R.GetVar("audio")).asInt()); diff --git a/src/output/output_srt.cpp b/src/output/output_srt.cpp index 17e1db22..825e6ba4 100644 --- a/src/output/output_srt.cpp +++ b/src/output/output_srt.cpp @@ -1,6 +1,7 @@ #include "output_srt.h" #include #include +#include #include namespace Mist { @@ -75,6 +76,8 @@ namespace Mist { void OutProgressiveSRT::onRequest(){ HTTP::Parser HTTP_R; while (HTTP_R.Read(myConn)){ + std::string ua = HTTP_R.GetHeader("User-Agent"); + crc = checksum::crc32(0, ua.data(), ua.size()); DEBUG_MSG(DLVL_DEVEL, "Received request %s", HTTP_R.getUrl().c_str()); lastNum = 0; webVTT = (HTTP_R.url.find(".webvtt") != std::string::npos);