Allows the caller of CrashReportSender::SendCrashReport() to determine that

the server rejected a crash report, by changing the return value from a
boolean to a tri-state enum.

Fixes issue #101.  Reviewed by mmentovai.



git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@99 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
incrementalist 2007-01-03 23:14:46 +00:00
parent 5ac2b9a569
commit d4e527b7ee
5 changed files with 48 additions and 16 deletions

View File

@ -36,12 +36,23 @@
namespace google_airbag {
// static
bool CrashReportSender::SendCrashReport(
ReportResult CrashReportSender::SendCrashReport(
const wstring &url, const map<wstring, wstring> &parameters,
const wstring &dump_file_name, wstring *report_code) {
return HTTPUpload::SendRequest(url, parameters, dump_file_name,
L"upload_file_minidump", report_code);
int http_response = 0;
bool result = HTTPUpload::SendRequest(
url, parameters, dump_file_name, L"upload_file_minidump", report_code,
&http_response);
if (result) {
return RESULT_SUCCEEDED;
} else if (http_response == 400) { // TODO: update if/when the server
// switches to a different code
return RESULT_REJECTED;
} else {
return RESULT_FAILED;
}
}
} // namespace google_airbag

View File

@ -50,22 +50,29 @@ namespace google_airbag {
using std::wstring;
using std::map;
typedef enum {
RESULT_FAILED = 0, // Failed to communicate with the server; try later.
RESULT_REJECTED, // Successfully sent the crash report, but the
// server rejected it; don't resend this report.
RESULT_SUCCEEDED // The server accepted the crash report.
} ReportResult;
class CrashReportSender {
public:
// Sends the specified minidump file, along with the map of
// name value pairs, as a multipart POST request to the given URL.
// Parameter names must contain only printable ASCII characters,
// and may not contain a quote (") character.
// If the report is sent successfully (the return value is true), a
// code uniquely identifying the report will be returned in report_code.
// Only HTTP(S) URLs are currently supported. Returns true on success.
// Only HTTP(S) URLs are currently supported. The return value indicates
// the result of the operation (see above for possible results).
// If report_code is non-NULL and the report is sent successfully (that is,
// the return value is true), a code uniquely identifying the report will be
// returned in report_code. (Otherwise, report_code will be unchanged.)
static bool SendCrashReport(const wstring &url,
const map<wstring, wstring> &parameters,
const wstring &dump_file_name,
wstring *report_code);
// the return value is RESULT_SUCCEEDED), a code uniquely identifying the
// report will be returned in report_code.
// (Otherwise, report_code will be unchanged.)
static ReportResult SendCrashReport(const wstring &url,
const map<wstring, wstring> &parameters,
const wstring &dump_file_name,
wstring *report_code);
private:
// No instances of this class should be created.

View File

@ -66,7 +66,12 @@ bool HTTPUpload::SendRequest(const wstring &url,
const map<wstring, wstring> &parameters,
const wstring &upload_file,
const wstring &file_part_name,
wstring *response_body) {
wstring *response_body,
int *response_code) {
if (response_code) {
*response_code = 0;
}
// TODO(bryner): support non-ASCII parameter names
if (!CheckParameters(parameters)) {
return false;
@ -153,7 +158,12 @@ bool HTTPUpload::SendRequest(const wstring &url,
return false;
}
bool result = (wcscmp(http_status, L"200") == 0);
int http_response = wcstol(http_status, NULL, 10);
if (response_code) {
*response_code = http_response;
}
bool result = (http_response == 200);
if (result) {
result = ReadResponse(request.get(), response_body);

View File

@ -63,11 +63,14 @@ class HTTPUpload {
// Only HTTP(S) URLs are currently supported. Returns true on success.
// If the request is successful and response_body is non-NULL,
// the response body will be returned in response_body.
// If response_code is non-NULL, it will be set to the HTTP response code
// received (or 0 if the request failed before getting an HTTP response).
static bool SendRequest(const wstring &url,
const map<wstring, wstring> &parameters,
const wstring &upload_file,
const wstring &file_part_name,
wstring *response_body);
wstring *response_body,
int *response_code);
private:
class AutoInternetHandle;

View File

@ -182,7 +182,8 @@ int wmain(int argc, wchar_t *argv[]) {
}
bool success = HTTPUpload::SendRequest(url, parameters,
symbol_file, L"symbol_file", NULL);
symbol_file, L"symbol_file",
NULL, NULL);
_wunlink(symbol_file.c_str());
if (!success) {