The ClientAbortException thrown by Tomcat has a null message and therefore isn't picked up by the Call.isBroken. It might be worth recursively checking the cause see if the broken pipe has been wrapped:
boolean result = false;
if (exception.getMessage() != null) {
// ...
}
if (!result && exception.getCause() != null) {
result = isBroken(exception.getCause());
}
return result;