diff options
author | Craig Tiller <ctiller@google.com> | 2017-01-09 15:25:15 -0800 |
---|---|---|
committer | Craig Tiller <ctiller@google.com> | 2017-01-09 15:25:15 -0800 |
commit | 737b625ad84e35cc947c80102d29d34e27250cf3 (patch) | |
tree | ac0e25fdfa115535f4756a6a9e0cad9a78f7aa25 /src/core/lib/surface | |
parent | 5cf481d2c90586626ba01d53d077608b77ccddc5 (diff) |
Fixes for choosing errors
Diffstat (limited to 'src/core/lib/surface')
-rw-r--r-- | src/core/lib/surface/call.c | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index 0d63ef051a..830795fc78 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -595,25 +595,46 @@ static grpc_call_error cancel_with_status(grpc_exec_ctx *exec_ctx, grpc_call *c, * FINAL STATUS CODE MANIPULATION */ +static void get_final_status_from(grpc_call *call, status_source from_source, + void (*set_value)(grpc_status_code code, + void *user_data), + void *set_value_user_data, + grpc_slice *details) { + grpc_status_code code; + const char *msg = NULL; + grpc_error_get_status(call->status[from_source].error, call->send_deadline, + &code, &msg, NULL); + + set_value(code, set_value_user_data); + if (details != NULL) { + *details = grpc_slice_from_copied_string(msg); + } +} + static void get_final_status(grpc_call *call, void (*set_value)(grpc_status_code code, void *user_data), void *set_value_user_data, grpc_slice *details) { int i; + /* search for the best status we can present: ideally the error we use has a + clearly defined grpc-status, and we'll prefer that. */ + for (i = 0; i < STATUS_SOURCE_COUNT; i++) { + if (call->status[i].is_set && + grpc_error_has_clear_grpc_status(call->status[i].error)) { + get_final_status_from(call, (status_source)i, set_value, + set_value_user_data, details); + return; + } + } + /* If no clearly defined status exists, search for 'anything' */ for (i = 0; i < STATUS_SOURCE_COUNT; i++) { if (call->status[i].is_set) { - grpc_status_code code; - const char *msg = NULL; - grpc_error_get_status(call->status[i].error, call->send_deadline, &code, - &msg, NULL); - - set_value(code, set_value_user_data); - if (details != NULL) { - *details = grpc_slice_from_copied_string(msg); - } + get_final_status_from(call, (status_source)i, set_value, + set_value_user_data, details); return; } } + /* If nothing exists, set some default */ if (call->is_client) { set_value(GRPC_STATUS_UNKNOWN, set_value_user_data); } else { |