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(); }