From a061ffcd5cc2af1ed5bace9b9f11e3535feb7bc6 Mon Sep 17 00:00:00 2001 From: GetAway Date: Thu, 11 Apr 2024 19:07:37 +0200 Subject: [PATCH] This commit refactors the extraction of HTTP headers in the cPlayback::Start method to include the 'Referer' header using the extractParam helper function. It ensures that the 'Referer' value from URL parameters is properly extracted and appended to the headers when present. Using: --- libarmbox/playback_libeplayer3.cpp | 44 +++++++++++++++++++++++++----- libarmbox/playback_libeplayer3.h | 1 + 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/libarmbox/playback_libeplayer3.cpp b/libarmbox/playback_libeplayer3.cpp index 6d3ac35..d89e9af 100644 --- a/libarmbox/playback_libeplayer3.cpp +++ b/libarmbox/playback_libeplayer3.cpp @@ -100,6 +100,26 @@ void cPlayback::Close(void) } } +std::string cPlayback::extractParam(const std::string &hdrs, const std::string ¶mName) +{ + size_t paramPos = hdrs.find(paramName); + if (paramPos != std::string::npos) { + size_t valuePos = paramPos + paramName.length(); + size_t valueEndPos = hdrs.find('&', valuePos); + if (valueEndPos == std::string::npos) { + valueEndPos = hdrs.length(); + } + std::string value = hdrs.substr(valuePos, valueEndPos - valuePos); + + size_t trailingSpacePos = value.find_last_not_of(" \t\r\n"); + if (trailingSpacePos != std::string::npos) { + value.erase(trailingSpacePos + 1); + } + return value; + } + return ""; +} + bool cPlayback::Start(std::string filename, std::string headers, std::string filename2) { return Start((char *) filename.c_str(), 0, 0, 0, 0, 0, headers, filename2); @@ -142,17 +162,27 @@ bool cPlayback::Start(char *filename, int vpid, int vtype, int apid, int ac3, in if (isHTTP && headers.empty()) { - size_t pos = file.find('#'); - if (pos != std::string::npos) - { - headers = file.substr(pos + 1); - pos = headers.find("User-Agent="); - if (pos != std::string::npos) - headers.replace(pos + 10, 1, ": "); + size_t pos = file.rfind('#'); + if (pos != std::string::npos) { + std::string val; + std::string hdrs = file.substr(pos + 1); + + val = extractParam(hdrs, "User-Agent="); + if (!val.empty()) { + headers += "User-Agent: " + val + "\n"; + } + val = extractParam(hdrs, "Referer="); + if (!val.empty()) { + headers += "Referer: " + val + "\n"; + } + if (!headers.empty()) { + file = file.substr(0, pos); + } } } if (!headers.empty()) { + printf("Headers List\n%s", headers.c_str()); const char hkey[] = "headers"; ffmpeg_av_dict_set(hkey, headers.c_str(), 0); } diff --git a/libarmbox/playback_libeplayer3.h b/libarmbox/playback_libeplayer3.h index e984358..a4762c2 100644 --- a/libarmbox/playback_libeplayer3.h +++ b/libarmbox/playback_libeplayer3.h @@ -36,6 +36,7 @@ class cPlayback off64_t last_size; int init_jump; AVFormatContext *avft; + std::string extractParam(const std::string &hdrs, const std::string ¶mName); public: cPlayback(int num = 0); ~cPlayback();