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:
Adrien Destugues
2013-10-24 17:41:02 +02:00
parent 076952bc29
commit f6782201f0
11 changed files with 222 additions and 262 deletions
+10 -2
View File
@@ -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 {
+55
View File
@@ -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_
-11
View File
@@ -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;
-56
View File
@@ -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_
+37 -18
View File
@@ -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;
}
+104
View File
@@ -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);
}
+3 -48
View File
@@ -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;
}
-121
View File
@@ -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;
}