aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client/windows/sender/crash_report_sender.cc17
-rw-r--r--src/client/windows/sender/crash_report_sender.h25
-rw-r--r--src/common/windows/http_upload.cc14
-rw-r--r--src/common/windows/http_upload.h5
-rw-r--r--src/tools/windows/symupload/symupload.cc3
5 files changed, 48 insertions, 16 deletions
diff --git a/src/client/windows/sender/crash_report_sender.cc b/src/client/windows/sender/crash_report_sender.cc
index 485ffc36..73675bef 100644
--- a/src/client/windows/sender/crash_report_sender.cc
+++ b/src/client/windows/sender/crash_report_sender.cc
@@ -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
diff --git a/src/client/windows/sender/crash_report_sender.h b/src/client/windows/sender/crash_report_sender.h
index c44c5e74..3fd0bc06 100644
--- a/src/client/windows/sender/crash_report_sender.h
+++ b/src/client/windows/sender/crash_report_sender.h
@@ -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.
diff --git a/src/common/windows/http_upload.cc b/src/common/windows/http_upload.cc
index 59e541f0..2fa48491 100644
--- a/src/common/windows/http_upload.cc
+++ b/src/common/windows/http_upload.cc
@@ -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);
diff --git a/src/common/windows/http_upload.h b/src/common/windows/http_upload.h
index a23a0f2b..d458eb19 100644
--- a/src/common/windows/http_upload.h
+++ b/src/common/windows/http_upload.h
@@ -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;
diff --git a/src/tools/windows/symupload/symupload.cc b/src/tools/windows/symupload/symupload.cc
index 25de747a..26d30b84 100644
--- a/src/tools/windows/symupload/symupload.cc
+++ b/src/tools/windows/symupload/symupload.cc
@@ -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) {