http_streamer: Handle http status codes

* Avoid to stop the next request after redirection.
* Fixes #12854.
This commit is contained in:
Dario Casalinuovo
2016-07-21 20:08:01 +02:00
parent a6c1049a55
commit b4515980f3
@@ -7,6 +7,7 @@
#include "HTTPMediaIO.h" #include "HTTPMediaIO.h"
#include <Handler.h> #include <Handler.h>
#include <HttpRequest.h>
#include <UrlProtocolRoster.h> #include <UrlProtocolRoster.h>
@@ -21,7 +22,8 @@ public:
BUrlProtocolAsynchronousListener(true), BUrlProtocolAsynchronousListener(true),
fRequest(NULL), fRequest(NULL),
fAdapterIO(owner), fAdapterIO(owner),
fInitSem(-1) fInitSem(-1),
fRunning(false)
{ {
fInputAdapter = fAdapterIO->BuildInputAdapter(); fInputAdapter = fAdapterIO->BuildInputAdapter();
fInitSem = create_sem(0, "http_streamer init sem"); fInitSem = create_sem(0, "http_streamer init sem");
@@ -36,22 +38,31 @@ public:
void ConnectionOpened(BUrlRequest* request) void ConnectionOpened(BUrlRequest* request)
{ {
if (fRequest != NULL)
fRequest->Stop();
fAdapterIO->UpdateSize(); fAdapterIO->UpdateSize();
fRequest = request; fRequest = request;
fRunning = true;
} }
void DataReceived(BUrlRequest* request, const char* data, void DataReceived(BUrlRequest* request, const char* data,
off_t position, ssize_t size) off_t position, ssize_t size)
{ {
_ReleaseInit();
if (request != fRequest) if (request != fRequest)
delete request; delete request;
BHttpRequest* httpReq = dynamic_cast<BHttpRequest*>(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); fInputAdapter->Write(data, size);
} }
@@ -71,6 +82,11 @@ public:
return acquire_sem_etc(fInitSem, 1, B_RELATIVE_TIMEOUT, timeout); return acquire_sem_etc(fInitSem, 1, B_RELATIVE_TIMEOUT, timeout);
} }
bool IsRunning()
{
return fRunning;
}
private: private:
void _ReleaseInit() void _ReleaseInit()
{ {
@@ -85,6 +101,7 @@ private:
HTTPMediaIO* fAdapterIO; HTTPMediaIO* fAdapterIO;
BInputAdapter* fInputAdapter; BInputAdapter* fInputAdapter;
sem_id fInitSem; sem_id fInitSem;
bool fRunning;
}; };
@@ -175,7 +192,7 @@ HTTPMediaIO::Close()
bool bool
HTTPMediaIO::IsRunning() const HTTPMediaIO::IsRunning() const
{ {
return fReq != NULL && fReq->IsRunning(); return fListener->IsRunning();
} }