signalapp/Signal-Server · warning · CallQualityInvalidArgumentsException
Call end reason not specified
Error message
Call end reason not specified
What it means
validateRequest in CallQualitySurveyManager rejects survey submissions whose callEndReason is null or blank. The end reason (e.g. hangup, timeout, declined) is required to interpret the survey response. The exception names the callEndReason field so the client knows what to supply.
Solutions
- Populate callEndReason with the actual termination reason before submitting
- Ensure all call-teardown code paths record a default end reason (e.g. local hangup)
- Validate the survey object on the client before the HTTP call
Example fix
// before
request.setCallEndReason(null);
// after
request.setCallEndReason("LOCAL_HANGUP"); Defensive patterns
Strategy: validation
Validate before calling
if (!request.callEndReason || request.callEndReason.trim() === '') { throw new Error('callEndReason must be a non-empty value'); } Type guard
const hasCallEndReason = (r) => typeof r.callEndReason === 'string' && r.callEndReason.trim().length > 0;
Try / catch
try { await submitCallQualitySurvey(request); } catch (CallQualityInvalidArgumentsException e) { if ('callEndReason'.equals(e.getField())) { request.setCallEndReason('UNKNOWN'); resubmit(); } } Prevention
- Guarantee every call teardown path records an end reason, defaulting to UNKNOWN
- Centralize end-reason assignment in the call manager
- Validate the survey object before submission
When it happens
Trigger: submitCallQualitySurvey invoked with a request whose getCallEndReason() returns null, empty, or whitespace.
Common situations: Clients that terminate calls through paths that never set an end reason; survey submitted after abnormal termination (network drop, app kill); API consumers hand-building request bodies.
Understand the failure class
Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.
Related errors
- Start timestamp not specified
- End timestamp not specified
- Call type not specified
- invalid captcha action
- Blank header
AI-assisted analysis of signalapp/Signal-Server@100ab61c82 (2026-09-09).
Data as JSON: /api/errors/636068bc4e1f8992.
Report an issue: GitHub.
Appendix: source
Thrown at service/src/main/java/org/whispersystems/textsecuregcm/metrics/CallQualitySurveyManager.java:173
});
}
@VisibleForTesting
static void validateRequest(final SubmitCallQualitySurveyRequest request) throws CallQualityInvalidArgumentsException {
if (request.getStartTimestamp() == 0) {
throw new CallQualityInvalidArgumentsException("Start timestamp not specified", "startTimestamp");
}
if (request.getEndTimestamp() == 0) {
throw new CallQualityInvalidArgumentsException("End timestamp not specified", "endTimestamp");
}
if (StringUtils.isBlank(request.getCallType())) {
throw new CallQualityInvalidArgumentsException("Call type not specified", "callType");
}
if (StringUtils.isBlank(request.getCallEndReason())) {
throw new CallQualityInvalidArgumentsException("Call end reason not specified", "callEndReason");
}
}
}
View on GitHub (pinned to 100ab61c82)