Skip to content

Commit 7556101

Browse files
authored
Align rate-limiting configuration with Server and Logging in ConfigLoader. (#110)
* Align rate-limiting configuration with Server and Logging in ConfigLoader.
1 parent 997b771 commit 7556101

File tree

2 files changed

+37
-8
lines changed

2 files changed

+37
-8
lines changed

src/main/java/org/juv25d/util/ConfigLoader.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.yaml.snakeyaml.Yaml;
44

55
import java.io.InputStream;
6+
import java.util.Collections;
67
import java.util.Map;
78

89
public class ConfigLoader {
@@ -64,14 +65,19 @@ private void loadConfiguration(InputStream input) {
6465
}
6566

6667
// rate-limiting
67-
Map<String, Object> rateLimitingConfig = (Map<String, Object>) config.get("rate-limiting");
68+
// defaults (consistent pattern)
69+
this.rateLimitingEnabled = false;
70+
71+
Map<String, Object> rateLimitingConfig = asStringObjectMap(config.get("rate-limiting"));
6872
if (rateLimitingConfig != null) {
69-
this.rateLimitingEnabled = (Boolean) rateLimitingConfig.getOrDefault("enabled", true);
70-
this.requestsPerMinute = ((Number) rateLimitingConfig.getOrDefault("requests-per-minute", 60L)).longValue();
71-
this.burstCapacity = ((Number) rateLimitingConfig.getOrDefault("burst-capacity", 100L)).longValue();
72-
} else {
73-
// rate-limiting is disabled if not present in the config file.
74-
this.rateLimitingEnabled = false;
73+
this.rateLimitingEnabled =
74+
Boolean.parseBoolean(String.valueOf(rateLimitingConfig.getOrDefault("enabled", false)));
75+
76+
this.requestsPerMinute =
77+
Long.parseLong(String.valueOf(rateLimitingConfig.getOrDefault("requests-per-minute", 60L)));
78+
79+
this.burstCapacity =
80+
Long.parseLong(String.valueOf(rateLimitingConfig.getOrDefault("burst-capacity", 100L)));
7581
}
7682

7783
} catch (Exception e) {
@@ -96,7 +102,7 @@ private static Map<String, Object> asStringObjectMap(Object value) {
96102
if (value instanceof Map<?, ?> map) {
97103
return (Map<String, Object>) map;
98104
}
99-
return null;
105+
return Collections.emptyMap();
100106
}
101107
public long getRequestsPerMinute() {
102108
return requestsPerMinute;

src/test/java/org/juv25d/util/ConfigLoaderTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.junit.jupiter.api.Test;
44

55
import java.io.ByteArrayInputStream;
6+
import java.io.InputStream;
67
import java.nio.charset.StandardCharsets;
78

89
import static org.junit.jupiter.api.Assertions.*;
@@ -24,6 +25,10 @@ void loadsValuesFromYaml() {
2425
root-dir: "public"
2526
logging:
2627
level: "DEBUG"
28+
rate-limiting:
29+
enabled: true
30+
requests-per-minute: 20
31+
burst-capacity: 10
2732
""";
2833

2934
ConfigLoader loader = new ConfigLoader(
@@ -33,6 +38,9 @@ void loadsValuesFromYaml() {
3338
assertEquals(9090, loader.getPort());
3439
assertEquals("public", loader.getRootDirectory());
3540
assertEquals("DEBUG", loader.getLogLevel());
41+
assertTrue(loader.isRateLimitingEnabled());
42+
assertEquals(20, loader.getRequestsPerMinute());
43+
assertEquals(10, loader.getBurstCapacity());
3644
}
3745

3846
/**
@@ -46,6 +54,7 @@ void usesDefaultsWhenServerKeysMissing() {
4654
String yaml = """
4755
server: {}
4856
logging: {}
57+
rate-limiting: {}
4958
""";
5059

5160
ConfigLoader loader = new ConfigLoader(
@@ -55,6 +64,7 @@ void usesDefaultsWhenServerKeysMissing() {
5564
assertEquals(8080, loader.getPort());
5665
assertEquals("static", loader.getRootDirectory());
5766
assertEquals("INFO", loader.getLogLevel());
67+
assertFalse(loader.isRateLimitingEnabled());
5868
}
5969

6070

@@ -67,5 +77,18 @@ void usesDefaultsWhenServerKeysMissing() {
6777
@Test void throwsWhenYamlMissing() {
6878
assertThrows(RuntimeException.class, () ->
6979
new ConfigLoader(null) ); }
80+
81+
@Test
82+
void shouldThrowWhenYamlIsMalformed() {
83+
String yaml = "server:\nBadYaml";
84+
InputStream input = new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8));
85+
86+
RuntimeException ex = assertThrows(RuntimeException.class,
87+
() -> new ConfigLoader(input));
88+
89+
assertTrue(ex.getMessage().contains("Failed to load application config"));
90+
}
7091
}
7192

93+
94+

0 commit comments

Comments
 (0)