From f6782201f0dd84204dacf7b1f018f56d9594d972 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Thu, 24 Oct 2013 17:26:17 +0200 Subject: [PATCH] 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. --- headers/os/net/HttpRequest.h | 12 +- headers/os/net/HttpResult.h | 55 ++++++++ headers/os/net/UrlRequest.h | 11 -- headers/os/net/UrlResult.h | 56 -------- src/kits/network/libnetapi/HttpRequest.cpp | 55 +++++--- src/kits/network/libnetapi/HttpResult.cpp | 104 +++++++++++++++ .../UrlProtocolAsynchronousListener.cpp | 11 +- .../UrlProtocolDispatchingListener.cpp | 6 +- src/kits/network/libnetapi/UrlRequest.cpp | 51 +------- src/kits/network/libnetapi/UrlResult.cpp | 121 ------------------ .../libnetapi/UrlSynchronousRequest.cpp | 2 - 11 files changed, 222 insertions(+), 262 deletions(-) create mode 100644 headers/os/net/HttpResult.h delete mode 100644 headers/os/net/UrlResult.h create mode 100644 src/kits/network/libnetapi/HttpResult.cpp delete mode 100644 src/kits/network/libnetapi/UrlResult.cpp diff --git a/headers/os/net/HttpRequest.h b/headers/os/net/HttpRequest.h index b55ce59a52..2c4248cac2 100644 --- a/headers/os/net/HttpRequest.h +++ b/headers/os/net/HttpRequest.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -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 { diff --git a/headers/os/net/HttpResult.h b/headers/os/net/HttpResult.h new file mode 100644 index 0000000000..88f5de0e96 --- /dev/null +++ b/headers/os/net/HttpResult.h @@ -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 + +#include +#include +#include +#include + + +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_ diff --git a/headers/os/net/UrlRequest.h b/headers/os/net/UrlRequest.h index d0b2eb741c..870b124a72 100644 --- a/headers/os/net/UrlRequest.h +++ b/headers/os/net/UrlRequest.h @@ -7,7 +7,6 @@ #include -#include #include #include #include @@ -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; diff --git a/headers/os/net/UrlResult.h b/headers/os/net/UrlResult.h deleted file mode 100644 index 773e88b155..0000000000 --- a/headers/os/net/UrlResult.h +++ /dev/null @@ -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 - -#include -#include -#include -#include - - -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_ diff --git a/src/kits/network/libnetapi/HttpRequest.cpp b/src/kits/network/libnetapi/HttpRequest.cpp index 2e3e0bda8f..7b19990f85 100644 --- a/src/kits/network/libnetapi/HttpRequest.cpp +++ b/src/kits/network/libnetapi/HttpRequest.cpp @@ -20,7 +20,7 @@ #include -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; +} diff --git a/src/kits/network/libnetapi/HttpResult.cpp b/src/kits/network/libnetapi/HttpResult.cpp new file mode 100644 index 0000000000..6e48505b73 --- /dev/null +++ b/src/kits/network/libnetapi/HttpResult.cpp @@ -0,0 +1,104 @@ +/* + * Copyright 2010 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Christophe Huriaux, c.huriaux@gmail.com + */ + + +#include +#include + + +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; +} diff --git a/src/kits/network/libnetapi/UrlProtocolAsynchronousListener.cpp b/src/kits/network/libnetapi/UrlProtocolAsynchronousListener.cpp index b91d0fb3de..e23c33b0b5 100644 --- a/src/kits/network/libnetapi/UrlProtocolAsynchronousListener.cpp +++ b/src/kits/network/libnetapi/UrlProtocolAsynchronousListener.cpp @@ -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(&data), &size); + ssize_t size = 0; + if(message->FindData("url:data", B_STRING_TYPE, + reinterpret_cast(&data), &size) != B_OK) + { + printf("BOGUS DATA MESSAGE\n"); + message->PrintToStream(); + return; + } DataReceived(caller, data, size); } diff --git a/src/kits/network/libnetapi/UrlProtocolDispatchingListener.cpp b/src/kits/network/libnetapi/UrlProtocolDispatchingListener.cpp index 0043cfacf1..088f74e817 100644 --- a/src/kits/network/libnetapi/UrlProtocolDispatchingListener.cpp +++ b/src/kits/network/libnetapi/UrlProtocolDispatchingListener.cpp @@ -10,6 +10,8 @@ #include #include +#include + 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); } diff --git a/src/kits/network/libnetapi/UrlRequest.cpp b/src/kits/network/libnetapi/UrlRequest.cpp index de51565979..add73615c0 100644 --- a/src/kits/network/libnetapi/UrlRequest.cpp +++ b/src/kits/network/libnetapi/UrlRequest.cpp @@ -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; -} diff --git a/src/kits/network/libnetapi/UrlResult.cpp b/src/kits/network/libnetapi/UrlResult.cpp deleted file mode 100644 index bdc20a45aa..0000000000 --- a/src/kits/network/libnetapi/UrlResult.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2010 Haiku Inc. All rights reserved. - * Distributed under the terms of the MIT License. - * - * Authors: - * Christophe Huriaux, c.huriaux@gmail.com - */ - - -#include -#include - - -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(result.fRawData.Buffer()), - result.fRawData.BufferLength()); - - return out; -} diff --git a/src/kits/network/libnetapi/UrlSynchronousRequest.cpp b/src/kits/network/libnetapi/UrlSynchronousRequest.cpp index 54437ee451..c58479e47d 100644 --- a/src/kits/network/libnetapi/UrlSynchronousRequest.cpp +++ b/src/kits/network/libnetapi/UrlSynchronousRequest.cpp @@ -45,8 +45,6 @@ BUrlSynchronousRequest::WaitUntilCompletion() while (!fRequestComplete) snooze(10000); - fResult = fWrappedRequest.Result(); - return B_OK; }