Better onFail handling, better HTTP failure handling
This commit is contained in:
parent
9a2544cc9b
commit
251dc5f171
9 changed files with 30 additions and 49 deletions
|
@ -130,8 +130,12 @@ namespace Mist{
|
|||
/// Called when stream initialization has failed.
|
||||
/// The standard implementation will set isInitialized to false and close the client connection,
|
||||
/// thus causing the process to exit cleanly.
|
||||
void Output::onFail(){
|
||||
MEDIUM_MSG("onFail");
|
||||
void Output::onFail(const std::string & msg, bool critical){
|
||||
if (critical){
|
||||
FAIL_MSG("onFail '%s': %s", streamName.c_str(), msg.c_str());
|
||||
}else{
|
||||
MEDIUM_MSG("onFail '%s': %s", streamName.c_str(), msg.c_str());
|
||||
}
|
||||
isInitialized = false;
|
||||
wantRequest = true;
|
||||
parseData= false;
|
||||
|
@ -153,7 +157,7 @@ namespace Mist{
|
|||
reconnect();
|
||||
//if the connection failed, fail
|
||||
if (streamName.size() < 1){
|
||||
onFail();
|
||||
onFail("Could not connect to stream", true);
|
||||
return;
|
||||
}
|
||||
sought = false;
|
||||
|
@ -216,14 +220,12 @@ namespace Mist{
|
|||
if (config->hasOption("noinput") && config->getBool("noinput")){
|
||||
Util::sanitizeName(streamName);
|
||||
if (!Util::streamAlive(streamName)){
|
||||
FAIL_MSG("Stream %s not already active - aborting initialization", streamName.c_str());
|
||||
onFail();
|
||||
onFail("Stream not active already, aborting");
|
||||
return;
|
||||
}
|
||||
}else{
|
||||
if (!Util::startInput(streamName, "", true, isPushing())){
|
||||
FAIL_MSG("Opening stream %s failed - aborting initialization", streamName.c_str());
|
||||
onFail();
|
||||
onFail("Stream open failed", true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -236,16 +238,14 @@ namespace Mist{
|
|||
nProxy.userClient = IPC::sharedClient(userPageName, PLAY_EX_SIZE, true);
|
||||
}
|
||||
if (!nProxy.userClient.isAlive()){
|
||||
FAIL_MSG("Could not register as client for %s", streamName.c_str());
|
||||
onFail();
|
||||
onFail("Could not register as client", true);
|
||||
return;
|
||||
}
|
||||
char pageId[NAME_BUFFER_SIZE];
|
||||
snprintf(pageId, NAME_BUFFER_SIZE, SHM_STREAM_INDEX, streamName.c_str());
|
||||
nProxy.metaPages[0].init(pageId, DEFAULT_STRM_PAGE_SIZE);
|
||||
if (!nProxy.metaPages[0].mapped){
|
||||
FAIL_MSG("Could not connect to data for %s", streamName.c_str());
|
||||
onFail();
|
||||
onFail("Could not connect to stream data", true);
|
||||
return;
|
||||
}
|
||||
isInitialized = true;
|
||||
|
@ -1173,12 +1173,7 @@ namespace Mist{
|
|||
snprintf(userPageName, NAME_BUFFER_SIZE, SHM_USERS, streamName.c_str());
|
||||
nProxy.userClient = IPC::sharedClient(userPageName, PLAY_EX_SIZE, true);
|
||||
if (!nProxy.userClient.getData()){
|
||||
WARN_MSG("Player connection failure - aborting output");
|
||||
if (!onFinish()){
|
||||
myConn.close();
|
||||
}else{
|
||||
disconnect();
|
||||
}
|
||||
onFail("Player connection failure - aborting output", true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -1186,21 +1181,11 @@ namespace Mist{
|
|||
if (isPushing() && !pushIsOngoing){
|
||||
waitForStreamPushReady();
|
||||
if (!nProxy.userClient.isAlive()){
|
||||
WARN_MSG("Failed to wait for buffer, aborting incoming push");
|
||||
if (!onFinish()){
|
||||
myConn.close();
|
||||
}else{
|
||||
disconnect();
|
||||
}
|
||||
onFail("Failed to wait for buffer, aborting incoming push", true);
|
||||
return;
|
||||
}
|
||||
}else{
|
||||
INFO_MSG("Received disconnect request from input");
|
||||
if (!onFinish()){
|
||||
myConn.close();
|
||||
}else{
|
||||
disconnect();
|
||||
}
|
||||
onFail("Received disconnect request from input");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -73,7 +73,7 @@ namespace Mist {
|
|||
void disconnect();
|
||||
virtual void initialize();
|
||||
virtual void sendHeader();
|
||||
virtual void onFail();
|
||||
virtual void onFail(const std::string & msg, bool critical = false);
|
||||
virtual void requestHandler();
|
||||
static Util::Config * config;
|
||||
void playbackSleep(uint64_t millis);
|
||||
|
|
|
@ -197,7 +197,7 @@ namespace Mist {
|
|||
}
|
||||
|
||||
if (H.url.find("hls") == std::string::npos){
|
||||
onFail();
|
||||
onFail("HLS handler active, but this is not a HLS URL. Eh... What...?");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -213,11 +213,7 @@ namespace Mist {
|
|||
}
|
||||
|
||||
initialize();
|
||||
|
||||
if (!keepGoing()){
|
||||
onFail();
|
||||
return;
|
||||
}
|
||||
if (!keepGoing()){return;}
|
||||
|
||||
if (H.url.find(".m3u") == std::string::npos){
|
||||
std::string tmpStr = H.getUrl().substr(5 + streamName.size());
|
||||
|
|
|
@ -39,13 +39,14 @@ namespace Mist {
|
|||
config = cfg;
|
||||
}
|
||||
|
||||
void HTTPOutput::onFail(){
|
||||
void HTTPOutput::onFail(const std::string & msg, bool critical){
|
||||
INFO_MSG("Failing '%s': %s: %s", streamName.c_str(), H.url.c_str(), msg.c_str());
|
||||
if (!webSock){
|
||||
H.Clean(); //make sure no parts of old requests are left in any buffers
|
||||
H.SetBody("Stream not found. Sorry, we tried.");
|
||||
H.SendResponse("404", "Stream not found", myConn);
|
||||
H.SetBody("Could not retrieve stream: "+msg);
|
||||
H.SendResponse("404", "Error opening stream", myConn);
|
||||
}
|
||||
Output::onFail();
|
||||
Output::onFail(msg, critical);
|
||||
}
|
||||
|
||||
bool isMatch(const std::string & url, const std::string & m, std::string & streamname){
|
||||
|
|
|
@ -12,7 +12,7 @@ namespace Mist {
|
|||
virtual ~HTTPOutput();
|
||||
static void init(Util::Config * cfg);
|
||||
void onRequest();
|
||||
virtual void onFail();
|
||||
virtual void onFail(const std::string & msg, bool critical = false);
|
||||
virtual void onHTTP(){};
|
||||
virtual void onIdle(){};
|
||||
virtual void onWebsocketFrame(){};
|
||||
|
|
|
@ -60,7 +60,7 @@ namespace Mist {
|
|||
return !(config->getString("ip").size());
|
||||
}
|
||||
|
||||
void OutHTTP::onFail(){
|
||||
void OutHTTP::onFail(const std::string & msg, bool critical){
|
||||
std::string method = H.method;
|
||||
// send logo icon
|
||||
if (H.url.length() > 4 && H.url.substr(H.url.length() - 4, 4) == ".ico"){
|
||||
|
@ -75,6 +75,7 @@ namespace Mist {
|
|||
if (websocketHandler()){return;}
|
||||
JSON::Value json_resp;
|
||||
json_resp["error"] = "Could not retrieve stream. Sorry.";
|
||||
json_resp["error_guru"] = msg;
|
||||
if (H.url.size() >= 5 && H.url.substr(0, 5) == "/json"){
|
||||
H.Clean();
|
||||
H.SetBody(json_resp.toString());
|
||||
|
@ -92,9 +93,7 @@ namespace Mist {
|
|||
H.Clean();
|
||||
return;
|
||||
}
|
||||
INFO_MSG("Failing: %s", H.url.c_str());
|
||||
HTTPOutput::onFail();
|
||||
Output::onFail();
|
||||
HTTPOutput::onFail(msg, critical);
|
||||
}
|
||||
|
||||
void OutHTTP::init(Util::Config * cfg){
|
||||
|
|
|
@ -8,7 +8,7 @@ namespace Mist {
|
|||
~OutHTTP();
|
||||
static void init(Util::Config * cfg);
|
||||
static bool listenMode();
|
||||
virtual void onFail();
|
||||
virtual void onFail(const std::string & msg, bool critical = false);
|
||||
///preHTTP is disabled in the internal HTTP output, since most don't need the stream alive to work
|
||||
virtual void preHTTP(){};
|
||||
void HTMLResponse();
|
||||
|
|
|
@ -81,10 +81,10 @@ namespace Mist {
|
|||
sentHeader = true;
|
||||
}
|
||||
|
||||
void OutJSON::onFail(){
|
||||
void OutJSON::onFail(const std::string & msg, bool critical){
|
||||
//Only run failure handle if we're not being persistent
|
||||
if (!keepReselecting){
|
||||
HTTPOutput::onFail();
|
||||
HTTPOutput::onFail(msg, critical);
|
||||
}else{
|
||||
onFinish();
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ namespace Mist {
|
|||
virtual void onWebsocketConnect();
|
||||
virtual void preWebsocketConnect();
|
||||
bool onFinish();
|
||||
void onFail();
|
||||
void onFail(const std::string & msg, bool critical = false);
|
||||
void sendNext();
|
||||
void sendHeader();
|
||||
bool doesWebsockets(){return true;}
|
||||
|
|
Loading…
Add table
Reference in a new issue