HttpFault filter implementation.
| 56 | |
| 57 | /** HttpFault filter implementation. */ |
| 58 | final class FaultFilter implements Filter { |
| 59 | |
| 60 | private static final FaultFilter INSTANCE = |
| 61 | new FaultFilter(ThreadSafeRandomImpl.instance, new AtomicLong()); |
| 62 | |
| 63 | @VisibleForTesting |
| 64 | static final Metadata.Key<String> HEADER_DELAY_KEY = |
| 65 | Metadata.Key.of("x-envoy-fault-delay-request", Metadata.ASCII_STRING_MARSHALLER); |
| 66 | @VisibleForTesting |
| 67 | static final Metadata.Key<String> HEADER_DELAY_PERCENTAGE_KEY = |
| 68 | Metadata.Key.of("x-envoy-fault-delay-request-percentage", Metadata.ASCII_STRING_MARSHALLER); |
| 69 | @VisibleForTesting |
| 70 | static final Metadata.Key<String> HEADER_ABORT_HTTP_STATUS_KEY = |
| 71 | Metadata.Key.of("x-envoy-fault-abort-request", Metadata.ASCII_STRING_MARSHALLER); |
| 72 | @VisibleForTesting |
| 73 | static final Metadata.Key<String> HEADER_ABORT_GRPC_STATUS_KEY = |
| 74 | Metadata.Key.of("x-envoy-fault-abort-grpc-request", Metadata.ASCII_STRING_MARSHALLER); |
| 75 | @VisibleForTesting |
| 76 | static final Metadata.Key<String> HEADER_ABORT_PERCENTAGE_KEY = |
| 77 | Metadata.Key.of("x-envoy-fault-abort-request-percentage", Metadata.ASCII_STRING_MARSHALLER); |
| 78 | static final String TYPE_URL = |
| 79 | "type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault"; |
| 80 | |
| 81 | private final ThreadSafeRandom random; |
| 82 | private final AtomicLong activeFaultCounter; |
| 83 | |
| 84 | @VisibleForTesting |
| 85 | FaultFilter(ThreadSafeRandom random, AtomicLong activeFaultCounter) { |
| 86 | this.random = random; |
| 87 | this.activeFaultCounter = activeFaultCounter; |
| 88 | } |
| 89 | |
| 90 | static final class Provider implements Filter.Provider { |
| 91 | @Override |
| 92 | public String[] typeUrls() { |
| 93 | return new String[]{TYPE_URL}; |
| 94 | } |
| 95 | |
| 96 | @Override |
| 97 | public boolean isClientFilter() { |
| 98 | return true; |
| 99 | } |
| 100 | |
| 101 | @Override |
| 102 | public FaultFilter newInstance(String name) { |
| 103 | return INSTANCE; |
| 104 | } |
| 105 | |
| 106 | @Override |
| 107 | public ConfigOrError<FaultConfig> parseFilterConfig( |
| 108 | Message rawProtoMessage, FilterConfigParseContext context) { |
| 109 | HTTPFault httpFaultProto; |
| 110 | if (!(rawProtoMessage instanceof Any)) { |
| 111 | return ConfigOrError.fromError("Invalid config type: " + rawProtoMessage.getClass()); |
| 112 | } |
| 113 | Any anyMessage = (Any) rawProtoMessage; |
| 114 | try { |
| 115 | httpFaultProto = anyMessage.unpack(HTTPFault.class); |