Move UrlResult to HttpResult
* Remove the fRawData field, as handling it is too complicated (it's not easy to have proper copy semantics on a BDataIO) and it's not used anyway, as the listener DataReceived call is enough to get the data and handle it. * All the remaining fields are HTTP-only, so rename the class to HttpResult and attach it to HttpRequest instead of UrlRequest.
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
#include <HttpAuthentication.h>
|
||||
#include <HttpForm.h>
|
||||
#include <HttpHeaders.h>
|
||||
#include <HttpResult.h>
|
||||
#include <NetBuffer.h>
|
||||
#include <NetworkAddress.h>
|
||||
#include <UrlRequest.h>
|
||||
@@ -48,6 +49,9 @@ public:
|
||||
const ssize_t size = -1);
|
||||
void AdoptHeaders(BHttpHeaders* const headers);
|
||||
|
||||
const BHttpResult& Result() const;
|
||||
const char* StatusString(status_t threadStatus) const;
|
||||
|
||||
static bool IsInformationalStatusCode(int16 code);
|
||||
static bool IsSuccessStatusCode(int16 code);
|
||||
static bool IsRedirectionStatusCode(int16 code);
|
||||
@@ -55,8 +59,6 @@ public:
|
||||
static bool IsServerErrorStatusCode(int16 code);
|
||||
static int16 StatusCodeClass(int16 code);
|
||||
|
||||
virtual const char* StatusString(status_t threadStatus) const;
|
||||
|
||||
private:
|
||||
void _ResetOptions();
|
||||
status_t _ProtocolLoop();
|
||||
@@ -73,6 +75,11 @@ private:
|
||||
|
||||
void _AddOutputBufferLine(const char* line);
|
||||
|
||||
// URL result parameters access
|
||||
BPositionIO* _ResultRawData();
|
||||
BHttpHeaders& _ResultHeaders();
|
||||
void _SetResultStatusCode(int32 statusCode);
|
||||
BString& _ResultStatusText();
|
||||
|
||||
private:
|
||||
BAbstractSocket* fSocket;
|
||||
@@ -91,6 +98,7 @@ private:
|
||||
// Request status
|
||||
|
||||
BHttpHeaders fOutputHeaders;
|
||||
BHttpResult fResult;
|
||||
|
||||
// Request state/events
|
||||
enum {
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright 2010 Haiku Inc. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef _B_URL_RESULT_H_
|
||||
#define _B_URL_RESULT_H_
|
||||
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <DataIO.h>
|
||||
#include <HttpHeaders.h>
|
||||
#include <String.h>
|
||||
#include <Url.h>
|
||||
|
||||
|
||||
class BUrlRequest;
|
||||
|
||||
|
||||
class BHttpResult {
|
||||
friend class BHttpRequest;
|
||||
|
||||
public:
|
||||
BHttpResult(const BUrl& url);
|
||||
BHttpResult(const BHttpResult& other);
|
||||
~BHttpResult();
|
||||
|
||||
// Result parameters modifications
|
||||
void SetUrl(const BUrl& url);
|
||||
|
||||
// Result parameters access
|
||||
const BUrl& Url() const;
|
||||
|
||||
// HTTP-Specific stuff
|
||||
const BHttpHeaders& Headers() const;
|
||||
const BString& StatusText() const;
|
||||
int32 StatusCode() const;
|
||||
|
||||
// Result tests
|
||||
bool HasHeaders() const;
|
||||
|
||||
// Overloaded members
|
||||
BHttpResult& operator=(const BHttpResult& other);
|
||||
|
||||
private:
|
||||
BUrl fUrl;
|
||||
|
||||
// TODO: HTTP specific stuff should not live here.
|
||||
BHttpHeaders fHeaders;
|
||||
int32 fStatusCode;
|
||||
BString fStatusString;
|
||||
};
|
||||
|
||||
|
||||
#endif // _B_URL_RESULT_H_
|
||||
@@ -7,7 +7,6 @@
|
||||
|
||||
|
||||
#include <Url.h>
|
||||
#include <UrlResult.h>
|
||||
#include <UrlContext.h>
|
||||
#include <UrlProtocolListener.h>
|
||||
#include <OS.h>
|
||||
@@ -30,13 +29,11 @@ public:
|
||||
|
||||
// URL protocol parameters modification
|
||||
status_t SetUrl(const BUrl& url);
|
||||
status_t SetResult(BUrlResult& result);
|
||||
status_t SetContext(BUrlContext* context);
|
||||
status_t SetListener(BUrlProtocolListener* listener);
|
||||
|
||||
// URL protocol parameters access
|
||||
const BUrl& Url() const;
|
||||
const BUrlResult& Result() const;
|
||||
BUrlContext* Context() const;
|
||||
BUrlProtocolListener* Listener() const;
|
||||
const BString& Protocol() const;
|
||||
@@ -53,16 +50,8 @@ protected:
|
||||
virtual status_t _ProtocolLoop();
|
||||
virtual void _EmitDebug(BUrlProtocolDebugMessage type,
|
||||
const char* format, ...);
|
||||
|
||||
// URL result parameters access
|
||||
BMallocIO& _ResultRawData();
|
||||
BHttpHeaders& _ResultHeaders();
|
||||
void _SetResultStatusCode(int32 statusCode);
|
||||
BString& _ResultStatusText();
|
||||
|
||||
protected:
|
||||
BUrl fUrl;
|
||||
BUrlResult fResult;
|
||||
BUrlContext* fContext;
|
||||
BUrlProtocolListener* fListener;
|
||||
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010 Haiku Inc. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef _B_URL_RESULT_H_
|
||||
#define _B_URL_RESULT_H_
|
||||
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <DataIO.h>
|
||||
#include <HttpHeaders.h>
|
||||
#include <String.h>
|
||||
#include <Url.h>
|
||||
|
||||
|
||||
class BUrlRequest;
|
||||
|
||||
|
||||
class BUrlResult {
|
||||
friend class BUrlRequest;
|
||||
|
||||
public:
|
||||
BUrlResult(const BUrl& url);
|
||||
BUrlResult(const BUrlResult& other);
|
||||
|
||||
// Result parameters modifications
|
||||
void SetUrl(const BUrl& url);
|
||||
|
||||
// Result parameters access
|
||||
const BUrl& Url() const;
|
||||
const BMallocIO& RawData() const;
|
||||
const BHttpHeaders& Headers() const;
|
||||
const BString& StatusText() const;
|
||||
int32 StatusCode() const;
|
||||
|
||||
// Result tests
|
||||
bool HasHeaders() const;
|
||||
|
||||
// Overloaded members
|
||||
BUrlResult& operator=(const BUrlResult& other);
|
||||
friend std::ostream& operator<<(std::ostream& out,
|
||||
const BUrlResult& result);
|
||||
|
||||
private:
|
||||
BUrl fUrl;
|
||||
BMallocIO fRawData;
|
||||
BHttpHeaders fHeaders;
|
||||
// TODO: HTTP specific stuff should not live here.
|
||||
|
||||
int32 fStatusCode;
|
||||
BString fStatusString;
|
||||
};
|
||||
|
||||
|
||||
#endif // _B_URL_RESULT_H_
|
||||
@@ -20,7 +20,7 @@
|
||||
#include <HttpRequest.h>
|
||||
|
||||
|
||||
static const int32 kHttpProtocolReceiveBufferSize = 1024;
|
||||
static const int32 kHttpBufferSize = 4096;
|
||||
static const char* kHttpProtocolThreadStrStatus[
|
||||
B_PROT_HTTP_THREAD_STATUS__END - B_PROT_THREAD_STATUS__END]
|
||||
= {
|
||||
@@ -36,6 +36,7 @@ BHttpRequest::BHttpRequest(const BUrl& url, bool ssl, const char* protocolName,
|
||||
fSSL(ssl),
|
||||
fRequestMethod(B_HTTP_GET),
|
||||
fHttpVersion(B_HTTP_11),
|
||||
fResult(url),
|
||||
fRequestStatus(kRequestInitialState),
|
||||
fOptHeaders(NULL),
|
||||
fOptPostFields(NULL),
|
||||
@@ -244,6 +245,13 @@ BHttpRequest::StatusString(status_t threadStatus) const
|
||||
}
|
||||
|
||||
|
||||
const BHttpResult&
|
||||
BHttpRequest::Result() const
|
||||
{
|
||||
return fResult;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BHttpRequest::_ResetOptions()
|
||||
{
|
||||
@@ -284,8 +292,6 @@ BHttpRequest::_ProtocolLoop()
|
||||
fOutputHeaders.Clear();
|
||||
fHeaders.Clear();
|
||||
_ResultHeaders().Clear();
|
||||
_ResultRawData().Seek(SEEK_SET, 0);
|
||||
_ResultRawData().SetSize(0);
|
||||
|
||||
if (!_ResolveHostName()) {
|
||||
_EmitDebug(B_URL_PROTOCOL_DEBUG_ERROR,
|
||||
@@ -459,13 +465,15 @@ BHttpRequest::_MakeRequest()
|
||||
{
|
||||
BFile upFile(currentField->File().Path(),
|
||||
B_READ_ONLY);
|
||||
char readBuffer[1024];
|
||||
char readBuffer[kHttpBufferSize];
|
||||
ssize_t readSize;
|
||||
|
||||
readSize = upFile.Read(readBuffer, 1024);
|
||||
readSize = upFile.Read(readBuffer,
|
||||
sizeof(readBuffer));
|
||||
while (readSize > 0) {
|
||||
fSocket->Write(readBuffer, readSize);
|
||||
readSize = upFile.Read(readBuffer, 1024);
|
||||
readSize = upFile.Read(readBuffer,
|
||||
sizeof(readBuffer));
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -486,7 +494,7 @@ BHttpRequest::_MakeRequest()
|
||||
&& fOptInputData != NULL) {
|
||||
|
||||
for(;;) {
|
||||
char outputTempBuffer[1024];
|
||||
char outputTempBuffer[kHttpBufferSize];
|
||||
ssize_t read = fOptInputData->Read(outputTempBuffer,
|
||||
sizeof(outputTempBuffer));
|
||||
|
||||
@@ -557,7 +565,7 @@ BHttpRequest::_MakeRequest()
|
||||
_ParseHeaders();
|
||||
|
||||
if (fRequestStatus >= kRequestHeadersReceived) {
|
||||
receiveBufferSize = kHttpProtocolReceiveBufferSize;
|
||||
receiveBufferSize = kHttpBufferSize;
|
||||
_ResultHeaders() = fHeaders;
|
||||
|
||||
//! ProtocolHook:HeadersReceived
|
||||
@@ -651,16 +659,6 @@ BHttpRequest::_MakeRequest()
|
||||
bytesTotal);
|
||||
}
|
||||
|
||||
ssize_t dataWrite = _ResultRawData().Write(inputTempBuffer,
|
||||
bytesRead);
|
||||
|
||||
if (dataWrite != bytesRead) {
|
||||
_EmitDebug(B_URL_PROTOCOL_DEBUG_ERROR,
|
||||
"Unable to write %dbytes of data (%d).", bytesRead,
|
||||
dataWrite);
|
||||
return B_PROT_NO_MEMORY;
|
||||
}
|
||||
|
||||
if (bytesTotal > 0 && bytesReceived >= bytesTotal)
|
||||
receiveEnd = true;
|
||||
|
||||
@@ -896,3 +894,24 @@ BHttpRequest::_AddOutputBufferLine(const char* line)
|
||||
_EmitDebug(B_URL_PROTOCOL_DEBUG_HEADER_OUT, "%s", line);
|
||||
fOutputBuffer << line << "\r\n";
|
||||
}
|
||||
|
||||
|
||||
BHttpHeaders&
|
||||
BHttpRequest::_ResultHeaders()
|
||||
{
|
||||
return fResult.fHeaders;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BHttpRequest::_SetResultStatusCode(int32 statusCode)
|
||||
{
|
||||
fResult.fStatusCode = statusCode;
|
||||
}
|
||||
|
||||
|
||||
BString&
|
||||
BHttpRequest::_ResultStatusText()
|
||||
{
|
||||
return fResult.fStatusString;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* Copyright 2010 Haiku Inc. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*
|
||||
* Authors:
|
||||
* Christophe Huriaux, [email protected]
|
||||
*/
|
||||
|
||||
|
||||
#include <HttpResult.h>
|
||||
#include <Debug.h>
|
||||
|
||||
|
||||
using std::ostream;
|
||||
|
||||
|
||||
BHttpResult::BHttpResult(const BUrl& url)
|
||||
:
|
||||
fUrl(url),
|
||||
fHeaders(),
|
||||
fStatusCode(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
BHttpResult::BHttpResult(const BHttpResult& other)
|
||||
:
|
||||
fUrl(other.fUrl),
|
||||
fHeaders(other.fHeaders),
|
||||
fStatusCode(other.fStatusCode),
|
||||
fStatusString(other.fStatusString)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
BHttpResult::~BHttpResult()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
// #pragma mark Result parameters modifications
|
||||
|
||||
|
||||
void
|
||||
BHttpResult::SetUrl(const BUrl& url)
|
||||
{
|
||||
fUrl = url;
|
||||
}
|
||||
|
||||
|
||||
// #pragma mark Result parameters access
|
||||
|
||||
|
||||
const BUrl&
|
||||
BHttpResult::Url() const
|
||||
{
|
||||
return fUrl;
|
||||
}
|
||||
|
||||
|
||||
const BHttpHeaders&
|
||||
BHttpResult::Headers() const
|
||||
{
|
||||
return fHeaders;
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
BHttpResult::StatusCode() const
|
||||
{
|
||||
return fStatusCode;
|
||||
}
|
||||
|
||||
|
||||
const BString&
|
||||
BHttpResult::StatusText() const
|
||||
{
|
||||
return fStatusString;
|
||||
}
|
||||
|
||||
|
||||
// #pragma mark Result tests
|
||||
|
||||
|
||||
bool
|
||||
BHttpResult::HasHeaders() const
|
||||
{
|
||||
return (fHeaders.CountHeaders() > 0);
|
||||
}
|
||||
|
||||
|
||||
// #pragma mark Overloaded members
|
||||
|
||||
|
||||
BHttpResult&
|
||||
BHttpResult::operator=(const BHttpResult& other)
|
||||
{
|
||||
fUrl = other.fUrl;
|
||||
fHeaders = other.fHeaders;
|
||||
fStatusCode = other.fStatusCode;
|
||||
fStatusString = other.fStatusString;
|
||||
|
||||
return *this;
|
||||
}
|
||||
@@ -99,9 +99,14 @@ BUrlProtocolAsynchronousListener::MessageReceived(BMessage* message)
|
||||
case B_URL_PROTOCOL_DATA_RECEIVED:
|
||||
{
|
||||
const char* data;
|
||||
ssize_t size;
|
||||
message->FindData("url:data", B_STRING_TYPE,
|
||||
reinterpret_cast<const void**>(&data), &size);
|
||||
ssize_t size = 0;
|
||||
if(message->FindData("url:data", B_STRING_TYPE,
|
||||
reinterpret_cast<const void**>(&data), &size) != B_OK)
|
||||
{
|
||||
printf("BOGUS DATA MESSAGE\n");
|
||||
message->PrintToStream();
|
||||
return;
|
||||
}
|
||||
|
||||
DataReceived(caller, data, size);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
#include <UrlProtocolDispatchingListener.h>
|
||||
#include <Debug.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
const char* kUrlProtocolMessageType = "be:urlProtocolMessageType";
|
||||
const char* kUrlProtocolCaller = "be:urlProtocolCaller";
|
||||
@@ -76,7 +78,9 @@ BUrlProtocolDispatchingListener::DataReceived(BUrlRequest* caller,
|
||||
const char* data, ssize_t size)
|
||||
{
|
||||
BMessage message(B_URL_PROTOCOL_NOTIFICATION);
|
||||
message.AddData("url:data", B_STRING_TYPE, data, size, true, 1);
|
||||
status_t result = message.AddData("url:data", B_STRING_TYPE, data, size,
|
||||
true, 1);
|
||||
assert(result == B_OK);
|
||||
|
||||
_SendMessage(&message, B_URL_PROTOCOL_DATA_RECEIVED, caller);
|
||||
}
|
||||
|
||||
@@ -31,7 +31,6 @@ BUrlRequest::BUrlRequest(const BUrl& url, BUrlProtocolListener* listener,
|
||||
BUrlContext* context, const char* threadName, const char* protocolName)
|
||||
:
|
||||
fUrl(url),
|
||||
fResult(url),
|
||||
fContext(context),
|
||||
fListener(listener),
|
||||
fQuit(false),
|
||||
@@ -126,17 +125,6 @@ BUrlRequest::SetUrl(const BUrl& url)
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BUrlRequest::SetResult(BUrlResult& result)
|
||||
{
|
||||
if (IsRunning())
|
||||
return B_ERROR;
|
||||
|
||||
fResult = result;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BUrlRequest::SetContext(BUrlContext* context)
|
||||
{
|
||||
@@ -169,13 +157,6 @@ BUrlRequest::Url() const
|
||||
}
|
||||
|
||||
|
||||
const BUrlResult&
|
||||
BUrlRequest::Result() const
|
||||
{
|
||||
return fResult;
|
||||
}
|
||||
|
||||
|
||||
BUrlContext*
|
||||
BUrlRequest::Context() const
|
||||
{
|
||||
@@ -240,9 +221,11 @@ BUrlRequest::_ThreadEntry(void* arg)
|
||||
urlProtocol->fRunning = false;
|
||||
urlProtocol->fThreadStatus = protocolLoopExitStatus;
|
||||
|
||||
if (urlProtocol->fListener != NULL)
|
||||
if (urlProtocol->fListener != NULL) {
|
||||
urlProtocol->fListener->RequestCompleted(urlProtocol,
|
||||
protocolLoopExitStatus == B_PROT_SUCCESS);
|
||||
printf("Notified to %p\n", urlProtocol->fListener);
|
||||
}
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
@@ -274,31 +257,3 @@ BUrlRequest::_EmitDebug(BUrlProtocolDebugMessage type,
|
||||
fListener->DebugMessage(this, type, debugMsg);
|
||||
va_end(arguments);
|
||||
}
|
||||
|
||||
|
||||
BMallocIO&
|
||||
BUrlRequest::_ResultRawData()
|
||||
{
|
||||
return fResult.fRawData;
|
||||
}
|
||||
|
||||
|
||||
BHttpHeaders&
|
||||
BUrlRequest::_ResultHeaders()
|
||||
{
|
||||
return fResult.fHeaders;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BUrlRequest::_SetResultStatusCode(int32 statusCode)
|
||||
{
|
||||
fResult.fStatusCode = statusCode;
|
||||
}
|
||||
|
||||
|
||||
BString&
|
||||
BUrlRequest::_ResultStatusText()
|
||||
{
|
||||
return fResult.fStatusString;
|
||||
}
|
||||
|
||||
@@ -1,121 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010 Haiku Inc. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*
|
||||
* Authors:
|
||||
* Christophe Huriaux, [email protected]
|
||||
*/
|
||||
|
||||
|
||||
#include <UrlResult.h>
|
||||
#include <Debug.h>
|
||||
|
||||
|
||||
using std::ostream;
|
||||
|
||||
|
||||
BUrlResult::BUrlResult(const BUrl& url)
|
||||
:
|
||||
fUrl(url),
|
||||
fRawData(),
|
||||
fHeaders(),
|
||||
fStatusCode(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
BUrlResult::BUrlResult(const BUrlResult& other)
|
||||
:
|
||||
fUrl(),
|
||||
fRawData(),
|
||||
fHeaders()
|
||||
{
|
||||
*this = other;
|
||||
}
|
||||
|
||||
|
||||
// #pragma mark Result parameters modifications
|
||||
|
||||
|
||||
void
|
||||
BUrlResult::SetUrl(const BUrl& url)
|
||||
{
|
||||
fUrl = url;
|
||||
}
|
||||
|
||||
|
||||
// #pragma mark Result parameters access
|
||||
|
||||
|
||||
const BUrl&
|
||||
BUrlResult::Url() const
|
||||
{
|
||||
return fUrl;
|
||||
}
|
||||
|
||||
|
||||
const BMallocIO&
|
||||
BUrlResult::RawData() const
|
||||
{
|
||||
return fRawData;
|
||||
}
|
||||
|
||||
|
||||
const BHttpHeaders&
|
||||
BUrlResult::Headers() const
|
||||
{
|
||||
return fHeaders;
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
BUrlResult::StatusCode() const
|
||||
{
|
||||
return fStatusCode;
|
||||
}
|
||||
|
||||
|
||||
const BString&
|
||||
BUrlResult::StatusText() const
|
||||
{
|
||||
return fStatusString;
|
||||
}
|
||||
|
||||
|
||||
// #pragma mark Result tests
|
||||
|
||||
|
||||
bool
|
||||
BUrlResult::HasHeaders() const
|
||||
{
|
||||
return (fHeaders.CountHeaders() > 0);
|
||||
}
|
||||
|
||||
|
||||
// #pragma mark Overloaded operators
|
||||
|
||||
|
||||
BUrlResult&
|
||||
BUrlResult::operator=(const BUrlResult& other)
|
||||
{
|
||||
fUrl = other.fUrl;
|
||||
fHeaders = other.fHeaders;
|
||||
|
||||
fRawData.SetSize(other.fRawData.BufferLength());
|
||||
fRawData.WriteAt(0, other.fRawData.Buffer(), other.fRawData.BufferLength());
|
||||
// FIXME this makes a copy of the data, it would be better to share it
|
||||
|
||||
fStatusCode = other.fStatusCode;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
ostream&
|
||||
operator<<(ostream& out, const BUrlResult& result)
|
||||
{
|
||||
out.write(reinterpret_cast<const char*>(result.fRawData.Buffer()),
|
||||
result.fRawData.BufferLength());
|
||||
|
||||
return out;
|
||||
}
|
||||
@@ -45,8 +45,6 @@ BUrlSynchronousRequest::WaitUntilCompletion()
|
||||
while (!fRequestComplete)
|
||||
snooze(10000);
|
||||
|
||||
fResult = fWrappedRequest.Result();
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user