Skip to content

Commit ab5f6c8

Browse files
authored
Add disableRateLimits option to daemon (#1803)
1 parent 145f0c9 commit ab5f6c8

File tree

2 files changed

+45
-16
lines changed

2 files changed

+45
-16
lines changed

common/src/main/java/haveno/common/config/Config.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ public class Config {
119119
public static final String PASSWORD_REQUIRED = "passwordRequired";
120120
public static final String UPDATE_XMR_BINARIES = "updateXmrBinaries";
121121
public static final String XMR_BLOCKCHAIN_PATH = "xmrBlockchainPath";
122+
public static final String DISABLE_RATE_LIMITS = "disableRateLimits";
122123

123124
// Default values for certain options
124125
public static final int UNSPECIFIED_PORT = -1;
@@ -208,6 +209,7 @@ public enum UseTorForXmr {
208209
public final boolean passwordRequired;
209210
public final boolean updateXmrBinaries;
210211
public final String xmrBlockchainPath;
212+
public final boolean disableRateLimits;
211213

212214
// Properties derived from options but not exposed as options themselves
213215
public final File torDir;
@@ -639,6 +641,13 @@ public Config(String defaultAppName, File defaultUserDataDir, String... args) {
639641
.ofType(String.class)
640642
.defaultsTo("");
641643

644+
ArgumentAcceptingOptionSpec<Boolean> disableRateLimits =
645+
parser.accepts(DISABLE_RATE_LIMITS,
646+
"Disables all API rate limits")
647+
.withRequiredArg()
648+
.ofType(boolean.class)
649+
.defaultsTo(false);
650+
642651
try {
643652
CompositeOptionSet options = new CompositeOptionSet();
644653

@@ -753,6 +762,7 @@ public Config(String defaultAppName, File defaultUserDataDir, String... args) {
753762
this.passwordRequired = options.valueOf(passwordRequiredOpt);
754763
this.updateXmrBinaries = options.valueOf(updateXmrBinariesOpt);
755764
this.xmrBlockchainPath = options.valueOf(xmrBlockchainPathOpt);
765+
this.disableRateLimits = options.valueOf(disableRateLimits);
756766
} catch (OptionException ex) {
757767
throw new ConfigException("problem parsing option '%s': %s",
758768
ex.options().get(0),

daemon/src/main/java/haveno/daemon/grpc/GrpcServer.java

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,15 @@
2222
import haveno.common.config.Config;
2323
import haveno.core.api.CoreContext;
2424
import haveno.daemon.grpc.interceptor.PasswordAuthInterceptor;
25-
import io.grpc.Server;
26-
import io.grpc.ServerBuilder;
2725
import static io.grpc.ServerInterceptors.interceptForward;
2826
import java.io.IOException;
2927
import java.io.UncheckedIOException;
28+
import io.grpc.Metadata;
29+
import io.grpc.ServerCall;
30+
import io.grpc.ServerCallHandler;
31+
import io.grpc.ServerInterceptor;
32+
import io.grpc.Server;
33+
import io.grpc.ServerBuilder;
3034
import lombok.extern.slf4j.Slf4j;
3135

3236
@Singleton
@@ -55,26 +59,41 @@ public GrpcServer(CoreContext coreContext,
5559
GrpcXmrConnectionService moneroConnectionsService,
5660
GrpcXmrNodeService moneroNodeService) {
5761
this.server = ServerBuilder.forPort(config.apiPort)
58-
.addService(interceptForward(accountService, accountService.interceptors()))
59-
.addService(interceptForward(disputeAgentsService, disputeAgentsService.interceptors()))
60-
.addService(interceptForward(disputesService, disputesService.interceptors()))
61-
.addService(interceptForward(helpService, helpService.interceptors()))
62-
.addService(interceptForward(offersService, offersService.interceptors()))
63-
.addService(interceptForward(paymentAccountsService, paymentAccountsService.interceptors()))
64-
.addService(interceptForward(priceService, priceService.interceptors()))
6562
.addService(shutdownService)
66-
.addService(interceptForward(tradeStatisticsService, tradeStatisticsService.interceptors()))
67-
.addService(interceptForward(tradesService, tradesService.interceptors()))
68-
.addService(interceptForward(versionService, versionService.interceptors()))
69-
.addService(interceptForward(walletsService, walletsService.interceptors()))
70-
.addService(interceptForward(notificationsService, notificationsService.interceptors()))
71-
.addService(interceptForward(moneroConnectionsService, moneroConnectionsService.interceptors()))
72-
.addService(interceptForward(moneroNodeService, moneroNodeService.interceptors()))
7363
.intercept(passwordAuthInterceptor)
64+
.addService(interceptForward(accountService, config.disableRateLimits ? interceptors() : accountService.interceptors()))
65+
.addService(interceptForward(disputeAgentsService, config.disableRateLimits ? interceptors() : disputeAgentsService.interceptors()))
66+
.addService(interceptForward(disputesService, config.disableRateLimits ? interceptors() : disputesService.interceptors()))
67+
.addService(interceptForward(helpService, config.disableRateLimits ? interceptors() : helpService.interceptors()))
68+
.addService(interceptForward(offersService, config.disableRateLimits ? interceptors() : offersService.interceptors()))
69+
.addService(interceptForward(paymentAccountsService, config.disableRateLimits ? interceptors() : paymentAccountsService.interceptors()))
70+
.addService(interceptForward(priceService, config.disableRateLimits ? interceptors() : priceService.interceptors()))
71+
.addService(interceptForward(tradeStatisticsService, config.disableRateLimits ? interceptors() : tradeStatisticsService.interceptors()))
72+
.addService(interceptForward(tradesService, config.disableRateLimits ? interceptors() : tradesService.interceptors()))
73+
.addService(interceptForward(versionService, config.disableRateLimits ? interceptors() : versionService.interceptors()))
74+
.addService(interceptForward(walletsService, config.disableRateLimits ? interceptors() : walletsService.interceptors()))
75+
.addService(interceptForward(notificationsService, config.disableRateLimits ? interceptors() : notificationsService.interceptors()))
76+
.addService(interceptForward(moneroConnectionsService, config.disableRateLimits ? interceptors() : moneroConnectionsService.interceptors()))
77+
.addService(interceptForward(moneroNodeService, config.disableRateLimits ? interceptors() : moneroNodeService.interceptors()))
7478
.build();
79+
7580
coreContext.setApiUser(true);
7681
}
7782

83+
private ServerInterceptor[] interceptors() {
84+
return new ServerInterceptor[]{callLoggingInterceptor()};
85+
}
86+
87+
private ServerInterceptor callLoggingInterceptor() {
88+
return new ServerInterceptor() {
89+
@Override
90+
public <RequestT, ResponseT> ServerCall.Listener<RequestT> interceptCall(ServerCall<RequestT, ResponseT> call, Metadata headers, ServerCallHandler<RequestT, ResponseT> next) {
91+
log.debug("GRPC endpoint called: " + call.getMethodDescriptor().getFullMethodName());
92+
return next.startCall(call, headers);
93+
}
94+
};
95+
}
96+
7897
public void start() {
7998
try {
8099
server.start();

0 commit comments

Comments
 (0)