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:
parent
5e9a96156d
commit
3d864cd870
@ -49,7 +49,6 @@ public:
|
||||
|
||||
status_t Stop();
|
||||
const BUrlResult& Result() const;
|
||||
const char* StatusString(status_t threadStatus) const;
|
||||
|
||||
static bool IsInformationalStatusCode(int16 code);
|
||||
static bool IsSuccessStatusCode(int16 code);
|
||||
@ -123,13 +122,6 @@ private:
|
||||
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
|
||||
const char* const B_HTTP_GET = "GET";
|
||||
const char* const B_HTTP_POST = "POST";
|
||||
|
@ -42,8 +42,6 @@ public:
|
||||
// URL protocol informations
|
||||
bool IsRunning() const;
|
||||
status_t Status() const;
|
||||
virtual const char* StatusString(status_t threadStatus)
|
||||
const;
|
||||
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_
|
||||
|
@ -36,7 +36,7 @@ BDataRequest::_ProtocolLoop()
|
||||
BString mimeType;
|
||||
BString charset;
|
||||
const char* payload;
|
||||
size_t length;
|
||||
ssize_t length;
|
||||
bool isBase64 = false;
|
||||
|
||||
fUrl.UrlDecode(true);
|
||||
@ -86,6 +86,12 @@ BDataRequest::_ProtocolLoop()
|
||||
// payload must be a const char* so we can assign data.String() to
|
||||
// it below, but decode_64 modifies buffer.
|
||||
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 {
|
||||
payload = data.String();
|
||||
length = data.Length();
|
||||
@ -102,5 +108,5 @@ BDataRequest::_ProtocolLoop()
|
||||
if (isBase64)
|
||||
delete[] payload;
|
||||
|
||||
return B_PROT_SUCCESS;
|
||||
return B_OK;
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
*/
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <Directory.h>
|
||||
@ -42,26 +43,35 @@ BFileRequest::_ProtocolLoop()
|
||||
{
|
||||
BNode node(fUrl.Path().String());
|
||||
node_ref ref;
|
||||
if (node.GetNodeRef(&ref) != B_OK)
|
||||
return B_PROT_CONNECTION_FAILED;
|
||||
status_t error = node.GetNodeRef(&ref);
|
||||
if (error != B_OK)
|
||||
return error;
|
||||
|
||||
ssize_t transferredSize = 0;
|
||||
if (node.IsFile()) {
|
||||
BFile file(fUrl.Path().String(), B_READ_ONLY);
|
||||
if (file.InitCheck() != B_OK)
|
||||
return B_PROT_CONNECTION_FAILED;
|
||||
error = file.InitCheck();
|
||||
if (error != B_OK)
|
||||
return error;
|
||||
|
||||
// Send all notifications to listener, if any
|
||||
if (fListener != NULL) {
|
||||
fListener->ConnectionOpened(this);
|
||||
off_t size = 0;
|
||||
file.GetSize(&size);
|
||||
fListener->DownloadProgress(this, size, size);
|
||||
fResult.SetLength(size);
|
||||
|
||||
ssize_t chunkSize;
|
||||
char chunk[4096];
|
||||
while ((chunkSize = file.Read(chunk, sizeof(chunk))) > 0)
|
||||
while ((chunkSize = file.Read(chunk, sizeof(chunk))) > 0) {
|
||||
fListener->DataReceived(this, chunk, chunkSize);
|
||||
|
||||
if (chunkSize > 0)
|
||||
transferredSize += chunkSize;
|
||||
else if (transferredSize != size)
|
||||
return chunkSize;
|
||||
}
|
||||
fListener->DownloadProgress(this, size, size);
|
||||
}
|
||||
|
||||
BNodeInfo info(&file);
|
||||
@ -69,52 +79,51 @@ BFileRequest::_ProtocolLoop()
|
||||
if (info.GetType(mimeType) == B_OK)
|
||||
fResult.SetContentType(mimeType);
|
||||
|
||||
return B_PROT_SUCCESS;
|
||||
} else if (node.IsDirectory()) {
|
||||
BDirectory directory(&ref);
|
||||
|
||||
fResult.SetContentType("application/x-ftp-directory");
|
||||
// This tells WebKit to use its FTP directory rendering code.
|
||||
|
||||
// Send all notifications to listener, if any
|
||||
if (fListener != NULL)
|
||||
fListener->ConnectionOpened(this);
|
||||
|
||||
int size = 0;
|
||||
char name[B_FILE_NAME_LENGTH];
|
||||
BEntry entry;
|
||||
while (directory.GetNextEntry(&entry) != B_ENTRY_NOT_FOUND) {
|
||||
// We read directories using the EPFL (Easily Parsed List Format)
|
||||
// This happens to be one of the formats that WebKit can understand,
|
||||
// and it is not too hard to parse or generate.
|
||||
// http://tools.ietf.org/html/draft-bernstein-eplf-02
|
||||
BString epfl("+");
|
||||
if (entry.IsFile() || entry.IsSymLink()) {
|
||||
epfl += "r,";
|
||||
off_t fileSize;
|
||||
if (entry.GetSize(&fileSize) == B_OK)
|
||||
epfl << "s" << fileSize << ",";
|
||||
|
||||
} else if (entry.IsDirectory())
|
||||
epfl += "/,";
|
||||
|
||||
time_t modification;
|
||||
if (entry.GetModificationTime(&modification) == B_OK)
|
||||
epfl << "m" << modification << ",";
|
||||
|
||||
entry.GetName(name);
|
||||
epfl << "\t" << name << "\r\n";
|
||||
if (fListener != NULL)
|
||||
fListener->DataReceived(this, epfl.String(), epfl.Length());
|
||||
size += epfl.Length();
|
||||
}
|
||||
|
||||
if (fListener != NULL)
|
||||
fListener->DownloadProgress(this, size, size);
|
||||
fResult.SetLength(size);
|
||||
|
||||
return B_PROT_SUCCESS;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
return B_PROT_CONNECTION_FAILED;
|
||||
assert(node.IsDirectory());
|
||||
BDirectory directory(&ref);
|
||||
|
||||
fResult.SetContentType("application/x-ftp-directory");
|
||||
// This tells WebKit to use its FTP directory rendering code.
|
||||
|
||||
// Send all notifications to listener, if any
|
||||
if (fListener != NULL)
|
||||
fListener->ConnectionOpened(this);
|
||||
|
||||
int size = 0;
|
||||
char name[B_FILE_NAME_LENGTH];
|
||||
BEntry entry;
|
||||
while (directory.GetNextEntry(&entry) != B_ENTRY_NOT_FOUND) {
|
||||
// We read directories using the EPFL (Easily Parsed List Format)
|
||||
// This happens to be one of the formats that WebKit can understand,
|
||||
// and it is not too hard to parse or generate.
|
||||
// http://tools.ietf.org/html/draft-bernstein-eplf-02
|
||||
BString epfl("+");
|
||||
if (entry.IsFile() || entry.IsSymLink()) {
|
||||
epfl += "r,";
|
||||
off_t fileSize;
|
||||
if (entry.GetSize(&fileSize) == B_OK)
|
||||
epfl << "s" << fileSize << ",";
|
||||
|
||||
} else if (entry.IsDirectory())
|
||||
epfl += "/,";
|
||||
|
||||
time_t modification;
|
||||
if (entry.GetModificationTime(&modification) == B_OK)
|
||||
epfl << "m" << modification << ",";
|
||||
|
||||
entry.GetName(name);
|
||||
epfl << "\t" << name << "\r\n";
|
||||
if (fListener != NULL)
|
||||
fListener->DataReceived(this, epfl.String(), epfl.Length());
|
||||
size += epfl.Length();
|
||||
}
|
||||
|
||||
if (fListener != NULL)
|
||||
fListener->DownloadProgress(this, size, size);
|
||||
fResult.SetLength(size);
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
@ -24,12 +24,6 @@
|
||||
|
||||
|
||||
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,
|
||||
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&
|
||||
BHttpRequest::Result() const
|
||||
{
|
||||
@ -308,11 +289,11 @@ BHttpRequest::_ProtocolLoop()
|
||||
_EmitDebug(B_URL_PROTOCOL_DEBUG_ERROR,
|
||||
"Unable to resolve hostname (%s), aborting.",
|
||||
fUrl.Host().String());
|
||||
return B_PROT_CANT_RESOLVE_HOSTNAME;
|
||||
return B_SERVER_NOT_FOUND;
|
||||
}
|
||||
|
||||
status_t requestStatus = _MakeRequest();
|
||||
if (requestStatus != B_PROT_SUCCESS)
|
||||
if (requestStatus != B_OK)
|
||||
return requestStatus;
|
||||
|
||||
// Prepare the referer for the next request if needed
|
||||
@ -396,9 +377,9 @@ BHttpRequest::_ProtocolLoop()
|
||||
fHeaders.CountHeaders(), fInputBuffer.Size());
|
||||
|
||||
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) {
|
||||
_EmitDebug(B_URL_PROTOCOL_DEBUG_ERROR, "Socket connection error %s",
|
||||
strerror(connectError));
|
||||
return B_PROT_CONNECTION_FAILED;
|
||||
return connectError;
|
||||
}
|
||||
|
||||
//! ProtocolHook:ConnectionOpened
|
||||
@ -506,8 +487,8 @@ BHttpRequest::_MakeRequest()
|
||||
fSocket->Write("\r\n", 2);
|
||||
}
|
||||
|
||||
fSocket->Write(fOptPostFields->GetMultipartFooter().String(),
|
||||
fOptPostFields->GetMultipartFooter().Length());
|
||||
BString footer = fOptPostFields->GetMultipartFooter();
|
||||
fSocket->Write(footer.String(), footer.Length());
|
||||
}
|
||||
} else if ((fRequestMethod == B_HTTP_POST || fRequestMethod == B_HTTP_PUT)
|
||||
&& fOptInputData != NULL) {
|
||||
@ -546,7 +527,7 @@ BHttpRequest::_MakeRequest()
|
||||
bool receiveEnd = false;
|
||||
bool parseEnd = false;
|
||||
bool readByChunks = false;
|
||||
bool readError = false;
|
||||
status_t readError = B_OK;
|
||||
ssize_t bytesRead = 0;
|
||||
ssize_t bytesReceived = 0;
|
||||
ssize_t bytesTotal = 0;
|
||||
@ -561,7 +542,7 @@ BHttpRequest::_MakeRequest()
|
||||
bytesRead = fSocket->Read(chunk.Data(), kHttpBufferSize);
|
||||
|
||||
if (bytesRead < 0) {
|
||||
readError = true;
|
||||
readError = bytesRead;
|
||||
break;
|
||||
} else if (bytesRead == 0)
|
||||
receiveEnd = true;
|
||||
@ -692,10 +673,10 @@ BHttpRequest::_MakeRequest()
|
||||
fSocket->Disconnect();
|
||||
delete[] inputTempBuffer;
|
||||
|
||||
if (readError)
|
||||
return B_PROT_READ_FAILED;
|
||||
if (readError != B_OK)
|
||||
return readError;
|
||||
|
||||
return fQuit ? B_PROT_ABORTED : B_PROT_SUCCESS;
|
||||
return fQuit ? B_INTERRUPTED : B_OK;
|
||||
}
|
||||
|
||||
|
||||
|
@ -12,21 +12,6 @@
|
||||
#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,
|
||||
BUrlContext* context, const char* threadName, const char* protocolName)
|
||||
:
|
||||
@ -35,7 +20,7 @@ BUrlRequest::BUrlRequest(const BUrl& url, BUrlProtocolListener* listener,
|
||||
fListener(listener),
|
||||
fQuit(false),
|
||||
fRunning(false),
|
||||
fThreadStatus(B_PROT_PAUSED),
|
||||
fThreadStatus(B_NO_INIT),
|
||||
fThreadId(0),
|
||||
fThreadName(threadName),
|
||||
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
|
||||
|
||||
|
||||
@ -214,7 +187,7 @@ BUrlRequest::StatusString(status_t threadStatus) const
|
||||
BUrlRequest::_ThreadEntry(void* arg)
|
||||
{
|
||||
BUrlRequest* urlProtocol = reinterpret_cast<BUrlRequest*>(arg);
|
||||
urlProtocol->fThreadStatus = B_PROT_RUNNING;
|
||||
urlProtocol->fThreadStatus = B_BUSY;
|
||||
|
||||
status_t protocolLoopExitStatus = urlProtocol->_ProtocolLoop();
|
||||
|
||||
@ -223,7 +196,7 @@ BUrlRequest::_ThreadEntry(void* arg)
|
||||
|
||||
if (urlProtocol->fListener != NULL) {
|
||||
urlProtocol->fListener->RequestCompleted(urlProtocol,
|
||||
protocolLoopExitStatus == B_PROT_SUCCESS);
|
||||
protocolLoopExitStatus == B_OK);
|
||||
}
|
||||
|
||||
return B_OK;
|
||||
@ -240,8 +213,8 @@ BUrlRequest::_EmitDebug(BUrlProtocolDebugMessage type,
|
||||
va_list arguments;
|
||||
va_start(arguments, format);
|
||||
|
||||
char debugMsg[256];
|
||||
vsnprintf(debugMsg, 256, format, arguments);
|
||||
char debugMsg[1024];
|
||||
vsnprintf(debugMsg, sizeof(debugMsg), format, arguments);
|
||||
fListener->DebugMessage(this, type, debugMsg);
|
||||
va_end(arguments);
|
||||
}
|
||||
|
@ -107,6 +107,6 @@ void
|
||||
BUrlSynchronousRequest::RequestCompleted(BUrlRequest* caller, bool success)
|
||||
{
|
||||
PRINT(("SynchronousRequest::RequestCompleted(%s) : %s\n", (success?"true":"false"),
|
||||
caller->StatusString(caller->Status())));
|
||||
strerror(caller->Status())));
|
||||
fRequestComplete = true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user