Remove B_PROT_* and related code

Use standard error codes instead.
This allows using error code returned by the underlying functions
directly, and makes it possible to use strerror for debugging. So, we
can also remove StatusString() from the various *Request classes.
This commit is contained in:
Adrien Destugues
2014-01-13 08:05:32 +01:00
parent 5e9a96156d
commit 3d864cd870
7 changed files with 87 additions and 147 deletions
-8
View File
@@ -49,7 +49,6 @@ public:
status_t Stop(); status_t Stop();
const BUrlResult& Result() const; const BUrlResult& Result() const;
const char* StatusString(status_t threadStatus) const;
static bool IsInformationalStatusCode(int16 code); static bool IsInformationalStatusCode(int16 code);
static bool IsSuccessStatusCode(int16 code); static bool IsSuccessStatusCode(int16 code);
@@ -123,13 +122,6 @@ private:
bool fOptAutoReferer : 1; bool fOptAutoReferer : 1;
}; };
// ProtocolLoop return status
enum {
B_PROT_HTTP_NOT_FOUND = B_PROT_THREAD_STATUS__END,
B_PROT_HTTP_THREAD_STATUS__END
};
// Request method // Request method
const char* const B_HTTP_GET = "GET"; const char* const B_HTTP_GET = "GET";
const char* const B_HTTP_POST = "POST"; const char* const B_HTTP_POST = "POST";
-21
View File
@@ -42,8 +42,6 @@ public:
// URL protocol informations // URL protocol informations
bool IsRunning() const; bool IsRunning() const;
status_t Status() const; status_t Status() const;
virtual const char* StatusString(status_t threadStatus)
const;
virtual const BUrlResult& Result() const = 0; virtual const BUrlResult& Result() const = 0;
@@ -66,23 +64,4 @@ protected:
}; };
// TODO: Rename, this is in the global namespace.
enum {
B_PROT_THREAD_STATUS__BASE = 0,
B_PROT_SUCCESS = B_PROT_THREAD_STATUS__BASE,
B_PROT_RUNNING,
B_PROT_PAUSED,
B_PROT_ABORTED,
B_PROT_SOCKET_ERROR,
B_PROT_CONNECTION_FAILED,
B_PROT_CANT_RESOLVE_HOSTNAME,
B_PROT_WRITE_FAILED,
B_PROT_READ_FAILED,
B_PROT_NO_MEMORY,
B_PROT_PROTOCOL_ERROR,
// Thread status over this one are guaranteed to be
// errors
B_PROT_THREAD_STATUS__END
};
#endif // _B_URL_REQUEST_H_ #endif // _B_URL_REQUEST_H_
+8 -2
View File
@@ -36,7 +36,7 @@ BDataRequest::_ProtocolLoop()
BString mimeType; BString mimeType;
BString charset; BString charset;
const char* payload; const char* payload;
size_t length; ssize_t length;
bool isBase64 = false; bool isBase64 = false;
fUrl.UrlDecode(true); fUrl.UrlDecode(true);
@@ -86,6 +86,12 @@ BDataRequest::_ProtocolLoop()
// payload must be a const char* so we can assign data.String() to // payload must be a const char* so we can assign data.String() to
// it below, but decode_64 modifies buffer. // it below, but decode_64 modifies buffer.
length = decode_base64(buffer, data.String(), data.Length()); length = decode_base64(buffer, data.String(), data.Length());
// There may be some padding at the end of the base64 stream. This
// prevents us from computing the exact length we should get, so allow
// for some error margin.
if(length > data.Length() * 4 / 3 || length < data.Length() * 4 / 3 - 3)
return B_BAD_DATA;
} else { } else {
payload = data.String(); payload = data.String();
length = data.Length(); length = data.Length();
@@ -102,5 +108,5 @@ BDataRequest::_ProtocolLoop()
if (isBase64) if (isBase64)
delete[] payload; delete[] payload;
return B_PROT_SUCCESS; return B_OK;
} }
+21 -12
View File
@@ -7,6 +7,7 @@
*/ */
#include <assert.h>
#include <stdlib.h> #include <stdlib.h>
#include <Directory.h> #include <Directory.h>
@@ -42,26 +43,35 @@ BFileRequest::_ProtocolLoop()
{ {
BNode node(fUrl.Path().String()); BNode node(fUrl.Path().String());
node_ref ref; node_ref ref;
if (node.GetNodeRef(&ref) != B_OK) status_t error = node.GetNodeRef(&ref);
return B_PROT_CONNECTION_FAILED; if (error != B_OK)
return error;
ssize_t transferredSize = 0;
if (node.IsFile()) { if (node.IsFile()) {
BFile file(fUrl.Path().String(), B_READ_ONLY); BFile file(fUrl.Path().String(), B_READ_ONLY);
if (file.InitCheck() != B_OK) error = file.InitCheck();
return B_PROT_CONNECTION_FAILED; if (error != B_OK)
return error;
// Send all notifications to listener, if any // Send all notifications to listener, if any
if (fListener != NULL) { if (fListener != NULL) {
fListener->ConnectionOpened(this); fListener->ConnectionOpened(this);
off_t size = 0; off_t size = 0;
file.GetSize(&size); file.GetSize(&size);
fListener->DownloadProgress(this, size, size);
fResult.SetLength(size); fResult.SetLength(size);
ssize_t chunkSize; ssize_t chunkSize;
char chunk[4096]; char chunk[4096];
while ((chunkSize = file.Read(chunk, sizeof(chunk))) > 0) while ((chunkSize = file.Read(chunk, sizeof(chunk))) > 0) {
fListener->DataReceived(this, chunk, chunkSize); fListener->DataReceived(this, chunk, chunkSize);
if (chunkSize > 0)
transferredSize += chunkSize;
else if (transferredSize != size)
return chunkSize;
}
fListener->DownloadProgress(this, size, size);
} }
BNodeInfo info(&file); BNodeInfo info(&file);
@@ -69,8 +79,10 @@ BFileRequest::_ProtocolLoop()
if (info.GetType(mimeType) == B_OK) if (info.GetType(mimeType) == B_OK)
fResult.SetContentType(mimeType); fResult.SetContentType(mimeType);
return B_PROT_SUCCESS; return B_OK;
} else if (node.IsDirectory()) { }
assert(node.IsDirectory());
BDirectory directory(&ref); BDirectory directory(&ref);
fResult.SetContentType("application/x-ftp-directory"); fResult.SetContentType("application/x-ftp-directory");
@@ -113,8 +125,5 @@ BFileRequest::_ProtocolLoop()
fListener->DownloadProgress(this, size, size); fListener->DownloadProgress(this, size, size);
fResult.SetLength(size); fResult.SetLength(size);
return B_PROT_SUCCESS; return B_OK;
}
return B_PROT_CONNECTION_FAILED;
} }
+12 -31
View File
@@ -24,12 +24,6 @@
static const int32 kHttpBufferSize = 4096; static const int32 kHttpBufferSize = 4096;
static const char* kHttpProtocolThreadStrStatus[
B_PROT_HTTP_THREAD_STATUS__END - B_PROT_THREAD_STATUS__END]
= {
"The remote server did not found the requested resource"
};
BHttpRequest::BHttpRequest(const BUrl& url, bool ssl, const char* protocolName, BHttpRequest::BHttpRequest(const BUrl& url, bool ssl, const char* protocolName,
BUrlProtocolListener* listener, BUrlContext* context) BUrlProtocolListener* listener, BUrlContext* context)
@@ -237,19 +231,6 @@ BHttpRequest::StatusCodeClass(int16 code)
} }
const char*
BHttpRequest::StatusString(status_t threadStatus) const
{
if (threadStatus < B_PROT_THREAD_STATUS__END)
return BUrlRequest::StatusString(threadStatus);
else if (threadStatus >= B_PROT_HTTP_THREAD_STATUS__END)
return BUrlRequest::StatusString(-1);
else
return kHttpProtocolThreadStrStatus[threadStatus
- B_PROT_THREAD_STATUS__END];
}
const BUrlResult& const BUrlResult&
BHttpRequest::Result() const BHttpRequest::Result() const
{ {
@@ -308,11 +289,11 @@ BHttpRequest::_ProtocolLoop()
_EmitDebug(B_URL_PROTOCOL_DEBUG_ERROR, _EmitDebug(B_URL_PROTOCOL_DEBUG_ERROR,
"Unable to resolve hostname (%s), aborting.", "Unable to resolve hostname (%s), aborting.",
fUrl.Host().String()); fUrl.Host().String());
return B_PROT_CANT_RESOLVE_HOSTNAME; return B_SERVER_NOT_FOUND;
} }
status_t requestStatus = _MakeRequest(); status_t requestStatus = _MakeRequest();
if (requestStatus != B_PROT_SUCCESS) if (requestStatus != B_OK)
return requestStatus; return requestStatus;
// Prepare the referer for the next request if needed // Prepare the referer for the next request if needed
@@ -396,9 +377,9 @@ BHttpRequest::_ProtocolLoop()
fHeaders.CountHeaders(), fInputBuffer.Size()); fHeaders.CountHeaders(), fInputBuffer.Size());
if (fResult.StatusCode() == 404) if (fResult.StatusCode() == 404)
return B_PROT_HTTP_NOT_FOUND; return B_RESOURCE_NOT_FOUND;
return B_PROT_SUCCESS; return B_OK;
} }
@@ -440,7 +421,7 @@ BHttpRequest::_MakeRequest()
if (connectError != B_OK) { if (connectError != B_OK) {
_EmitDebug(B_URL_PROTOCOL_DEBUG_ERROR, "Socket connection error %s", _EmitDebug(B_URL_PROTOCOL_DEBUG_ERROR, "Socket connection error %s",
strerror(connectError)); strerror(connectError));
return B_PROT_CONNECTION_FAILED; return connectError;
} }
//! ProtocolHook:ConnectionOpened //! ProtocolHook:ConnectionOpened
@@ -506,8 +487,8 @@ BHttpRequest::_MakeRequest()
fSocket->Write("\r\n", 2); fSocket->Write("\r\n", 2);
} }
fSocket->Write(fOptPostFields->GetMultipartFooter().String(), BString footer = fOptPostFields->GetMultipartFooter();
fOptPostFields->GetMultipartFooter().Length()); fSocket->Write(footer.String(), footer.Length());
} }
} else if ((fRequestMethod == B_HTTP_POST || fRequestMethod == B_HTTP_PUT) } else if ((fRequestMethod == B_HTTP_POST || fRequestMethod == B_HTTP_PUT)
&& fOptInputData != NULL) { && fOptInputData != NULL) {
@@ -546,7 +527,7 @@ BHttpRequest::_MakeRequest()
bool receiveEnd = false; bool receiveEnd = false;
bool parseEnd = false; bool parseEnd = false;
bool readByChunks = false; bool readByChunks = false;
bool readError = false; status_t readError = B_OK;
ssize_t bytesRead = 0; ssize_t bytesRead = 0;
ssize_t bytesReceived = 0; ssize_t bytesReceived = 0;
ssize_t bytesTotal = 0; ssize_t bytesTotal = 0;
@@ -561,7 +542,7 @@ BHttpRequest::_MakeRequest()
bytesRead = fSocket->Read(chunk.Data(), kHttpBufferSize); bytesRead = fSocket->Read(chunk.Data(), kHttpBufferSize);
if (bytesRead < 0) { if (bytesRead < 0) {
readError = true; readError = bytesRead;
break; break;
} else if (bytesRead == 0) } else if (bytesRead == 0)
receiveEnd = true; receiveEnd = true;
@@ -692,10 +673,10 @@ BHttpRequest::_MakeRequest()
fSocket->Disconnect(); fSocket->Disconnect();
delete[] inputTempBuffer; delete[] inputTempBuffer;
if (readError) if (readError != B_OK)
return B_PROT_READ_FAILED; return readError;
return fQuit ? B_PROT_ABORTED : B_PROT_SUCCESS; return fQuit ? B_INTERRUPTED : B_OK;
} }
+5 -32
View File
@@ -12,21 +12,6 @@
#include <stdio.h> #include <stdio.h>
static const char* kProtocolThreadStrStatus[B_PROT_THREAD_STATUS__END + 1]
= {
"Request successfully completed",
"Request running",
"Socket error",
"Connection failed",
"Hostname resolution failed",
"Network write failed",
"Network read failed",
"Out of memory",
"Protocol-specific error",
"Unknown error"
};
BUrlRequest::BUrlRequest(const BUrl& url, BUrlProtocolListener* listener, BUrlRequest::BUrlRequest(const BUrl& url, BUrlProtocolListener* listener,
BUrlContext* context, const char* threadName, const char* protocolName) BUrlContext* context, const char* threadName, const char* protocolName)
: :
@@ -35,7 +20,7 @@ BUrlRequest::BUrlRequest(const BUrl& url, BUrlProtocolListener* listener,
fListener(listener), fListener(listener),
fQuit(false), fQuit(false),
fRunning(false), fRunning(false),
fThreadStatus(B_PROT_PAUSED), fThreadStatus(B_NO_INIT),
fThreadId(0), fThreadId(0),
fThreadName(threadName), fThreadName(threadName),
fProtocol(protocolName) fProtocol(protocolName)
@@ -195,18 +180,6 @@ BUrlRequest::Status() const
} }
const char*
BUrlRequest::StatusString(status_t threadStatus) const
{
if (threadStatus < B_PROT_THREAD_STATUS__BASE)
threadStatus = B_PROT_THREAD_STATUS__END;
else if (threadStatus >= B_PROT_PROTOCOL_ERROR)
threadStatus = B_PROT_PROTOCOL_ERROR;
return kProtocolThreadStrStatus[threadStatus];
}
// #pragma mark Thread management // #pragma mark Thread management
@@ -214,7 +187,7 @@ BUrlRequest::StatusString(status_t threadStatus) const
BUrlRequest::_ThreadEntry(void* arg) BUrlRequest::_ThreadEntry(void* arg)
{ {
BUrlRequest* urlProtocol = reinterpret_cast<BUrlRequest*>(arg); BUrlRequest* urlProtocol = reinterpret_cast<BUrlRequest*>(arg);
urlProtocol->fThreadStatus = B_PROT_RUNNING; urlProtocol->fThreadStatus = B_BUSY;
status_t protocolLoopExitStatus = urlProtocol->_ProtocolLoop(); status_t protocolLoopExitStatus = urlProtocol->_ProtocolLoop();
@@ -223,7 +196,7 @@ BUrlRequest::_ThreadEntry(void* arg)
if (urlProtocol->fListener != NULL) { if (urlProtocol->fListener != NULL) {
urlProtocol->fListener->RequestCompleted(urlProtocol, urlProtocol->fListener->RequestCompleted(urlProtocol,
protocolLoopExitStatus == B_PROT_SUCCESS); protocolLoopExitStatus == B_OK);
} }
return B_OK; return B_OK;
@@ -240,8 +213,8 @@ BUrlRequest::_EmitDebug(BUrlProtocolDebugMessage type,
va_list arguments; va_list arguments;
va_start(arguments, format); va_start(arguments, format);
char debugMsg[256]; char debugMsg[1024];
vsnprintf(debugMsg, 256, format, arguments); vsnprintf(debugMsg, sizeof(debugMsg), format, arguments);
fListener->DebugMessage(this, type, debugMsg); fListener->DebugMessage(this, type, debugMsg);
va_end(arguments); va_end(arguments);
} }
@@ -107,6 +107,6 @@ void
BUrlSynchronousRequest::RequestCompleted(BUrlRequest* caller, bool success) BUrlSynchronousRequest::RequestCompleted(BUrlRequest* caller, bool success)
{ {
PRINT(("SynchronousRequest::RequestCompleted(%s) : %s\n", (success?"true":"false"), PRINT(("SynchronousRequest::RequestCompleted(%s) : %s\n", (success?"true":"false"),
caller->StatusString(caller->Status()))); strerror(caller->Status())));
fRequestComplete = true; fRequestComplete = true;
} }