http_streamer: Handle http status codes
* Avoid to stop the next request after redirection. * Fixes #12854.
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user