From b4515980f3f8748c16c5b878fd5e11f337573430 Mon Sep 17 00:00:00 2001 From: Dario Casalinuovo Date: Thu, 21 Jul 2016 20:05:11 +0200 Subject: [PATCH] http_streamer: Handle http status codes * Avoid to stop the next request after redirection. * Fixes #12854. --- .../plugins/http_streamer/HTTPMediaIO.cpp | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp b/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp index 5bf6a66b1f..dc4b2b4655 100644 --- a/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp +++ b/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp @@ -7,6 +7,7 @@ #include "HTTPMediaIO.h" #include +#include #include @@ -21,7 +22,8 @@ public: BUrlProtocolAsynchronousListener(true), fRequest(NULL), fAdapterIO(owner), - fInitSem(-1) + fInitSem(-1), + fRunning(false) { fInputAdapter = fAdapterIO->BuildInputAdapter(); fInitSem = create_sem(0, "http_streamer init sem"); @@ -36,22 +38,31 @@ public: void ConnectionOpened(BUrlRequest* request) { - if (fRequest != NULL) - fRequest->Stop(); - fAdapterIO->UpdateSize(); fRequest = request; + fRunning = true; } void DataReceived(BUrlRequest* request, const char* data, off_t position, ssize_t size) { - _ReleaseInit(); - if (request != fRequest) delete request; + BHttpRequest* httpReq = dynamic_cast(request); + const BHttpResult& httpRes = (const BHttpResult&)httpReq->Result(); + if (httpReq != NULL) { + int32 status = httpRes.StatusCode(); + if (BHttpRequest::IsClientErrorStatusCode(status) + || BHttpRequest::IsServerErrorStatusCode(status)) { + fRunning = false; + } else if (BHttpRequest::IsRedirectionStatusCode(status)) + return; + } + + _ReleaseInit(); + fInputAdapter->Write(data, size); } @@ -71,6 +82,11 @@ public: return acquire_sem_etc(fInitSem, 1, B_RELATIVE_TIMEOUT, timeout); } + bool IsRunning() + { + return fRunning; + } + private: void _ReleaseInit() { @@ -85,6 +101,7 @@ private: HTTPMediaIO* fAdapterIO; BInputAdapter* fInputAdapter; sem_id fInitSem; + bool fRunning; }; @@ -175,7 +192,7 @@ HTTPMediaIO::Close() bool HTTPMediaIO::IsRunning() const { - return fReq != NULL && fReq->IsRunning(); + return fListener->IsRunning(); }